diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7edb0ba076..5e2fa80943 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -58,11 +58,17 @@ jobs: Linux-nuget- - name: Build run: dotnet build --configuration Release + - name: Enable Automated Test Artifact Uploads + uses: actions/github-script@v9 + with: + script: | + core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env['ACTIONS_RUNTIME_TOKEN']); + core.exportVariable('ACTIONS_RESULTS_URL', process.env['ACTIONS_RESULTS_URL']); - name: Core Tests run: | - dotnet test tests/Paramore.Brighter.Core.Tests/Paramore.Brighter.Core.Tests.csproj --filter "Fragile!=CI" -c Release --logger GitHubActions --no-restore --no-build --verbosity d - dotnet test tests/Paramore.Brighter.Extensions.Tests/Paramore.Brighter.Extensions.Tests.csproj -c Release --no-restore --logger GitHubActions --no-build --verbosity d - dotnet test tests/Paramore.Brighter.Transforms.Adaptors.Tests/Paramore.Brighter.Transforms.Adaptors.Tests.csproj -c Release --no-restore --logger GitHubActions --no-build --verbosity d + dotnet test --project tests/Paramore.Brighter.Core.Tests/Paramore.Brighter.Core.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" -c Release --no-restore --no-build --verbosity d + dotnet test --project tests/Paramore.Brighter.Extensions.Tests/Paramore.Brighter.Extensions.Tests.csproj -c Release --no-restore --no-build --verbosity d + dotnet test --project tests/Paramore.Brighter.Transforms.Adaptors.Tests/Paramore.Brighter.Transforms.Adaptors.Tests.csproj -c Release --no-restore --no-build --verbosity d - name: Upload packages as artifacts uses: actions/upload-artifact@v7 @@ -104,7 +110,7 @@ jobs: - name: Install dependencies run: dotnet restore - name: In Memory Transport Tests - run: dotnet test ./tests/Paramore.Brighter.InMemory.Tests/Paramore.Brighter.InMemory.Tests.csproj --filter "Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n + run: dotnet test --project ./tests/Paramore.Brighter.InMemory.Tests/Paramore.Brighter.InMemory.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" --configuration Release --blame -v n hangfire: runs-on: ubuntu-latest @@ -122,7 +128,7 @@ jobs: - name: Install dependencies run: dotnet restore - name: Hangfire Tests - run: dotnet test ./tests/Paramore.Brighter.Hangfire.Tests/Paramore.Brighter.Hangfire.Tests.csproj --filter "Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n + run: dotnet test --project ./tests/Paramore.Brighter.Hangfire.Tests/Paramore.Brighter.Hangfire.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" --configuration Release --blame -v n quartz: runs-on: ubuntu-latest @@ -140,7 +146,7 @@ jobs: - name: Install dependencies run: dotnet restore - name: Quartz Tests - run: dotnet test ./tests/Paramore.Brighter.Quartz.Tests/Paramore.Brighter.Quartz.Tests.csproj --filter "Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n + run: dotnet test --project ./tests/Paramore.Brighter.Quartz.Tests/Paramore.Brighter.Quartz.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" --configuration Release --blame -v n tickerq: runs-on: ubuntu-latest @@ -158,7 +164,7 @@ jobs: - name: Install dependencies run: dotnet restore - name: TickerQ Tests - run: dotnet test ./tests/Paramore.Brighter.TickerQ.Tests/Paramore.Brighter.TickerQ.Tests.csproj --filter "Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n + run: dotnet test --project ./tests/Paramore.Brighter.TickerQ.Tests/Paramore.Brighter.TickerQ.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" --configuration Release --blame -v n redis-ci: runs-on: ubuntu-latest @@ -190,7 +196,7 @@ jobs: - name: Install dependencies run: dotnet restore - name: Redis Transport Tests - run: dotnet test ./tests/Paramore.Brighter.Redis.Tests/Paramore.Brighter.Redis.Tests.csproj --filter "Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n + run: dotnet test --project ./tests/Paramore.Brighter.Redis.Tests/Paramore.Brighter.Redis.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" --configuration Release --blame -v n mqtt-ci: runs-on: ubuntu-latest @@ -215,7 +221,7 @@ jobs: - name: Install dependencies run: dotnet restore - name: MQTT Transport Tests - run: dotnet test ./tests/Paramore.Brighter.MQTT.Tests/Paramore.Brighter.MQTT.Tests.csproj --filter "Category=MQTT&Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n + run: dotnet test --project ./tests/Paramore.Brighter.MQTT.Tests/Paramore.Brighter.MQTT.Tests.csproj --treenode-filter "/*/*/*/*[Category=MQTT]&[Fragile!=CI]" --configuration Release --blame -v n rabbitmq-ci: runs-on: ubuntu-latest @@ -245,9 +251,9 @@ jobs: - name: Install dependencies run: dotnet restore - name: RMQ Async Transport Tests - run: dotnet test ./tests/Paramore.Brighter.RMQ.Async.Tests/Paramore.Brighter.RMQ.Async.Tests.csproj --filter "Fragile!=CI&Requires!=Docker-mTLS" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n + run: dotnet test --project ./tests/Paramore.Brighter.RMQ.Async.Tests/Paramore.Brighter.RMQ.Async.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]&[Requires!=Docker-mTLS]" --configuration Release --blame -v n - name: RMQ Sync Transport Tests - run: dotnet test ./tests/Paramore.Brighter.RMQ.Sync.Tests/Paramore.Brighter.RMQ.Sync.Tests.csproj --filter "Fragile!=CI&Requires!=Docker-mTLS" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n + run: dotnet test --project ./tests/Paramore.Brighter.RMQ.Sync.Tests/Paramore.Brighter.RMQ.Sync.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]&[Requires!=Docker-mTLS]" --configuration Release --blame -v n kafka-ci: runs-on: ubuntu-latest @@ -322,7 +328,7 @@ jobs: - name: Install dependencies run: dotnet restore - name: Kafka Transport Tests - run: dotnet test ./tests/Paramore.Brighter.Kafka.Tests/Paramore.Brighter.Kafka.Tests.csproj --filter "Category=Kafka&Category!=Confluent&Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n + run: dotnet test --project ./tests/Paramore.Brighter.Kafka.Tests/Paramore.Brighter.Kafka.Tests.csproj --treenode-filter "/*/*/*/*[Category=Kafka]&[Category!=Confluent]&[Fragile!=CI]" --configuration Release --blame -v n postgres-ci: runs-on: ubuntu-latest @@ -353,7 +359,7 @@ jobs: - name: Install dependencies run: dotnet restore - name: Postgres Tests - run: dotnet test ./tests/Paramore.Brighter.PostgresSQL.Tests/Paramore.Brighter.PostgresSQL.Tests.csproj --filter "Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n + run: dotnet test --project ./tests/Paramore.Brighter.PostgresSQL.Tests/Paramore.Brighter.PostgresSQL.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" --configuration Release --blame -v n sqlserver-ci: runs-on: ubuntu-latest @@ -379,7 +385,7 @@ jobs: - name: Install dependencies run: dotnet restore - name: MSSQL Tests - run: dotnet test ./tests/Paramore.Brighter.MSSQL.Tests/Paramore.Brighter.MSSQL.Tests.csproj --filter "Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n + run: dotnet test --project ./tests/Paramore.Brighter.MSSQL.Tests/Paramore.Brighter.MSSQL.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" --configuration Release --blame -v n mysql-ci: runs-on: ubuntu-latest @@ -414,7 +420,7 @@ jobs: sleep 1 done - name: MySQL Tests - run: dotnet test ./tests/Paramore.Brighter.MySQL.Tests/Paramore.Brighter.MySQL.Tests.csproj --filter "Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n + run: dotnet test --project ./tests/Paramore.Brighter.MySQL.Tests/Paramore.Brighter.MySQL.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" --configuration Release --blame -v n dynamo-ci: runs-on: ubuntu-latest @@ -439,8 +445,8 @@ jobs: run: dotnet restore - name: DynamoDB Tests run: | - dotnet test ./tests/Paramore.Brighter.DynamoDB.Tests/Paramore.Brighter.DynamoDB.Tests.csproj --filter "Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n - dotnet test ./tests/Paramore.Brighter.DynamoDB.V4.Tests/Paramore.Brighter.DynamoDB.V4.Tests.csproj --filter "Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n + dotnet test --project ./tests/Paramore.Brighter.DynamoDB.Tests/Paramore.Brighter.DynamoDB.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" --configuration Release --blame -v n + dotnet test --project ./tests/Paramore.Brighter.DynamoDB.V4.Tests/Paramore.Brighter.DynamoDB.V4.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" --configuration Release --blame -v n localstack-ci: runs-on: ubuntu-latest @@ -477,8 +483,8 @@ jobs: Linux-nuget- - name: AWS Tests run: | - dotnet test ./tests/Paramore.Brighter.AWS.Tests/Paramore.Brighter.AWS.Tests.csproj --filter "Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n - dotnet test ./tests/Paramore.Brighter.AWS.V4.Tests/Paramore.Brighter.AWS.V4.Tests.csproj --filter "Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n + dotnet test --project ./tests/Paramore.Brighter.AWS.Tests/Paramore.Brighter.AWS.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" --configuration Release --blame -v n + dotnet test --project ./tests/Paramore.Brighter.AWS.V4.Tests/Paramore.Brighter.AWS.V4.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" --configuration Release --blame -v n aws-ci: runs-on: ubuntu-latest @@ -511,8 +517,8 @@ jobs: aws-region: eu-west-1 - name: AWS SNS, SQS and S3 Tests run: | - dotnet test ./tests/Paramore.Brighter.AWS.Tests/Paramore.Brighter.AWS.Tests.csproj --filter "Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n - dotnet test ./tests/Paramore.Brighter.AWS.V4.Tests/Paramore.Brighter.AWS.V4.Tests.csproj --filter "Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n + dotnet test --project ./tests/Paramore.Brighter.AWS.Tests/Paramore.Brighter.AWS.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" --configuration Release --blame -v n + dotnet test --project ./tests/Paramore.Brighter.AWS.V4.Tests/Paramore.Brighter.AWS.V4.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" --configuration Release --blame -v n - name: Cleanup orphaned test resources if: always() run: | @@ -551,8 +557,8 @@ jobs: aws-region: eu-west-1 - name: Scheduler Tests run: | - dotnet test ./tests/Paramore.Brighter.AWSScheduler.Tests/Paramore.Brighter.AWSScheduler.Tests.csproj --filter "Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n - dotnet test ./tests/Paramore.Brighter.AWSScheduler.V4.Tests/Paramore.Brighter.AWSScheduler.V4.Tests.csproj --filter "Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n + dotnet test --project ./tests/Paramore.Brighter.AWSScheduler.Tests/Paramore.Brighter.AWSScheduler.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" --configuration Release --blame -v n + dotnet test --project ./tests/Paramore.Brighter.AWSScheduler.V4.Tests/Paramore.Brighter.AWSScheduler.V4.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" --configuration Release --blame -v n - name: Cleanup orphaned test resources if: always() run: | @@ -576,7 +582,7 @@ jobs: - name: Install dependencies run: dotnet restore - name: Sqlite Tests - run: dotnet test ./tests/Paramore.Brighter.Sqlite.Tests/Paramore.Brighter.Sqlite.Tests.csproj --filter "Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n + run: dotnet test --project ./tests/Paramore.Brighter.Sqlite.Tests/Paramore.Brighter.Sqlite.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" --configuration Release --blame -v n azure-ci: runs-on: ubuntu-latest @@ -598,7 +604,7 @@ jobs: - name: Install dependencies run: dotnet restore - name: Azure Tests - run: dotnet test ./tests/Paramore.Brighter.AzureServiceBus.Tests/Paramore.Brighter.AzureServiceBus.Tests.csproj --filter "Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n + run: dotnet test --project ./tests/Paramore.Brighter.AzureServiceBus.Tests/Paramore.Brighter.AzureServiceBus.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" --configuration Release --blame -v n mongodb-ci: runs-on: ubuntu-latest @@ -630,7 +636,7 @@ jobs: - name: Install dependencies run: dotnet restore - name: MongoDB Tests - run: dotnet test ./tests/Paramore.Brighter.MongoDb.Tests/Paramore.Brighter.MongoDb.Tests.csproj --filter "Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n + run: dotnet test --project ./tests/Paramore.Brighter.MongoDb.Tests/Paramore.Brighter.MongoDb.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" --configuration Release --blame -v n gcp-ci: runs-on: ubuntu-latest @@ -667,7 +673,7 @@ jobs: run: dotnet restore - name: GCP Tests - run: dotnet test ./tests/Paramore.Brighter.Gcp.Tests/Paramore.Brighter.Gcp.Tests.csproj --filter "Category!=Spanner&Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --logger GitHubActions --blame -v n + run: dotnet test --project ./tests/Paramore.Brighter.Gcp.Tests/Paramore.Brighter.Gcp.Tests.csproj --treenode-filter "/*/*/*/*[Category!=Spanner]&[Fragile!=CI]" --configuration Release --blame -v n # TODO: Rafael Andrade is working on how to run RocketMQ on GHA # rocketmq-ci: @@ -731,4 +737,4 @@ jobs: # run: dotnet restore # # - name: RocketMQ Tests -# run: dotnet test ./tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests.csproj --filter "Fragile!=CI" --configuration Release --logger "console;verbosity=normal" --blame -v n +# run: dotnet test --project ./tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests.csproj --treenode-filter "/*/*/*/*[Fragile!=CI]" --configuration Release --blame -v n diff --git a/Directory.Packages.props b/Directory.Packages.props index 749ad4b279..a5ba6af373 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -86,6 +86,7 @@ + @@ -140,15 +141,8 @@ - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - + - - @@ -194,4 +188,4 @@ runtime; build; native; contentfiles; analyzers - \ No newline at end of file + diff --git a/global.json b/global.json new file mode 100644 index 0000000000..3140116df3 --- /dev/null +++ b/global.json @@ -0,0 +1,5 @@ +{ + "test": { + "runner": "Microsoft.Testing.Platform" + } +} diff --git a/samples/TaskQueue/AWSTaskQueue/GreetingsSender/Program.cs b/samples/TaskQueue/AWSTaskQueue/GreetingsSender/Program.cs index 1e41161000..2de4adae1c 100644 --- a/samples/TaskQueue/AWSTaskQueue/GreetingsSender/Program.cs +++ b/samples/TaskQueue/AWSTaskQueue/GreetingsSender/Program.cs @@ -63,7 +63,7 @@ static async Task Main(string[] args) } }); - var producerRegistry = new SnsProducerRegistryFactory( + var producerRegistry = await new SnsProducerRegistryFactory( awsConnection, [ new SnsPublication @@ -79,7 +79,7 @@ static async Task Main(string[] args) } } ] - ).Create(); + ).CreateAsync(); serviceCollection .AddBrighter() diff --git a/src/Paramore.Brighter.MessagingGateway.AWSSQS.V4/SqsMessageConsumer.cs b/src/Paramore.Brighter.MessagingGateway.AWSSQS.V4/SqsMessageConsumer.cs index 5fa6a6b3db..10c079fafb 100644 --- a/src/Paramore.Brighter.MessagingGateway.AWSSQS.V4/SqsMessageConsumer.cs +++ b/src/Paramore.Brighter.MessagingGateway.AWSSQS.V4/SqsMessageConsumer.cs @@ -435,12 +435,12 @@ public async ValueTask DisposeAsync() if (_deadLetterProducer?.IsValueCreated == true && _deadLetterProducer.Value is IAsyncDisposable deadLetterAsync) await deadLetterAsync.DisposeAsync(); else if (_deadLetterProducer?.IsValueCreated == true) - _deadLetterProducer.Value?.Dispose(); + await _deadLetterProducer.Value!.DisposeAsync(); if (_invalidMessageProducer?.IsValueCreated == true && _invalidMessageProducer.Value is IAsyncDisposable invalidAsync) await invalidAsync.DisposeAsync(); else if (_invalidMessageProducer?.IsValueCreated == true) - _invalidMessageProducer.Value?.Dispose(); + await _invalidMessageProducer.Value!.DisposeAsync(); GC.SuppressFinalize(this); } diff --git a/src/Paramore.Brighter.MessagingGateway.AWSSQS/SqsMessageConsumer.cs b/src/Paramore.Brighter.MessagingGateway.AWSSQS/SqsMessageConsumer.cs index 04dd0e7d83..1100b8a2f3 100644 --- a/src/Paramore.Brighter.MessagingGateway.AWSSQS/SqsMessageConsumer.cs +++ b/src/Paramore.Brighter.MessagingGateway.AWSSQS/SqsMessageConsumer.cs @@ -442,12 +442,12 @@ public async ValueTask DisposeAsync() if (_deadLetterProducer?.IsValueCreated == true && _deadLetterProducer.Value is IAsyncDisposable deadLetterAsync) await deadLetterAsync.DisposeAsync(); else if (_deadLetterProducer?.IsValueCreated == true) - _deadLetterProducer.Value?.Dispose(); + await _deadLetterProducer.Value!.DisposeAsync(); if (_invalidMessageProducer?.IsValueCreated == true && _invalidMessageProducer.Value is IAsyncDisposable invalidAsync) await invalidAsync.DisposeAsync(); else if (_invalidMessageProducer?.IsValueCreated == true) - _invalidMessageProducer.Value?.Dispose(); + await _invalidMessageProducer.Value!.DisposeAsync(); GC.SuppressFinalize(this); } diff --git a/src/Paramore.Brighter/PipelineBuilder.cs b/src/Paramore.Brighter/PipelineBuilder.cs index 2d0eab5e65..4d52c8ec9f 100644 --- a/src/Paramore.Brighter/PipelineBuilder.cs +++ b/src/Paramore.Brighter/PipelineBuilder.cs @@ -45,9 +45,10 @@ public partial class PipelineBuilder : IAmAPipelineBuilder, private readonly InboxConfiguration? _inboxConfiguration; private readonly IAmAHandlerFactoryAsync? _asyncHandlerFactory; private readonly List _instanceScopes = new List(); - //GLOBAL! cache of handler attributes - won't change post-startup so avoid re-calculation. Method to clear cache below (if a broken test brought you here) - private static readonly ConcurrentDictionary> s_preAttributesMemento = new ConcurrentDictionary>(); - private static readonly ConcurrentDictionary> s_postAttributesMemento = new ConcurrentDictionary>(); + //GLOBAL cache of handler attributes — derived from reflection so immutable post-startup. + //Values are materialized into IReadOnlyList<> so concurrent reads are thread-safe. + private static readonly ConcurrentDictionary> s_preAttributesMemento = new ConcurrentDictionary>(); + private static readonly ConcurrentDictionary> s_postAttributesMemento = new ConcurrentDictionary>(); /// /// Used to build a pipeline of handlers from the target handler and the attributes on that @@ -272,32 +273,48 @@ private IHandleRequests BuildPipeline(RequestHandler implici implicitHandler.Context = requestContext; - if (!s_preAttributesMemento.TryGetValue(implicitHandler.Name.ToString(), - out IOrderedEnumerable? preAttributes)) + IReadOnlyList? preAttributes = null; + var shouldCachePreAttributes = _inboxConfiguration == null; + + if (shouldCachePreAttributes) + { + s_preAttributesMemento.TryGetValue(implicitHandler.Name.ToString(), + out preAttributes); + } + + if (preAttributes is null) { - preAttributes = + var orderedPreAttributes = implicitHandler.FindHandlerMethod() .GetOtherHandlersInPipeline() .Where(attribute => attribute.Timing == HandlerTiming.Before) .OrderByDescending(attribute => attribute.Step); - AddGlobalInboxAttributes(ref preAttributes, implicitHandler); + AddGlobalInboxAttributes(ref orderedPreAttributes, implicitHandler); - s_preAttributesMemento.TryAdd(implicitHandler.Name.ToString(), preAttributes); + preAttributes = orderedPreAttributes.ToList().AsReadOnly(); + if (shouldCachePreAttributes) + { + s_preAttributesMemento.TryAdd(implicitHandler.Name.ToString(), preAttributes); + } } var firstInPipeline = PushOntoPipeline(preAttributes, implicitHandler, requestContext, instanceScope); if (!s_postAttributesMemento.TryGetValue(implicitHandler.Name.ToString(), - out IOrderedEnumerable? postAttributes)) + out IReadOnlyList? postAttributes)) { postAttributes = implicitHandler.FindHandlerMethod() .GetOtherHandlersInPipeline() .Where(attribute => attribute.Timing == HandlerTiming.After) - .OrderByDescending(attribute => attribute.Step); + .OrderByDescending(attribute => attribute.Step) + .ToList() + .AsReadOnly(); + + s_postAttributesMemento.TryAdd(implicitHandler.Name.ToString(), postAttributes); } AppendToPipeline(postAttributes, implicitHandler, requestContext, instanceScope); @@ -315,29 +332,45 @@ private IHandleRequestsAsync BuildAsyncPipeline(RequestHandlerAsync? preAttributes)) + IReadOnlyList? preAttributes = null; + var shouldCachePreAttributes = _inboxConfiguration == null; + + if (shouldCachePreAttributes) + { + s_preAttributesMemento.TryGetValue(implicitHandler.Name.ToString(), out preAttributes); + } + + if (preAttributes is null) { - preAttributes = + var orderedPreAttributes = implicitHandler.FindHandlerMethod() .GetOtherHandlersInPipeline() .Where(attribute => attribute.Timing == HandlerTiming.Before) .OrderByDescending(attribute => attribute.Step); - AddGlobalInboxAttributesAsync(ref preAttributes, implicitHandler); + AddGlobalInboxAttributesAsync(ref orderedPreAttributes, implicitHandler); - s_preAttributesMemento.TryAdd(implicitHandler.Name.ToString(), preAttributes); + preAttributes = orderedPreAttributes.ToList().AsReadOnly(); + if (shouldCachePreAttributes) + { + s_preAttributesMemento.TryAdd(implicitHandler.Name.ToString(), preAttributes); + } } var firstInPipeline = PushOntoAsyncPipeline(preAttributes, implicitHandler, requestContext, instanceScope, continueOnCapturedContext); - if (!s_postAttributesMemento.TryGetValue(implicitHandler.Name.ToString(), out IOrderedEnumerable? postAttributes)) + if (!s_postAttributesMemento.TryGetValue(implicitHandler.Name.ToString(), out IReadOnlyList? postAttributes)) { postAttributes = implicitHandler.FindHandlerMethod() .GetOtherHandlersInPipeline() .Where(attribute => attribute.Timing == HandlerTiming.After) - .OrderByDescending(attribute => attribute.Step); + .OrderByDescending(attribute => attribute.Step) + .ToList() + .AsReadOnly(); + + s_postAttributesMemento.TryAdd(implicitHandler.Name.ToString(), postAttributes); } AppendToAsyncPipeline(postAttributes, implicitHandler, requestContext, instanceScope); diff --git a/src/Paramore.Brighter/RequestHandler.cs b/src/Paramore.Brighter/RequestHandler.cs index c4a1ed0804..420ed5bce1 100644 --- a/src/Paramore.Brighter/RequestHandler.cs +++ b/src/Paramore.Brighter/RequestHandler.cs @@ -73,6 +73,9 @@ public abstract partial class RequestHandler(InstrumentationOptions in /// The successor. public void SetSuccessor(IHandleRequests successor) { + if (this == successor) + return; + _successor = successor; } diff --git a/src/Paramore.Brighter/TransformPipelineBuilder.cs b/src/Paramore.Brighter/TransformPipelineBuilder.cs index 3329b35205..bdf1683e4a 100644 --- a/src/Paramore.Brighter/TransformPipelineBuilder.cs +++ b/src/Paramore.Brighter/TransformPipelineBuilder.cs @@ -53,12 +53,13 @@ public partial class TransformPipelineBuilder private readonly IAmAMessageTransformerFactory _messageTransformerFactory; private readonly InstrumentationOptions _instrumentationOptions; - //GLOBAL! Cache of message mapper transform attributes. This will not be recalculated post start up. Method to clear cache below (if a broken test brought you here). - private static readonly ConcurrentDictionary> s_wrapTransformsMemento = - new ConcurrentDictionary>(); + //GLOBAL cache of message mapper transform attributes — derived from reflection so immutable post-startup. + //Values are materialized into IReadOnlyList<> so concurrent reads are thread-safe. + private static readonly ConcurrentDictionary> s_wrapTransformsMemento = + new ConcurrentDictionary>(); - private static readonly ConcurrentDictionary> s_unWrapTransformsMemento = - new ConcurrentDictionary>(); + private static readonly ConcurrentDictionary> s_unWrapTransformsMemento = + new ConcurrentDictionary>(); /// /// Creates an instance of a transform pipeline builder. @@ -220,6 +221,9 @@ private IEnumerable BuildTransformPipeline(IEnum return new TransformPipelineDescription(mapperType, isDefault, wrapTransforms, unwrapTransforms); } + /// + /// Clears any cached transform pipeline definitions. + /// public static void ClearPipelineCache() { s_wrapTransformsMemento.Clear(); @@ -233,14 +237,16 @@ private IAmAMessageMapper FindMessageMapper() where TRequest return messageMapper; } - private IOrderedEnumerable FindWrapTransforms(IAmAMessageMapper messageMapper) where T : class, IRequest + private IReadOnlyList FindWrapTransforms(IAmAMessageMapper messageMapper) where T : class, IRequest { var key = messageMapper.GetType().Name; - if (!s_wrapTransformsMemento.TryGetValue(key, out IOrderedEnumerable? transformAttributes)) + if (!s_wrapTransformsMemento.TryGetValue(key, out IReadOnlyList? transformAttributes)) { transformAttributes = FindMapToMessage(messageMapper) .GetOtherWrapsInPipeline() - .OrderByDescending(attribute => attribute.Step); + .OrderByDescending(attribute => attribute.Step) + .ToList() + .AsReadOnly(); s_wrapTransformsMemento.TryAdd(key, transformAttributes); } @@ -248,14 +254,16 @@ private IOrderedEnumerable FindWrapTransforms(IAmAMessageM return transformAttributes; } - private IOrderedEnumerable FindUnwrapTransforms(IAmAMessageMapper messageMapper) where T : class, IRequest + private IReadOnlyList FindUnwrapTransforms(IAmAMessageMapper messageMapper) where T : class, IRequest { var key = messageMapper.GetType().Name; - if (!s_unWrapTransformsMemento.TryGetValue(key, out IOrderedEnumerable? transformAttributes)) + if (!s_unWrapTransformsMemento.TryGetValue(key, out IReadOnlyList? transformAttributes)) { transformAttributes = FindMapToRequest(messageMapper) .GetOtherUnwrapsInPipeline() - .OrderByDescending(attribute => attribute.Step); + .OrderByDescending(attribute => attribute.Step) + .ToList() + .AsReadOnly(); s_unWrapTransformsMemento.TryAdd(key, transformAttributes); } diff --git a/src/Paramore.Brighter/TransformPipelineBuilderAsync.cs b/src/Paramore.Brighter/TransformPipelineBuilderAsync.cs index 1934bd203e..dca503a5eb 100644 --- a/src/Paramore.Brighter/TransformPipelineBuilderAsync.cs +++ b/src/Paramore.Brighter/TransformPipelineBuilderAsync.cs @@ -53,12 +53,13 @@ public partial class TransformPipelineBuilderAsync private readonly IAmAMessageTransformerFactoryAsync _messageTransformerFactoryAsync; private readonly InstrumentationOptions _instrumentationOptions; - //GLOBAL! Cache of message mapper transform attributes. This will not be recalculated post start up. Method to clear cache below (if a broken test brought you here). - private static readonly ConcurrentDictionary> s_wrapTransformsMemento = - new ConcurrentDictionary>(); + //GLOBAL cache of message mapper transform attributes — derived from reflection so immutable post-startup. + //Values are materialized into IReadOnlyList<> so concurrent reads are thread-safe. + private static readonly ConcurrentDictionary> s_wrapTransformsMemento = + new ConcurrentDictionary>(); - private static readonly ConcurrentDictionary> s_unWrapTransformsMemento = - new ConcurrentDictionary>(); + private static readonly ConcurrentDictionary> s_unWrapTransformsMemento = + new ConcurrentDictionary>(); /// /// Creates an instance of a transform pipeline builder. @@ -183,6 +184,9 @@ private IEnumerable BuildTransformPipeline( return transforms; } + /// + /// Clears any cached async transform pipeline definitions. + /// public static void ClearPipelineCache() { s_wrapTransformsMemento.Clear(); @@ -196,20 +200,38 @@ private IAmAMessageMapperAsync FindMessageMapper() where TRe return messageMapper; } - private IOrderedEnumerable FindWrapTransforms(IAmAMessageMapperAsync messageMapper) where T : class, IRequest + private IReadOnlyList FindWrapTransforms(IAmAMessageMapperAsync messageMapper) where T : class, IRequest { var key = messageMapper.GetType().Name; - return s_wrapTransformsMemento.GetOrAdd(key, s => FindMapToMessage(messageMapper) - .GetOtherWrapsInPipeline() - .OrderByDescending(attribute => attribute.Step)); + if (!s_wrapTransformsMemento.TryGetValue(key, out IReadOnlyList? transformAttributes)) + { + transformAttributes = FindMapToMessage(messageMapper) + .GetOtherWrapsInPipeline() + .OrderByDescending(attribute => attribute.Step) + .ToList() + .AsReadOnly(); + + s_wrapTransformsMemento.TryAdd(key, transformAttributes); + } + + return transformAttributes; } - private IOrderedEnumerable FindUnwrapTransforms(IAmAMessageMapperAsync messageMapper) where T : class, IRequest + private IReadOnlyList FindUnwrapTransforms(IAmAMessageMapperAsync messageMapper) where T : class, IRequest { var key = messageMapper.GetType().Name; - return s_unWrapTransformsMemento.GetOrAdd(key, s => FindMapToRequest(messageMapper) - .GetOtherUnwrapsInPipeline() - .OrderByDescending(attribute => attribute.Step)); + if (!s_unWrapTransformsMemento.TryGetValue(key, out IReadOnlyList? transformAttributes)) + { + transformAttributes = FindMapToRequest(messageMapper) + .GetOtherUnwrapsInPipeline() + .OrderByDescending(attribute => attribute.Step) + .ToList() + .AsReadOnly(); + + s_unWrapTransformsMemento.TryAdd(key, transformAttributes); + } + + return transformAttributes; } private MethodInfo FindMapToMessage(IAmAMessageMapperAsync messageMapper) where TRequest : class, IRequest diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index b7c2d28040..cf830843ec 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -1,10 +1,14 @@ false + enable net9.0;net10.0 net9.0 true false false + + + diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs index d7e7bd9022..d5119c0365 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs @@ -6,23 +6,23 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsBufferedConsumerTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsBufferedConsumerTestsAsync : IAsyncDisposable { - private readonly SnsMessageProducer _messageProducer; - private readonly SqsMessageConsumer _consumer; - private readonly string _topicName; - private readonly ChannelFactory _channelFactory; + private SnsMessageProducer _messageProducer; + private SqsMessageConsumer _consumer; + private string _topicName; + private ChannelFactory _channelFactory; private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; private const int MessageCount = 4; - public SqsBufferedConsumerTestsAsync() + [Before(Test)] + public async Task Setup() { var awsConnection = GatewayFactory.CreateFactory(); @@ -34,7 +34,7 @@ public SqsBufferedConsumerTestsAsync() //we need the channel to create the queues and notifications var routingKey = new RoutingKey(_topicName); - var channel = _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( + var channel = await _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( subscriptionName: new SubscriptionName(channelName), channelName: new ChannelName(channelName), channelType: ChannelType.PubSub, @@ -45,9 +45,9 @@ public SqsBufferedConsumerTestsAsync() type: SqsType.Fifo, deduplicationScope: DeduplicationScope.MessageGroup, fifoThroughputLimit: FifoThroughputLimit.PerMessageGroupId, - tags: new Dictionary { { "Environment", "Test" } }), + tags: new Dictionary { { "Environment", "Test" } }), topicAttributes: topicAttributes, - makeChannels: OnMissingChannel.Create)).GetAwaiter().GetResult(); + makeChannels: OnMissingChannel.Create)); //we want to access via a consumer, to receive multiple messages - we don't want to expose on channel //just for the tests, so create a new consumer from the properties @@ -59,7 +59,7 @@ public SqsBufferedConsumerTestsAsync() }); } - [Fact] + [Test] public async Task When_a_message_consumer_reads_multiple_messages_async() { var routingKey = new RoutingKey(_topicName); @@ -121,10 +121,10 @@ public async Task When_a_message_consumer_reads_multiple_messages_async() //retrieve messages var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.True(messages.Length <= outstandingMessageCount); + await Assert.That(messages.Length <= outstandingMessageCount).IsTrue(); //should not receive more than buffer in one hit - Assert.True(messages.Length <= BufferSize); + await Assert.That(messages.Length <= BufferSize).IsTrue(); var moreMessages = messages.Where(m => m.Header.MessageType == MessageType.MT_COMMAND); foreach (var message in moreMessages) @@ -138,7 +138,7 @@ public async Task When_a_message_consumer_reads_multiple_messages_async() await Task.Delay(1000); } while ((iteration <= 5) && (messagesReceivedCount < MessageCount)); - Assert.Equal(4, messagesReceivedCount); + await Assert.That(messagesReceivedCount).IsEqualTo(4); } public async ValueTask DisposeAsync() @@ -148,10 +148,11 @@ public async ValueTask DisposeAsync() await _messageProducer.DisposeAsync(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().GetAwaiter().GetResult(); - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _messageProducer.DisposeAsync().GetAwaiter().GetResult(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } } diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infastructure_exists_can_assume_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infastructure_exists_can_assume_async.cs index 631db07251..ddf39df1d8 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infastructure_exists_can_assume_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infastructure_exists_can_assume_async.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -public class AwsAssumeInfrastructureTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsAssumeInfrastructureTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly SqsMessageConsumer _consumer; @@ -65,7 +64,7 @@ public AwsAssumeInfrastructureTestsAsync() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName(true)); } - [Fact] + [Test] public async Task When_infastructure_exists_can_assume() { //arrange @@ -75,17 +74,18 @@ public async Task When_infastructure_exists_can_assume() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infrastructure_exists_can_verify_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infrastructure_exists_can_verify_async.cs index 9dd1659119..5b864dd047 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infrastructure_exists_can_verify_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infrastructure_exists_can_verify_async.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -public class AwsValidateInfrastructureTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsValidateInfrastructureTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerAsync _consumer; @@ -71,7 +70,7 @@ public AwsValidateInfrastructureTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify_async() { await _messageProducer.SendAsync(_message); @@ -81,18 +80,19 @@ public async Task When_infrastructure_exists_can_verify_async() var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); ((IAmAMessageConsumerSync)_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infrastructure_exists_can_verify_by_arn_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infrastructure_exists_can_verify_by_arn_async.cs index 88efb6bceb..ef47cbedac 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infrastructure_exists_can_verify_by_arn_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infrastructure_exists_can_verify_by_arn_async.cs @@ -7,21 +7,21 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -public class AwsValidateInfrastructureByArnTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +public class AwsValidateInfrastructureByArnTestsAsync : IAsyncDisposable { - private readonly Message _message; - private readonly IAmAMessageConsumerAsync _consumer; - private readonly SnsMessageProducer _messageProducer; - private readonly ChannelFactory _channelFactory; - private readonly MyCommand _myCommand; - - public AwsValidateInfrastructureByArnTestsAsync() + private Message _message; + private IAmAMessageConsumerAsync _consumer; + private SnsMessageProducer _messageProducer; + private ChannelFactory _channelFactory; + private MyCommand _myCommand; + + [Before(Test)] + public async Task Setup() { _myCommand = new MyCommand { Value = "Test" }; const string replyTo = "http:\\queueUrl"; @@ -37,9 +37,9 @@ public AwsValidateInfrastructureByArnTestsAsync() channelName: new ChannelName(channelName), channelType: ChannelType.PubSub, routingKey: routingKey, - queueAttributes: new SqsAttributes(type: SqsType.Fifo, tags: new Dictionary { { "Environment", "Test" } }), + queueAttributes: new SqsAttributes(type: SqsType.Fifo, tags: new Dictionary { { "Environment", "Test" } }), topicAttributes: topicAttributes, - messagePumpType: MessagePumpType.Proactor, + messagePumpType: MessagePumpType.Proactor, makeChannels: OnMissingChannel.Create); _message = new Message( @@ -51,9 +51,9 @@ public AwsValidateInfrastructureByArnTestsAsync() var awsConnection = GatewayFactory.CreateFactory(); _channelFactory = new ChannelFactory(awsConnection); - var channel = _channelFactory.CreateAsyncChannel(subscription); + var channel = await _channelFactory.CreateAsyncChannelAsync(subscription); - var topicArn = FindTopicArn(awsConnection, routingKey.ToValidSNSTopicName(true)).Result; + var topicArn = await FindTopicArn(awsConnection, routingKey.ToValidSNSTopicName(true)); var routingKeyArn = new RoutingKey(topicArn); subscription.MakeChannels = OnMissingChannel.Validate; @@ -74,7 +74,7 @@ public AwsValidateInfrastructureByArnTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify_async() { await _messageProducer.SendAsync(_message); @@ -84,7 +84,7 @@ public async Task When_infrastructure_exists_can_verify_async() var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); await _consumer.AcknowledgeAsync(message); } @@ -96,13 +96,14 @@ private static async Task FindTopicArn(AWSMessagingGatewayConnection con return topicResponse.TopicArn; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); ((IAmAMessageConsumerSync)_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs index 97e94fafad..5d1309051e 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerSendAsyncTests : IAsyncDisposable, IDisposable +[Category("AWS")] +public class SqsMessageProducerSendAsyncTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -72,7 +71,7 @@ public SqsMessageProducerSendAsyncTests() }); } - [Fact] + [Test] public async Task When_posting_a_message_via_the_producer_async() { // arrange @@ -87,34 +86,35 @@ public async Task When_posting_a_message_via_the_producer_async() await _channel.AcknowledgeAsync(message); // should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_topicName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_topicName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); // allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); // {"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); - Assert.Equal(_messageGroupId, message.Header.PartitionKey); - Assert.Contains(HeaderNames.DeduplicationId, message.Header.Bag); - Assert.Equal(_deduplicationId, message.Header.Bag[HeaderNames.DeduplicationId]); + await Assert.That(message.Header.PartitionKey).IsEqualTo(_messageGroupId); + await Assert.That(message.Header.Bag).ContainsKey(HeaderNames.DeduplicationId); + await Assert.That(message.Header.Bag[HeaderNames.DeduplicationId]).IsEqualTo(_deduplicationId); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_queues_missing_assume_throws_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_queues_missing_assume_throws_async.cs index 630c07f4f1..b4ba083269 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_queues_missing_assume_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_queues_missing_assume_throws_async.cs @@ -4,18 +4,18 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -public class AwsAssumeQueuesTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +public class AwsAssumeQueuesTestsAsync : IAsyncDisposable { - private readonly ChannelFactory _channelFactory; - private readonly IAmAMessageConsumerAsync _consumer; + private ChannelFactory _channelFactory; + private IAmAMessageConsumerAsync _consumer; - public AwsAssumeQueuesTestsAsync() + [Before(Test)] + public async Task Setup() { var channelName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); string topicName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); @@ -27,9 +27,9 @@ public AwsAssumeQueuesTestsAsync() channelName: new ChannelName(channelName), channelType: ChannelType.PubSub, routingKey: routingKey, - queueAttributes: new SqsAttributes( type:SqsType.Fifo, tags: new Dictionary { { "Environment", "Test" } }), + queueAttributes: new SqsAttributes( type:SqsType.Fifo, tags: new Dictionary { { "Environment", "Test" } }), topicAttributes: topicAttributes, - messagePumpType: MessagePumpType.Proactor, + messagePumpType: MessagePumpType.Proactor, makeChannels: OnMissingChannel.Assume); var awsConnection = GatewayFactory.CreateFactory(); @@ -42,16 +42,16 @@ public AwsAssumeQueuesTestsAsync() MakeChannels = OnMissingChannel.Create, TopicAttributes = topicAttributes }); - producer.ConfirmTopicExistsAsync(topicName).Wait(); + await producer.ConfirmTopicExistsAsync(topicName); _channelFactory = new ChannelFactory(awsConnection); - var channel = _channelFactory.CreateAsyncChannel(subscription); + var channel = await _channelFactory.CreateAsyncChannelAsync(subscription); //We need to create the topic at least, to check the queues _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_queues_missing_assume_throws_async() { //we will try to get the queue url, and fail because it does not exist @@ -59,9 +59,10 @@ await Assert.ThrowsAsync(async () => await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_queues_missing_verify_throws_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_queues_missing_verify_throws_async.cs index 25099f5f78..f76148edfe 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_queues_missing_verify_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_queues_missing_verify_throws_async.cs @@ -4,19 +4,19 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AwsValidateQueuesTestsAsync : IAsyncDisposable { - private readonly AWSMessagingGatewayConnection _awsConnection; - private readonly SqsSubscription _subscription; + private AWSMessagingGatewayConnection _awsConnection; + private SqsSubscription _subscription; private ChannelFactory? _channelFactory; - public AwsValidateQueuesTestsAsync() + [Before(Test)] + public async Task Setup() { var channelName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); string topicName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); @@ -41,10 +41,10 @@ public AwsValidateQueuesTestsAsync() { MakeChannels = OnMissingChannel.Create, TopicAttributes = topicAttributes }); - producer.ConfirmTopicExistsAsync(topicName).Wait(); + await producer.ConfirmTopicExistsAsync(topicName); } - [Fact] + [Test] public async Task When_queues_missing_verify_throws_async() { // We have no queues so we should throw diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_raw_message_delivery_disabled_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_raw_message_delivery_disabled_async.cs index c559589bbf..0900f07ea6 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_raw_message_delivery_disabled_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_raw_message_delivery_disabled_async.cs @@ -5,12 +5,11 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -public class SqsRawMessageDeliveryTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +public class SqsRawMessageDeliveryTestsAsync : IAsyncDisposable { private readonly SnsMessageProducer _messageProducer; private readonly ChannelFactory _channelFactory; @@ -48,7 +47,7 @@ public SqsRawMessageDeliveryTestsAsync() }); } - [Fact] + [Test] public async Task When_raw_message_delivery_disabled_async() { // Arrange @@ -76,24 +75,25 @@ public async Task When_raw_message_delivery_disabled_async() await _channel.AcknowledgeAsync(messageReceived); // Assert - Assert.Equal(messageToSend.Id, messageReceived.Id); - Assert.Equal(messageToSend.Header.Topic.ToValidSNSTopicName(true), messageReceived.Header.Topic); - Assert.Equal(messageToSend.Header.MessageType, messageReceived.Header.MessageType); - Assert.Equal(messageToSend.Header.CorrelationId, messageReceived.Header.CorrelationId); - Assert.Equal(messageToSend.Header.ReplyTo, messageReceived.Header.ReplyTo); - Assert.Equal(messageToSend.Header.ContentType, messageReceived.Header.ContentType); - Assert.Contains(customHeaderItem.Key, messageReceived.Header.Bag); - Assert.Equal(customHeaderItem.Value, messageReceived.Header.Bag[customHeaderItem.Key]); - Assert.Equal(messageToSend.Body.Value, messageReceived.Body.Value); - Assert.Equal(messageGroupId, messageReceived.Header.PartitionKey); - Assert.Contains(HeaderNames.DeduplicationId, messageReceived.Header.Bag); - Assert.Equal(deduplicationId, messageReceived.Header.Bag[HeaderNames.DeduplicationId]); + await Assert.That(messageReceived.Id).IsEqualTo(messageToSend.Id); + await Assert.That(messageReceived.Header.Topic).IsEqualTo(messageToSend.Header.Topic.ToValidSNSTopicName(true)); + await Assert.That(messageReceived.Header.MessageType).IsEqualTo(messageToSend.Header.MessageType); + await Assert.That(messageReceived.Header.CorrelationId).IsEqualTo(messageToSend.Header.CorrelationId); + await Assert.That(messageReceived.Header.ReplyTo).IsEqualTo(messageToSend.Header.ReplyTo); + await Assert.That(messageReceived.Header.ContentType).IsEqualTo(messageToSend.Header.ContentType); + await Assert.That(messageReceived.Header.Bag).ContainsKey(customHeaderItem.Key); + await Assert.That(messageReceived.Header.Bag[customHeaderItem.Key]).IsEqualTo(customHeaderItem.Value); + await Assert.That(messageReceived.Body.Value).IsEqualTo(messageToSend.Body.Value); + await Assert.That(messageReceived.Header.PartitionKey).IsEqualTo(messageGroupId); + await Assert.That(messageReceived.Header.Bag).ContainsKey(HeaderNames.DeduplicationId); + await Assert.That(messageReceived.Header.Bag[HeaderNames.DeduplicationId]).IsEqualTo(deduplicationId); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs index f3e7d21b1d..1854cf3b45 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageConsumerRejectTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageConsumerRejectTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -62,7 +61,7 @@ public SqsMessageConsumerRejectTestsAsync() }); } - [Fact] + [Test] public async Task When_rejecting_a_message_should_delete_from_queue_async() { //Arrange @@ -75,13 +74,14 @@ public async Task When_rejecting_a_message_should_delete_from_queue_async() //Assert - message should be deleted, not requeued message = await _channel.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_requeueing_a_message_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_requeueing_a_message_async.cs index c516305d2b..cd4fe305f5 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_requeueing_a_message_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_requeueing_a_message_async.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerRequeueTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerRequeueTestsAsync : IAsyncDisposable { private readonly IAmAMessageProducerAsync _sender; private Message _requeuedMessage; @@ -63,7 +62,7 @@ public SqsMessageProducerRequeueTestsAsync() _channel = _channelFactory.CreateAsyncChannel(subscription); } - [Fact] + [Test] public async Task When_requeueing_a_message_async() { await _sender.SendAsync(_message); @@ -74,13 +73,14 @@ public async Task When_requeueing_a_message_async() await _channel.AcknowledgeAsync(_requeuedMessage); - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_requeueing_redrives_to_the_dlq_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_requeueing_redrives_to_the_dlq_async.cs index d6ae720c1f..91b9fa1d8d 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_requeueing_redrives_to_the_dlq_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_requeueing_redrives_to_the_dlq_async.cs @@ -10,22 +10,22 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageProducerDlqTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageProducerDlqTestsAsync : IAsyncDisposable { - private readonly SnsMessageProducer _sender; - private readonly IAmAChannelAsync _channel; - private readonly ChannelFactory _channelFactory; - private readonly Message _message; - private readonly AWSMessagingGatewayConnection _awsConnection; - private readonly ChannelName _deadLetterChannel; - - public SqsMessageProducerDlqTestsAsync() + private SnsMessageProducer _sender; + private IAmAChannelAsync _channel; + private ChannelFactory _channelFactory; + private Message _message; + private AWSMessagingGatewayConnection _awsConnection; + private ChannelName _deadLetterChannel; + + [Before(Test)] + public async Task Setup() { MyCommand myCommand = new MyCommand { Value = "Test" }; const string replyTo = "http:\\queueUrl"; @@ -67,13 +67,13 @@ public SqsMessageProducerDlqTestsAsync() TopicAttributes = topicAttributes }); - _sender.ConfirmTopicExistsAsync(topicName).Wait(); + await _sender.ConfirmTopicExistsAsync(topicName); _channelFactory = new ChannelFactory(_awsConnection); - _channel = _channelFactory.CreateAsyncChannel(subscription); + _channel = await _channelFactory.CreateAsyncChannelAsync(subscription); } - [Fact] + [Test] public async Task When_requeueing_redrives_to_the_queue_async() { await _sender.SendAsync(_message); @@ -89,7 +89,7 @@ public async Task When_requeueing_redrives_to_the_queue_async() await Task.Delay(5000); int dlqCount = await GetDLQCountAsync(); - Assert.Equal(1, dlqCount); + await Assert.That(dlqCount).IsEqualTo(1); } private async Task GetDLQCountAsync() @@ -112,10 +112,11 @@ private async Task GetDLQCountAsync() return response.Messages.Count; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_throwing_defer_action_respect_redrive_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_throwing_defer_action_respect_redrive_async.cs index c836c905a3..edd597e9b7 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_throwing_defer_action_respect_redrive_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_throwing_defer_action_respect_redrive_async.cs @@ -12,13 +12,12 @@ using Paramore.Brighter.MessagingGateway.AWSSQS; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SnsReDrivePolicySDlqTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SnsReDrivePolicySDlqTestsAsync : IAsyncDisposable { private readonly IAmAMessagePump _messagePump; private readonly Message _message; @@ -128,7 +127,7 @@ public async Task GetDLQCountAsync(string queueName) return response.Messages.Count; } - [Fact(Skip = "Failing async tests caused by task scheduler issues")] + [Test, Skip("Failing async tests caused by task scheduler issues")] public async Task When_throwing_defer_action_respect_redrive_async() { await _sender.SendAsync(_message); @@ -144,13 +143,14 @@ public async Task When_throwing_defer_action_respect_redrive_async() await Task.Delay(5000); var dlqCount = await GetDLQCountAsync(_dlqChannelName + ".fifo"); - Assert.Equal(1, dlqCount); + await Assert.That(dlqCount).IsEqualTo(1); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_topic_missing_verify_throws_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_topic_missing_verify_throws_async.cs index d3bafd27aa..69e010bb65 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_topic_missing_verify_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Proactor/When_topic_missing_verify_throws_async.cs @@ -1,12 +1,11 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AwsValidateMissingTopicTestsAsync { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -22,7 +21,7 @@ public AwsValidateMissingTopicTestsAsync() // Because we don't use channel factory to create the infrastructure - it won't exist } - [Fact] + [Test] public async Task When_topic_missing_verify_throws_async() { // arrange diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_a_message_consumer_reads_multiple_messages.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_a_message_consumer_reads_multiple_messages.cs index 19e68cf488..5e6298e9ce 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_a_message_consumer_reads_multiple_messages.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_a_message_consumer_reads_multiple_messages.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsBufferedConsumerTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsBufferedConsumerTests : IAsyncDisposable { private readonly SnsMessageProducer _messageProducer; private readonly SqsMessageConsumer _consumer; @@ -63,7 +62,7 @@ public SqsBufferedConsumerTests() }); } - [Fact] + [Test] public async Task When_a_message_consumer_reads_multiple_messages() { var routingKey = new RoutingKey(_topicName); @@ -110,11 +109,11 @@ public async Task When_a_message_consumer_reads_multiple_messages() ); //send MESSAGE_COUNT messages - _messageProducer.Send(messageOne); - _messageProducer.Send(messageTwo); - _messageProducer.Send(messageThree); - _messageProducer.Send(messageFour); - _messageProducer.Send(messageFive); + await _messageProducer.SendAsync(messageOne); + await _messageProducer.SendAsync(messageTwo); + await _messageProducer.SendAsync(messageThree); + await _messageProducer.SendAsync(messageFour); + await _messageProducer.SendAsync(messageFive); int iteration = 0; @@ -126,18 +125,18 @@ public async Task When_a_message_consumer_reads_multiple_messages() var outstandingMessageCount = MessageCount - messagesReceivedCount; //retrieve messages - var messages = _consumer.Receive(TimeSpan.FromMilliseconds(10000)); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.True(messages.Length <= outstandingMessageCount); + await Assert.That(messages.Length <= outstandingMessageCount).IsTrue(); //should not receive more than buffer in one hit - Assert.True(messages.Length <= BufferSize); + await Assert.That(messages.Length <= BufferSize).IsTrue(); var moreMessages = messages.Where(m => m.Header.MessageType == MessageType.MT_COMMAND); foreach (var message in moreMessages) { messagesReceived.Add(message); - _consumer.Acknowledge(message); + await _consumer.AcknowledgeAsync(message); } messagesReceivedCount = messagesReceived.Count; @@ -146,15 +145,16 @@ public async Task When_a_message_consumer_reads_multiple_messages() } while ((iteration <= 5) && (messagesReceivedCount < MessageCount)); - Assert.Equal(4, messagesReceivedCount); + await Assert.That(messagesReceivedCount).IsEqualTo(4); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_assume.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_assume.cs index 57b5a45b1f..8149e2353c 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_assume.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_assume.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -public class AwsAssumeInfrastructureTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsAssumeInfrastructureTests : IAsyncDisposable { private readonly Message _message; private readonly SqsMessageConsumer _consumer; @@ -81,27 +80,28 @@ public AwsAssumeInfrastructureTests() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName(true)); } - [Fact] - public void When_infastructure_exists_can_assume() + [Test] + public async Task When_infastructure_exists_can_assume() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); - var messages = _consumer.Receive(TimeSpan.FromMilliseconds(5000)); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue - _consumer.Acknowledge(message); + await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify.cs index b12f15f2b1..f39f84699e 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -public class AwsValidateInfrastructureTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsValidateInfrastructureTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerSync _consumer; @@ -78,11 +77,11 @@ public AwsValidateInfrastructureTests() _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -90,19 +89,20 @@ public async Task When_infrastructure_exists_can_verify() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue _consumer.Acknowledge(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); _consumer.Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify_by_arn.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify_by_arn.cs index c465a6d068..656b817dfd 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify_by_arn.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify_by_arn.cs @@ -7,22 +7,22 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("CI", "Fragile")] -public class AwsValidateInfrastructureByArnTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("CI", "Fragile")] +public class AwsValidateInfrastructureByArnTests : IAsyncDisposable { - private readonly Message _message; - private readonly IAmAMessageConsumerSync _consumer; - private readonly SnsMessageProducer _messageProducer; - private readonly ChannelFactory _channelFactory; - private readonly MyCommand _myCommand; - - public AwsValidateInfrastructureByArnTests() + private Message _message; + private IAmAMessageConsumerSync _consumer; + private SnsMessageProducer _messageProducer; + private ChannelFactory _channelFactory; + private MyCommand _myCommand; + + [Before(Test)] + public async Task Setup() { const string replyTo = "http:\\queueUrl"; var contentType = new ContentType(MediaTypeNames.Text.Plain); @@ -39,9 +39,9 @@ public AwsValidateInfrastructureByArnTests() channelName: new ChannelName(channelName), channelType: ChannelType.PubSub, routingKey: routingKey, - queueAttributes: new SqsAttributes(type: SqsType.Fifo, tags: new Dictionary { { "Environment", "Test" } }), + queueAttributes: new SqsAttributes(type: SqsType.Fifo, tags: new Dictionary { { "Environment", "Test" } }), topicAttributes: topicAttributes, - messagePumpType: MessagePumpType.Reactor, + messagePumpType: MessagePumpType.Reactor, makeChannels: OnMissingChannel.Create); _message = new Message( @@ -58,7 +58,7 @@ public AwsValidateInfrastructureByArnTests() _channelFactory = new ChannelFactory(awsConnection); var channel = _channelFactory.CreateSyncChannel(subscription); - var topicArn = FindTopicArn(awsConnection, routingKey.ToValidSNSTopicName(true)); + var topicArn = await FindTopicArn(awsConnection, routingKey.ToValidSNSTopicName(true)); var routingKeyArn = new RoutingKey(topicArn); //Now change the subscription to validate, just check what we made @@ -79,11 +79,11 @@ public AwsValidateInfrastructureByArnTests() _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -91,19 +91,20 @@ public async Task When_infrastructure_exists_can_verify() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue _consumer.Acknowledge(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); _consumer.Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() @@ -114,10 +115,10 @@ public async ValueTask DisposeAsync() await _messageProducer.DisposeAsync(); } - private static string FindTopicArn(AWSMessagingGatewayConnection connection, string topicName) + private static async Task FindTopicArn(AWSMessagingGatewayConnection connection, string topicName) { using var snsClient = new AWSClientFactory(connection).CreateSnsClient(); - var topicResponse = snsClient.FindTopicAsync(topicName).GetAwaiter().GetResult(); + var topicResponse = await snsClient.FindTopicAsync(topicName); return topicResponse.TopicArn; } } diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify_by_convention.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify_by_convention.cs index e47ccf65da..41613fb01f 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify_by_convention.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify_by_convention.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -public class AwsValidateInfrastructureByConventionTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsValidateInfrastructureByConventionTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerSync _consumer; @@ -78,11 +77,11 @@ public AwsValidateInfrastructureByConventionTests() _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -90,19 +89,20 @@ public async Task When_infrastructure_exists_can_verify() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue _consumer.Acknowledge(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); _consumer.Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infrastructure_exists_can_verify_by_convention.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infrastructure_exists_can_verify_by_convention.cs index 0a09863dba..9434d2b816 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infrastructure_exists_can_verify_by_convention.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infrastructure_exists_can_verify_by_convention.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -public class AwsValidateInfrastructureByConventionTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +public class AwsValidateInfrastructureByConventionTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerSync _consumer; @@ -72,28 +71,29 @@ public AwsValidateInfrastructureByConventionTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify_async() { - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); var messages = _consumer.Receive(TimeSpan.FromMilliseconds(5000)); var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); _consumer.Acknowledge(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); (_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_posting_a_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_posting_a_message_via_the_messaging_gateway.cs index d1c3df252e..4621d888b5 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_posting_a_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_posting_a_message_via_the_messaging_gateway.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerSendTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerSendTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -76,12 +75,12 @@ public SqsMessageProducerSendTests() }); } - [Fact] + [Test] public async Task When_posting_a_message_via_the_producer() { //arrange _message.Header.Subject = "test subject"; - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -91,34 +90,35 @@ public async Task When_posting_a_message_via_the_producer() _channel.Acknowledge(message); //should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_topicName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_topicName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); //allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); //{"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); - Assert.Equal(_messageGroupId, message.Header.PartitionKey); - Assert.Contains(HeaderNames.DeduplicationId, message.Header.Bag); - Assert.Equal(_deduplicationId, message.Header.Bag[HeaderNames.DeduplicationId]); + await Assert.That(message.Header.PartitionKey).IsEqualTo(_messageGroupId); + await Assert.That(message.Header.Bag).ContainsKey(HeaderNames.DeduplicationId); + await Assert.That(message.Header.Bag[HeaderNames.DeduplicationId]).IsEqualTo(_deduplicationId); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_queues_missing_assume_throws.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_queues_missing_assume_throws.cs index b7525578f3..563de221f5 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_queues_missing_assume_throws.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_queues_missing_assume_throws.cs @@ -4,18 +4,18 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -public class AwsAssumeQueuesTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsAssumeQueuesTests : IAsyncDisposable { - private readonly ChannelFactory _channelFactory; - private readonly SqsMessageConsumer _consumer; + private ChannelFactory _channelFactory; + private SqsMessageConsumer _consumer; - public AwsAssumeQueuesTests() + [Before(Test)] + public async Task Setup() { var channelName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); string topicName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); @@ -30,7 +30,7 @@ public AwsAssumeQueuesTests() messagePumpType: MessagePumpType.Reactor, queueAttributes: new SqsAttributes( type: SqsType.Fifo, - tags: new Dictionary { { "Environment", "Test" } }), + tags: new Dictionary { { "Environment", "Test" } }), topicAttributes: topicAttributes, makeChannels: OnMissingChannel.Assume); @@ -38,14 +38,14 @@ public AwsAssumeQueuesTests() //create the topic, we want the queue to be the issue //We need to create the topic at least, to check the queues - + var producer = new SnsMessageProducer(awsConnection, new SnsPublication { MakeChannels = OnMissingChannel.Create, TopicAttributes = topicAttributes }); - producer.ConfirmTopicExistsAsync(topicName).Wait(); + await producer.ConfirmTopicExistsAsync(topicName); _channelFactory = new ChannelFactory(awsConnection); var channel = _channelFactory.CreateSyncChannel(subscription); @@ -54,16 +54,17 @@ public AwsAssumeQueuesTests() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName()); } - [Fact] - public void When_queues_missing_assume_throws() + [Test] + public async Task When_queues_missing_assume_throws() { //we will try to get the queue url, and fail because it does not exist - Assert.Throws(() => _consumer.Receive(TimeSpan.FromMilliseconds(1000))); + await Assert.That(() => _consumer.Receive(TimeSpan.FromMilliseconds(1000))).ThrowsExactly(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_queues_missing_verify_throws.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_queues_missing_verify_throws.cs index 44115e6047..3f19c61ed1 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_queues_missing_verify_throws.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_queues_missing_verify_throws.cs @@ -4,19 +4,19 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -public class AwsValidateQueuesTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsValidateQueuesTests : IAsyncDisposable { - private readonly AWSMessagingGatewayConnection _awsConnection; - private readonly SqsSubscription _subscription; + private AWSMessagingGatewayConnection _awsConnection; + private SqsSubscription _subscription; private ChannelFactory? _channelFactory; - public AwsValidateQueuesTests() + [Before(Test)] + public async Task Setup() { var channelName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); string topicName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); @@ -28,9 +28,9 @@ public AwsValidateQueuesTests() channelName: new ChannelName(channelName), channelType: ChannelType.PubSub, routingKey: routingKey, - queueAttributes: new SqsAttributes(type: SqsType.Fifo, tags: new Dictionary { { "Environment", "Test" } }), + queueAttributes: new SqsAttributes(type: SqsType.Fifo, tags: new Dictionary { { "Environment", "Test" } }), topicAttributes: topicAttributes, - messagePumpType: MessagePumpType.Reactor, + messagePumpType: MessagePumpType.Reactor, makeChannels: OnMissingChannel.Validate); _awsConnection = GatewayFactory.CreateFactory(); @@ -41,22 +41,23 @@ public AwsValidateQueuesTests() { MakeChannels = OnMissingChannel.Create, TopicAttributes = topicAttributes }); - producer.ConfirmTopicExistsAsync(topicName).Wait(); + await producer.ConfirmTopicExistsAsync(topicName); } - [Fact] - public void When_queues_missing_verify_throws() + [Test] + public async Task When_queues_missing_verify_throws() { //We have no queues so we should throw //We need to do this manually in a test - will create the channel from subscriber parameters _channelFactory = new ChannelFactory(_awsConnection); - Assert.Throws(() => _channelFactory.CreateSyncChannel(_subscription)); + await Assert.That(() => _channelFactory.CreateSyncChannel(_subscription)).ThrowsExactly(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { if (_channelFactory != null) - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_raw_message_delivery_disabled.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_raw_message_delivery_disabled.cs index 410f5a437d..0b49989406 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_raw_message_delivery_disabled.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_raw_message_delivery_disabled.cs @@ -5,12 +5,11 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -public class SqsRawMessageDeliveryTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsRawMessageDeliveryTests : IAsyncDisposable { private readonly SnsMessageProducer _messageProducer; private readonly ChannelFactory _channelFactory; @@ -51,8 +50,8 @@ public SqsRawMessageDeliveryTests() }); } - [Fact] - public void When_raw_message_delivery_disabled() + [Test] + public async Task When_raw_message_delivery_disabled() { //arrange var messageGroupId = $"MessageGroupId{Guid.NewGuid():N}"; @@ -72,32 +71,33 @@ public void When_raw_message_delivery_disabled() var messageToSent = new Message(messageHeader, new MessageBody("test content one")); //act - _messageProducer.Send(messageToSent); + await _messageProducer.SendAsync(messageToSent); var messageReceived = _channel.Receive(TimeSpan.FromMilliseconds(10000)); _channel.Acknowledge(messageReceived); //assert - Assert.Equal(messageToSent.Id, messageReceived.Id); - Assert.Equal(messageToSent.Header.Topic.ToValidSNSTopicName(true), messageReceived.Header.Topic); - Assert.Equal(messageToSent.Header.MessageType, messageReceived.Header.MessageType); - Assert.Equal(messageToSent.Header.CorrelationId, messageReceived.Header.CorrelationId); - Assert.Equal(messageToSent.Header.ReplyTo, messageReceived.Header.ReplyTo); - Assert.Equal(messageToSent.Header.ContentType, messageReceived.Header.ContentType); - Assert.Contains(customHeaderItem.Key, messageReceived.Header.Bag); - Assert.Equal(customHeaderItem.Value, messageReceived.Header.Bag[customHeaderItem.Key]); - Assert.Equal(messageToSent.Body.Value, messageReceived.Body.Value); - - Assert.Equal(messageGroupId, messageReceived.Header.PartitionKey); - Assert.Contains(HeaderNames.DeduplicationId, messageReceived.Header.Bag); - Assert.Equal(deduplicationId, messageReceived.Header.Bag[HeaderNames.DeduplicationId]); + await Assert.That(messageReceived.Id).IsEqualTo(messageToSent.Id); + await Assert.That(messageReceived.Header.Topic).IsEqualTo(messageToSent.Header.Topic.ToValidSNSTopicName(true)); + await Assert.That(messageReceived.Header.MessageType).IsEqualTo(messageToSent.Header.MessageType); + await Assert.That(messageReceived.Header.CorrelationId).IsEqualTo(messageToSent.Header.CorrelationId); + await Assert.That(messageReceived.Header.ReplyTo).IsEqualTo(messageToSent.Header.ReplyTo); + await Assert.That(messageReceived.Header.ContentType).IsEqualTo(messageToSent.Header.ContentType); + await Assert.That(messageReceived.Header.Bag).ContainsKey(customHeaderItem.Key); + await Assert.That(messageReceived.Header.Bag[customHeaderItem.Key]).IsEqualTo(customHeaderItem.Value); + await Assert.That(messageReceived.Body.Value).IsEqualTo(messageToSent.Body.Value); + + await Assert.That(messageReceived.Header.PartitionKey).IsEqualTo(messageGroupId); + await Assert.That(messageReceived.Header.Bag).ContainsKey(HeaderNames.DeduplicationId); + await Assert.That(messageReceived.Header.Bag[HeaderNames.DeduplicationId]).IsEqualTo(deduplicationId); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_rejecting_a_message_should_delete_from_queue.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_rejecting_a_message_should_delete_from_queue.cs index bcf44df4ca..2b3e118919 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_rejecting_a_message_should_delete_from_queue.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_rejecting_a_message_should_delete_from_queue.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerRejectTests : IDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerRejectTests { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -64,11 +63,11 @@ public SqsMessageConsumerRejectTests() }); } - [Fact] - public void When_rejecting_a_message_should_delete_from_queue() + [Test] + public async Task When_rejecting_a_message_should_delete_from_queue() { //Arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); //Act @@ -77,13 +76,14 @@ public void When_rejecting_a_message_should_delete_from_queue() //Assert - message should be deleted, not requeued message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_requeueing_a_message.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_requeueing_a_message.cs index a6d7951941..eab67a2cad 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_requeueing_a_message.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_requeueing_a_message.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerRequeueTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerRequeueTests : IAsyncDisposable { private readonly IAmAMessageProducerSync _sender; private Message? _requeuedMessage; @@ -62,8 +61,8 @@ public SqsMessageProducerRequeueTests() _channel = _channelFactory.CreateSyncChannel(subscription); } - [Fact] - public void When_requeueing_a_message() + [Test] + public async Task When_requeueing_a_message() { _sender.Send(_message); _receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); @@ -74,13 +73,14 @@ public void When_requeueing_a_message() //clear the queue _channel.Acknowledge(_requeuedMessage); - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_requeueing_redrives_to_the_dlq.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_requeueing_redrives_to_the_dlq.cs index 91746f1868..8bc073cb1c 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_requeueing_redrives_to_the_dlq.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_requeueing_redrives_to_the_dlq.cs @@ -9,23 +9,23 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageProducerDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageProducerDlqTests : IAsyncDisposable { - private readonly SnsMessageProducer _sender; - private readonly IAmAChannelSync _channel; - private readonly ChannelFactory _channelFactory; - private readonly Message _message; - private readonly AWSMessagingGatewayConnection _awsConnection; - private readonly string _dlqChannelName; - - public SqsMessageProducerDlqTests() + private SnsMessageProducer _sender; + private IAmAChannelSync _channel; + private ChannelFactory _channelFactory; + private Message _message; + private AWSMessagingGatewayConnection _awsConnection; + private string _dlqChannelName; + + [Before(Test)] + public async Task Setup() { MyCommand myCommand = new MyCommand { Value = "Test" }; const string replyTo = "http:\\queueUrl"; @@ -70,17 +70,17 @@ public SqsMessageProducerDlqTests() TopicAttributes = topicAttributes }); - _sender.ConfirmTopicExistsAsync(topicName).Wait(); + await _sender.ConfirmTopicExistsAsync(topicName); //We need to do this manually in a test - will create the channel from subscriber parameters _channelFactory = new ChannelFactory(_awsConnection); _channel = _channelFactory.CreateSyncChannel(subscription); } - [Fact] - public void When_requeueing_redrives_to_the_queue() + [Test] + public async Task When_requeueing_redrives_to_the_queue() { - _sender.Send(_message); + await _sender.SendAsync(_message); var receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); _channel.Requeue(receivedMessage); @@ -94,19 +94,19 @@ public void When_requeueing_redrives_to_the_queue() Task.Delay(5000); //inspect the dlq - Assert.Equal(1, GetDLQCount(_dlqChannelName + ".fifo")); + await Assert.That(await GetDLQCount(_dlqChannelName + ".fifo")).IsEqualTo(1); } - private int GetDLQCount(string queueName) + private async Task GetDLQCount(string queueName) { using var sqsClient = new AWSClientFactory(_awsConnection).CreateSqsClient(); - var queueUrlResponse = sqsClient.GetQueueUrlAsync(queueName).GetAwaiter().GetResult(); - var response = sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest + var queueUrlResponse = await sqsClient.GetQueueUrlAsync(queueName); + var response = await sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest { QueueUrl = queueUrlResponse.QueueUrl, WaitTimeSeconds = 5, MessageAttributeNames = ["All", "ApproximateReceiveCount"] - }).GetAwaiter().GetResult(); + }); if (response.HttpStatusCode != HttpStatusCode.OK) { @@ -117,10 +117,11 @@ private int GetDLQCount(string queueName) return response.Messages.Count; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_throwing_defer_action_respect_redrive.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_throwing_defer_action_respect_redrive.cs index 5fbcef0856..891255d14a 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_throwing_defer_action_respect_redrive.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_throwing_defer_action_respect_redrive.cs @@ -11,14 +11,13 @@ using Paramore.Brighter.MessagingGateway.AWSSQS; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SnsReDrivePolicySDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SnsReDrivePolicySDlqTests : IAsyncDisposable { private readonly IAmAMessagePump _messagePump; private readonly Message _message; @@ -118,17 +117,17 @@ public SnsReDrivePolicySDlqTests() }; } - private int GetDLQCount(string queueName) + private async Task GetDLQCount(string queueName) { using var sqsClient = new AWSClientFactory(_awsConnection).CreateSqsClient(); - var queueUrlResponse = sqsClient.GetQueueUrlAsync(queueName).GetAwaiter().GetResult(); - var response = sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest + var queueUrlResponse = await sqsClient.GetQueueUrlAsync(queueName); + var response = await sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest { QueueUrl = queueUrlResponse.QueueUrl, WaitTimeSeconds = 5, MessageSystemAttributeNames = ["ApproximateReceiveCount"], MessageAttributeNames = ["All"] - }).GetAwaiter().GetResult(); + }); if (response.HttpStatusCode != HttpStatusCode.OK) { @@ -140,11 +139,11 @@ private int GetDLQCount(string queueName) } - [Fact] + [Test] public async Task When_throwing_defer_action_respect_redrive() { //put something on an SNS topic, which will be delivered to our SQS queue - _sender.Send(_message); + await _sender.SendAsync(_message); //start a message pump, let it process messages var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); @@ -160,13 +159,14 @@ public async Task When_throwing_defer_action_respect_redrive() await Task.Delay(5000); //inspect the dlq - Assert.Equal(1, GetDLQCount(_dlqChannelName + ".fifo")); + await Assert.That(await GetDLQCount(_dlqChannelName + ".fifo")).IsEqualTo(1); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_topic_missing_verify_throws.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_topic_missing_verify_throws.cs index 5df84731b3..7ec67b2a11 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_topic_missing_verify_throws.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Fifo/Reactor/When_topic_missing_verify_throws.cs @@ -1,11 +1,10 @@ -using System; +using System; using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AwsValidateMissingTopicTests { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -21,8 +20,8 @@ public AwsValidateMissingTopicTests() //Because we don't use channel factory to create the infrastructure -it won't exist } - [Fact] - public void When_topic_missing_verify_throws() + [Test] + public async Task When_topic_missing_verify_throws() { //arrange var producer = new SnsMessageProducer(_awsConnection, @@ -35,9 +34,12 @@ public void When_topic_missing_verify_throws() var messageGroupId = $"MessageGroup{Guid.NewGuid():N}"; //act && assert - Assert.Throws(() => producer.Send(new Message( - new MessageHeader("", _routingKey, MessageType.MT_EVENT, - type: new CloudEventsType("plain/text"), partitionKey: messageGroupId), - new MessageBody("Test")))); + Assert.ThrowsExactly(() => + { + producer.Send(new Message( + new MessageHeader("", _routingKey, MessageType.MT_EVENT, + type: new CloudEventsType("plain/text"), partitionKey: messageGroupId), + new MessageBody("Test"))); + }); } } diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs index f7041d127c..adeac8c9de 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs @@ -6,24 +6,24 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsBufferedConsumerTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsBufferedConsumerTestsAsync : IAsyncDisposable { - private readonly SnsMessageProducer _messageProducer; - private readonly SqsMessageConsumer _consumer; - private readonly string _topicName; - private readonly ChannelFactory _channelFactory; + private SnsMessageProducer _messageProducer; + private SqsMessageConsumer _consumer; + private string _topicName; + private ChannelFactory _channelFactory; private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; private const int MessageCount = 4; - public SqsBufferedConsumerTestsAsync() + [Before(Test)] + public async Task Setup() { var awsConnection = GatewayFactory.CreateFactory(); @@ -34,7 +34,7 @@ public SqsBufferedConsumerTestsAsync() //we need the channel to create the queues and notifications var routingKey = new RoutingKey(_topicName); - var channel = _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( + var channel = await _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( subscriptionName: new SubscriptionName(channelName), channelName: new ChannelName(channelName), routingKey: routingKey, @@ -42,7 +42,7 @@ public SqsBufferedConsumerTestsAsync() messagePumpType: MessagePumpType.Proactor, makeChannels: OnMissingChannel.Create, queueAttributes: new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }), - topicAttributes: new SnsAttributes(tags: [new Tag { Key = "Environment", Value = "Test" }]))).GetAwaiter().GetResult(); + topicAttributes: new SnsAttributes(tags: [new Tag { Key = "Environment", Value = "Test" }]))); //we want to access via a consumer, to receive multiple messages - we don't want to expose on channel //just for the tests, so create a new consumer from the properties @@ -51,7 +51,7 @@ public SqsBufferedConsumerTestsAsync() new SnsPublication { MakeChannels = OnMissingChannel.Create }); } - [Fact] + [Test] public async Task When_a_message_consumer_reads_multiple_messages_async() { var routingKey = new RoutingKey(_topicName); @@ -97,10 +97,10 @@ public async Task When_a_message_consumer_reads_multiple_messages_async() //retrieve messages var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.True(messages.Length <= outstandingMessageCount); + await Assert.That(messages.Length <= outstandingMessageCount).IsTrue(); //should not receive more than buffer in one hit - Assert.True(messages.Length <= BufferSize); + await Assert.That(messages.Length <= BufferSize).IsTrue(); var moreMessages = messages.Where(m => m.Header.MessageType == MessageType.MT_COMMAND); foreach (var message in moreMessages) @@ -115,7 +115,7 @@ public async Task When_a_message_consumer_reads_multiple_messages_async() } while ((iteration <= 5) && (messagesReceivedCount < MessageCount)); - Assert.Equal(4, messagesReceivedCount); + await Assert.That(messagesReceivedCount).IsEqualTo(4); } public async ValueTask DisposeAsync() @@ -125,10 +125,11 @@ public async ValueTask DisposeAsync() await _messageProducer.DisposeAsync(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().GetAwaiter().GetResult(); - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _messageProducer.DisposeAsync().GetAwaiter().GetResult(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } } diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_creating_a_topic_with_custom_tags_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_creating_a_topic_with_custom_tags_async.cs index 5a1cafba9d..e268ccbea5 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_creating_a_topic_with_custom_tags_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_creating_a_topic_with_custom_tags_async.cs @@ -10,12 +10,11 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerCreateTopicWithTagsAsyncTests : IAsyncDisposable, IDisposable +[Category("AWS")] +public class SqsMessageProducerCreateTopicWithTagsAsyncTests : IAsyncDisposable { private readonly SnsMessageProducer _messageProducer; private readonly ChannelFactory _channelFactory; @@ -64,7 +63,7 @@ public SqsMessageProducerCreateTopicWithTagsAsyncTests() }); } - [Fact] + [Test] public async Task When_creating_a_topic_with_custom_tags_async() { //arrange @@ -77,15 +76,16 @@ public async Task When_creating_a_topic_with_custom_tags_async() new ListTagsForResourceRequest { ResourceArn = topicArn }); //assert - Assert.Contains(tagsResponse.Tags, t => t.Key == "Source" && t.Value == "Brighter"); - Assert.Contains(tagsResponse.Tags, t => t.Key == "Environment" && t.Value == "Test"); + await Assert.That(tagsResponse.Tags).Contains(t => t.Key == "Source" && t.Value == "Brighter"); + await Assert.That(tagsResponse.Tags).Contains(t => t.Key == "Environment" && t.Value == "Test"); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_customising_aws_client_config_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_customising_aws_client_config_async.cs index f5e616ea86..d88987e352 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_customising_aws_client_config_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_customising_aws_client_config_async.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -public class CustomisingAwsClientConfigTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +public class CustomisingAwsClientConfigTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -67,7 +66,7 @@ public CustomisingAwsClientConfigTestsAsync() ); } - [Fact] + [Test] public async Task When_customising_aws_client_config() { //arrange @@ -78,22 +77,23 @@ public async Task When_customising_aws_client_config() var message = await _channel.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); //clear the queue - Assert.NotEqual(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); await _channel.AcknowledgeAsync(message); //publish_and_subscribe_should_use_custom_http_client_factory - Assert.Contains("async_pub", InterceptingDelegatingHandler.RequestCount); - Assert.True((InterceptingDelegatingHandler.RequestCount["async_pub"]) > (0)); + await Assert.That(InterceptingDelegatingHandler.RequestCount).ContainsKey("async_pub"); + await Assert.That((InterceptingDelegatingHandler.RequestCount["async_pub"]) > (0)).IsTrue(); - Assert.Contains("async_pub", InterceptingDelegatingHandler.RequestCount); - Assert.True((InterceptingDelegatingHandler.RequestCount["async_pub"]) > (0)); + await Assert.That(InterceptingDelegatingHandler.RequestCount).ContainsKey("async_pub"); + await Assert.That((InterceptingDelegatingHandler.RequestCount["async_pub"]) > (0)).IsTrue(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_infastructure_exists_can_assume_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_infastructure_exists_can_assume_async.cs index 1dde7e9866..f0e39cccf4 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_infastructure_exists_can_assume_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_infastructure_exists_can_assume_async.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -public class AwsAssumeInfrastructureTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsAssumeInfrastructureTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly SqsMessageConsumer _consumer; private readonly SnsMessageProducer _messageProducer; @@ -68,7 +67,7 @@ public AwsAssumeInfrastructureTestsAsync() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName()); } - [Fact] + [Test] public async Task When_infastructure_exists_can_assume() { //arrange @@ -78,17 +77,18 @@ public async Task When_infastructure_exists_can_assume() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_async.cs index 3213747301..f386746e5c 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_async.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Proactor { - [Trait("Category", "AWS")] - public class AwsValidateInfrastructureTestsAsync : IDisposable, IAsyncDisposable + [Category("AWS")] + public class AwsValidateInfrastructureTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerAsync _consumer; @@ -69,7 +68,7 @@ public AwsValidateInfrastructureTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify_async() { await _messageProducer.SendAsync(_message); @@ -79,18 +78,19 @@ public async Task When_infrastructure_exists_can_verify_async() var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); ((IAmAMessageConsumerSync)_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_by_arn_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_by_arn_async.cs index 2ff22482e1..b8e9184603 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_by_arn_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_by_arn_async.cs @@ -9,22 +9,22 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -public class AwsValidateInfrastructureByArnTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +public class AwsValidateInfrastructureByArnTestsAsync : IAsyncDisposable { - private readonly Message _message; - private readonly IAmAMessageConsumerAsync _consumer; - private readonly SnsMessageProducer _messageProducer; - private readonly ChannelFactory _channelFactory; - private readonly MyCommand _myCommand; - - public AwsValidateInfrastructureByArnTestsAsync() + private Message _message; + private IAmAMessageConsumerAsync _consumer; + private SnsMessageProducer _messageProducer; + private ChannelFactory _channelFactory; + private MyCommand _myCommand; + + [Before(Test)] + public async Task Setup() { _myCommand = new MyCommand { Value = "Test" }; string correlationId = Id.Random(); @@ -53,11 +53,11 @@ public AwsValidateInfrastructureByArnTestsAsync() var awsConnection = GatewayFactory.CreateFactory(credentials, region); _channelFactory = new ChannelFactory(awsConnection); - var channel = _channelFactory.CreateAsyncChannel(subscription); + var channel = await _channelFactory.CreateAsyncChannelAsync(subscription); - var topicArn = FindTopicArn(awsConnection, routingKey.Value).Result; + var topicArn = await FindTopicArn(awsConnection, routingKey.Value); var routingKeyArn = new RoutingKey(topicArn); - + subscription.MakeChannels = OnMissingChannel.Validate; subscription.RoutingKey = routingKeyArn; subscription.FindTopicBy = TopicFindBy.Arn; @@ -75,7 +75,7 @@ public AwsValidateInfrastructureByArnTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify_async() { await _messageProducer.SendAsync(_message); @@ -85,7 +85,7 @@ public async Task When_infrastructure_exists_can_verify_async() var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); await _consumer.AcknowledgeAsync(message); } @@ -97,13 +97,14 @@ private static async Task FindTopicArn(AWSMessagingGatewayConnection con return topicResponse.TopicArn; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); ((IAmAMessageConsumerSync)_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_by_convention_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_by_convention_async.cs index 8f75a4f3b6..4bb4132692 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_by_convention_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_by_convention_async.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -public class AwsValidateInfrastructureByConventionTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +public class AwsValidateInfrastructureByConventionTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerAsync _consumer; @@ -69,7 +68,7 @@ public AwsValidateInfrastructureByConventionTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify_async() { await _messageProducer.SendAsync(_message); @@ -79,18 +78,19 @@ public async Task When_infrastructure_exists_can_verify_async() var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); ((IAmAMessageConsumerSync)_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_posting_a_message_resources_are_tagged_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_posting_a_message_resources_are_tagged_async.cs index a071c847be..3b1d6930df 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_posting_a_message_resources_are_tagged_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_posting_a_message_resources_are_tagged_async.cs @@ -10,12 +10,11 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerResourcesAreTaggedAsyncTests : IAsyncDisposable, IDisposable +[Category("AWS")] +public class SqsMessageProducerResourcesAreTaggedAsyncTests : IAsyncDisposable { private readonly SnsMessageProducer _messageProducer; private readonly ChannelFactory _channelFactory; @@ -70,7 +69,7 @@ public SqsMessageProducerResourcesAreTaggedAsyncTests() }); } - [Fact] + [Test] public async Task When_posting_a_message_resources_are_tagged_async() { //arrange @@ -89,18 +88,19 @@ public async Task When_posting_a_message_resources_are_tagged_async() new ListQueueTagsRequest { QueueUrl = queueUrlResponse.QueueUrl }); //assert - topic has Environment=Test tag - Assert.Contains(topicTagsResponse.Tags, t => t.Key == "Environment" && t.Value == "Test"); + await Assert.That(topicTagsResponse.Tags).Contains(t => t.Key == "Environment" && t.Value == "Test"); //assert - queue has Environment=Test tag - Assert.True(queueTagsResponse.Tags.ContainsKey("Environment")); - Assert.Equal("Test", queueTagsResponse.Tags["Environment"]); + await Assert.That(queueTagsResponse.Tags.ContainsKey("Environment")).IsTrue(); + await Assert.That(queueTagsResponse.Tags["Environment"]).IsEqualTo("Test"); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs index 8b937341b1..2ecf8ae200 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerSendAsyncTests : IAsyncDisposable, IDisposable +[Category("AWS")] +public class SqsMessageProducerSendAsyncTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -64,7 +63,7 @@ public SqsMessageProducerSendAsyncTests() }); } - [Fact] + [Test] public async Task When_posting_a_message_via_the_producer_async() { // arrange @@ -79,30 +78,31 @@ public async Task When_posting_a_message_via_the_producer_async() await _channel.AcknowledgeAsync(message); // should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_topicName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_topicName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); // allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); // {"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_queues_missing_assume_throws_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_queues_missing_assume_throws_async.cs index 46e1d89348..bffb58e362 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_queues_missing_assume_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_queues_missing_assume_throws_async.cs @@ -4,19 +4,19 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -public class AwsAssumeQueuesTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +public class AwsAssumeQueuesTestsAsync : IAsyncDisposable { - private readonly ChannelFactory _channelFactory; - private readonly IAmAMessageConsumerAsync _consumer; + private ChannelFactory _channelFactory; + private IAmAMessageConsumerAsync _consumer; - public AwsAssumeQueuesTestsAsync() + [Before(Test)] + public async Task Setup() { var channelName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); string topicName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); @@ -27,7 +27,7 @@ public AwsAssumeQueuesTestsAsync() channelName: new ChannelName(channelName), channelType: ChannelType.PubSub, routingKey: routingKey, - messagePumpType: MessagePumpType.Proactor, + messagePumpType: MessagePumpType.Proactor, makeChannels: OnMissingChannel.Assume, queueAttributes: new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }), topicAttributes: new SnsAttributes(tags: [new Tag { Key = "Environment", Value = "Test" }])); @@ -42,16 +42,16 @@ public AwsAssumeQueuesTestsAsync() MakeChannels = OnMissingChannel.Create }); - producer.ConfirmTopicExistsAsync(topicName).Wait(); - + await producer.ConfirmTopicExistsAsync(topicName); + _channelFactory = new ChannelFactory(awsConnection); - var channel = _channelFactory.CreateAsyncChannel(subscription); - + var channel = await _channelFactory.CreateAsyncChannelAsync(subscription); + //We need to create the topic at least, to check the queues _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_queues_missing_assume_throws_async() { //we will try to get the queue url, and fail because it does not exist @@ -59,9 +59,10 @@ await Assert.ThrowsAsync(async () => await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_queues_missing_verify_throws_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_queues_missing_verify_throws_async.cs index 0390163238..0191f4311f 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_queues_missing_verify_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_queues_missing_verify_throws_async.cs @@ -4,20 +4,20 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AwsValidateQueuesTestsAsync : IAsyncDisposable { - private readonly AWSMessagingGatewayConnection _awsConnection; - private readonly SqsSubscription _subscription; + private AWSMessagingGatewayConnection _awsConnection; + private SqsSubscription _subscription; private ChannelFactory? _channelFactory; - public AwsValidateQueuesTestsAsync() + [Before(Test)] + public async Task Setup() { var channelName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); string topicName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); @@ -41,10 +41,10 @@ public AwsValidateQueuesTestsAsync() { MakeChannels = OnMissingChannel.Create }); - producer.ConfirmTopicExistsAsync(topicName).Wait(); + await producer.ConfirmTopicExistsAsync(topicName); } - [Fact] + [Test] public async Task When_queues_missing_verify_throws_async() { // We have no queues so we should throw diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_raw_message_delivery_disabled_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_raw_message_delivery_disabled_async.cs index fab7c0236c..9146b49aa9 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_raw_message_delivery_disabled_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_raw_message_delivery_disabled_async.cs @@ -5,13 +5,12 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -public class SqsRawMessageDeliveryTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +public class SqsRawMessageDeliveryTestsAsync : IAsyncDisposable { private readonly SnsMessageProducer _messageProducer; private readonly ChannelFactory _channelFactory; @@ -49,7 +48,7 @@ public SqsRawMessageDeliveryTestsAsync() }); } - [Fact] + [Test] public async Task When_raw_message_delivery_disabled_async() { // Arrange @@ -74,21 +73,22 @@ public async Task When_raw_message_delivery_disabled_async() await _channel.AcknowledgeAsync(messageReceived); // Assert - Assert.Equal(messageToSend.Id, messageReceived.Id); - Assert.Equal(messageToSend.Header.Topic, messageReceived.Header.Topic); - Assert.Equal(messageToSend.Header.MessageType, messageReceived.Header.MessageType); - Assert.Equal(messageToSend.Header.CorrelationId, messageReceived.Header.CorrelationId); - Assert.Equal(messageToSend.Header.ReplyTo, messageReceived.Header.ReplyTo); - Assert.Equal(messageToSend.Header.ContentType, messageReceived.Header.ContentType); - Assert.Contains(customHeaderItem.Key, messageReceived.Header.Bag); - Assert.Equal(customHeaderItem.Value, messageReceived.Header.Bag[customHeaderItem.Key]); - Assert.Equal(messageToSend.Body.Value, messageReceived.Body.Value); + await Assert.That(messageReceived.Id).IsEqualTo(messageToSend.Id); + await Assert.That(messageReceived.Header.Topic).IsEqualTo(messageToSend.Header.Topic); + await Assert.That(messageReceived.Header.MessageType).IsEqualTo(messageToSend.Header.MessageType); + await Assert.That(messageReceived.Header.CorrelationId).IsEqualTo(messageToSend.Header.CorrelationId); + await Assert.That(messageReceived.Header.ReplyTo).IsEqualTo(messageToSend.Header.ReplyTo); + await Assert.That(messageReceived.Header.ContentType).IsEqualTo(messageToSend.Header.ContentType); + await Assert.That(messageReceived.Header.Bag).ContainsKey(customHeaderItem.Key); + await Assert.That(messageReceived.Header.Bag[customHeaderItem.Key]).IsEqualTo(customHeaderItem.Value); + await Assert.That(messageReceived.Body.Value).IsEqualTo(messageToSend.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs index 55570033eb..24bfa751cd 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs @@ -6,15 +6,14 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerRejectTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerRejectTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -56,7 +55,7 @@ public SqsMessageConsumerRejectTestsAsync() _messageProducer = new SnsMessageProducer(awsConnection, new SnsPublication { MakeChannels = OnMissingChannel.Create }); } - [Fact] + [Test] public async Task When_rejecting_a_message_should_delete_from_queue_async() { //Arrange @@ -69,13 +68,14 @@ public async Task When_rejecting_a_message_should_delete_from_queue_async() //Assert - message should be deleted, not requeued message = await _channel.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_requeueing_a_message_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_requeueing_a_message_async.cs index 0d0070b61e..4988b9060a 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_requeueing_a_message_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_requeueing_a_message_async.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerRequeueTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerRequeueTestsAsync : IAsyncDisposable { private readonly IAmAMessageProducerAsync _sender; private Message? _requeuedMessage; @@ -59,7 +58,7 @@ public SqsMessageProducerRequeueTestsAsync() _channel = _channelFactory.CreateAsyncChannel(subscription); } - [Fact] + [Test] public async Task When_requeueing_a_message_async() { await _sender.SendAsync(_message); @@ -70,13 +69,14 @@ public async Task When_requeueing_a_message_async() await _channel.AcknowledgeAsync(_requeuedMessage); - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_requeueing_redrives_to_the_dlq_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_requeueing_redrives_to_the_dlq_async.cs index c26dcb8b68..59f7f2fa74 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_requeueing_redrives_to_the_dlq_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_requeueing_redrives_to_the_dlq_async.cs @@ -10,23 +10,23 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageProducerDlqTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageProducerDlqTestsAsync : IAsyncDisposable { - private readonly SnsMessageProducer _sender; - private readonly IAmAChannelAsync _channel; - private readonly ChannelFactory _channelFactory; - private readonly Message _message; - private readonly AWSMessagingGatewayConnection _awsConnection; - private readonly ChannelName _deadLetterChannel; - - public SqsMessageProducerDlqTestsAsync() + private SnsMessageProducer _sender; + private IAmAChannelAsync _channel; + private ChannelFactory _channelFactory; + private Message _message; + private AWSMessagingGatewayConnection _awsConnection; + private ChannelName _deadLetterChannel; + + [Before(Test)] + public async Task Setup() { MyCommand myCommand = new MyCommand { Value = "Test" }; string correlationId = Guid.NewGuid().ToString(); @@ -61,13 +61,13 @@ public SqsMessageProducerDlqTestsAsync() _sender = new SnsMessageProducer(_awsConnection, new SnsPublication { Topic = routingKey, MakeChannels = OnMissingChannel.Create }); - _sender.ConfirmTopicExistsAsync(topicName).Wait(); + await _sender.ConfirmTopicExistsAsync(topicName); _channelFactory = new ChannelFactory(_awsConnection); - _channel = _channelFactory.CreateAsyncChannel(subscription); + _channel = await _channelFactory.CreateAsyncChannelAsync(subscription); } - [Fact] + [Test] public async Task When_requeueing_redrives_to_the_queue_async() { await _sender.SendAsync(_message); @@ -83,7 +83,7 @@ public async Task When_requeueing_redrives_to_the_queue_async() await Task.Delay(5000); int dlqCount = await GetDLQCountAsync(); - Assert.Equal(1, dlqCount); + await Assert.That(dlqCount).IsEqualTo(1); } private async Task GetDLQCountAsync() @@ -106,10 +106,11 @@ private async Task GetDLQCountAsync() return response.Messages.Count; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_throwing_defer_action_respect_redrive_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_throwing_defer_action_respect_redrive_async.cs index 9498d534bc..7e5509947a 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_throwing_defer_action_respect_redrive_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_throwing_defer_action_respect_redrive_async.cs @@ -13,13 +13,12 @@ using Paramore.Brighter.MessagingGateway.AWSSQS; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SnsReDrivePolicySDlqTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SnsReDrivePolicySDlqTestsAsync : IAsyncDisposable { private readonly IAmAMessagePump _messagePump; private readonly Message _message; @@ -126,7 +125,7 @@ public async Task GetDLQCountAsync(string queueName) return response.Messages.Count; } - [Fact(Skip = "Failing async tests caused by task scheduler issues")] + [Test, Skip("Failing async tests caused by task scheduler issues")] public async Task When_throwing_defer_action_respect_redrive_async() { await _sender.SendAsync(_message); @@ -142,13 +141,14 @@ public async Task When_throwing_defer_action_respect_redrive_async() await Task.Delay(5000); int dlqCount = await GetDLQCountAsync(_dlqChannelName); - Assert.Equal(1, dlqCount); + await Assert.That(dlqCount).IsEqualTo(1); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_topic_missing_verify_throws_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_topic_missing_verify_throws_async.cs index 51495125c1..e182eced42 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_topic_missing_verify_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Proactor/When_topic_missing_verify_throws_async.cs @@ -1,12 +1,11 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AwsValidateMissingTopicTestsAsync { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -22,7 +21,7 @@ public AwsValidateMissingTopicTestsAsync() // Because we don't use channel factory to create the infrastructure - it won't exist } - [Fact] + [Test] public async Task When_topic_missing_verify_throws_async() { // arrange diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_a_message_consumer_reads_multiple_messages.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_a_message_consumer_reads_multiple_messages.cs index 868817ad84..9b76128c28 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_a_message_consumer_reads_multiple_messages.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_a_message_consumer_reads_multiple_messages.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsBufferedConsumerTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsBufferedConsumerTests : IAsyncDisposable { private readonly SnsMessageProducer _messageProducer; private readonly SqsMessageConsumer _consumer; @@ -55,7 +54,7 @@ public SqsBufferedConsumerTests() }); } - [Fact] + [Test] public async Task When_a_message_consumer_reads_multiple_messages() { var routingKey = new RoutingKey(_topicName); @@ -85,10 +84,10 @@ public async Task When_a_message_consumer_reads_multiple_messages() ); //send MESSAGE_COUNT messages - _messageProducer.Send(messageOne); - _messageProducer.Send(messageTwo); - _messageProducer.Send(messageThree); - _messageProducer.Send(messageFour); + await _messageProducer.SendAsync(messageOne); + await _messageProducer.SendAsync(messageTwo); + await _messageProducer.SendAsync(messageThree); + await _messageProducer.SendAsync(messageFour); int iteration = 0; @@ -100,18 +99,18 @@ public async Task When_a_message_consumer_reads_multiple_messages() var outstandingMessageCount = MessageCount - messagesReceivedCount; //retrieve messages - var messages = _consumer.Receive(TimeSpan.FromMilliseconds(10000)); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.True(messages.Length <= outstandingMessageCount); + await Assert.That(messages.Length <= outstandingMessageCount).IsTrue(); //should not receive more than buffer in one hit - Assert.True(messages.Length <= BufferSize); + await Assert.That(messages.Length <= BufferSize).IsTrue(); var moreMessages = messages.Where(m => m.Header.MessageType == MessageType.MT_COMMAND); foreach (var message in moreMessages) { messagesReceived.Add(message); - _consumer.Acknowledge(message); + await _consumer.AcknowledgeAsync(message); } messagesReceivedCount = messagesReceived.Count; @@ -121,16 +120,17 @@ public async Task When_a_message_consumer_reads_multiple_messages() } while ((iteration <= 5) && (messagesReceivedCount < MessageCount)); - Assert.Equal(4, messagesReceivedCount); + await Assert.That(messagesReceivedCount).IsEqualTo(4); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_customising_aws_client_config.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_customising_aws_client_config.cs index 1d9e282fbc..3db77c3aa7 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_customising_aws_client_config.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_customising_aws_client_config.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -public class CustomisingAwsClientConfigTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class CustomisingAwsClientConfigTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -63,11 +62,11 @@ public CustomisingAwsClientConfigTests() MakeChannels = OnMissingChannel.Create }); } - [Fact] + [Test] public async Task When_customising_aws_client_config() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -77,18 +76,19 @@ public async Task When_customising_aws_client_config() _channel.Acknowledge(message); //publish_and_subscribe_should_use_custom_http_client_factory - Assert.Contains("sync_sub", InterceptingDelegatingHandler.RequestCount); - Assert.True((InterceptingDelegatingHandler.RequestCount["sync_sub"]) > (0)); + await Assert.That(InterceptingDelegatingHandler.RequestCount).ContainsKey("sync_sub"); + await Assert.That((InterceptingDelegatingHandler.RequestCount["sync_sub"]) > (0)).IsTrue(); - Assert.Contains("sync_pub", InterceptingDelegatingHandler.RequestCount); - Assert.True((InterceptingDelegatingHandler.RequestCount["sync_pub"]) > (0)); + await Assert.That(InterceptingDelegatingHandler.RequestCount).ContainsKey("sync_pub"); + await Assert.That((InterceptingDelegatingHandler.RequestCount["sync_pub"]) > (0)).IsTrue(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_assume.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_assume.cs index 72304c61a9..e5cba91353 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_assume.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_assume.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -public class AwsAssumeInfrastructureTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsAssumeInfrastructureTests : IAsyncDisposable { private readonly Message _message; private readonly SqsMessageConsumer _consumer; @@ -65,27 +64,28 @@ public AwsAssumeInfrastructureTests() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName()); } - [Fact] - public void When_infastructure_exists_can_assume() + [Test] + public async Task When_infastructure_exists_can_assume() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); - var messages = _consumer.Receive(TimeSpan.FromMilliseconds(5000)); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue - _consumer.Acknowledge(message); + await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify.cs index 180f2fb00b..7b6ae188b3 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -public class AwsValidateInfrastructureTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsValidateInfrastructureTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerSync _consumer; @@ -71,11 +70,11 @@ public AwsValidateInfrastructureTests() _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -83,19 +82,20 @@ public async Task When_infrastructure_exists_can_verify() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue _consumer.Acknowledge(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); _consumer.Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify_by_arn.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify_by_arn.cs index eb01114833..ecdf5f6a38 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify_by_arn.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify_by_arn.cs @@ -9,22 +9,22 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -public class AwsValidateInfrastructureByArnTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsValidateInfrastructureByArnTests : IAsyncDisposable { - private readonly Message _message; - private readonly IAmAMessageConsumerAsync _consumer; - private readonly SnsMessageProducer _messageProducer; - private readonly ChannelFactory _channelFactory; - private readonly MyCommand _myCommand; - - public AwsValidateInfrastructureByArnTests() + private Message _message; + private IAmAMessageConsumerAsync _consumer; + private SnsMessageProducer _messageProducer; + private ChannelFactory _channelFactory; + private MyCommand _myCommand; + + [Before(Test)] + public async Task Setup() { _myCommand = new MyCommand { Value = "Test" }; string correlationId = Guid.NewGuid().ToString(); @@ -56,9 +56,9 @@ public AwsValidateInfrastructureByArnTests() //This doesn't look that different from our create tests - this is because we create using the channel factory in //our AWS transport, not the consumer (as it's a more likely to use infrastructure declared elsewhere) _channelFactory = new ChannelFactory(awsConnection); - var channel = _channelFactory.CreateAsyncChannel(subscription); + var channel = await _channelFactory.CreateAsyncChannelAsync(subscription); - var topicArn = FindTopicArn(awsConnection, routingKey.Value); + var topicArn = await FindTopicArn(awsConnection, routingKey.Value); var routingKeyArn = new RoutingKey(topicArn); //Now change the subscription to validate, just check what we made @@ -79,7 +79,7 @@ public AwsValidateInfrastructureByArnTests() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify() { //arrange @@ -91,20 +91,21 @@ public async Task When_infrastructure_exists_can_verify() //Assert var message = messages.First(); - Assert.NotEqual(MessageType.MT_NONE, message.Header.MessageType); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); ((IAmAMessageConsumerSync)_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() @@ -115,10 +116,10 @@ public async ValueTask DisposeAsync() await _messageProducer.DisposeAsync(); } - private static string FindTopicArn(AWSMessagingGatewayConnection connection, string topicName) + private static async Task FindTopicArn(AWSMessagingGatewayConnection connection, string topicName) { using var snsClient = new AWSClientFactory(connection).CreateSnsClient(); - var topicResponse = snsClient.FindTopicAsync(topicName).GetAwaiter().GetResult(); + var topicResponse = await snsClient.FindTopicAsync(topicName); return topicResponse.TopicArn; } } diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify_by_convention.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify_by_convention.cs index 69c3669b13..6e1077fbf1 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify_by_convention.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify_by_convention.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -public class AwsValidateInfrastructureByConventionTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsValidateInfrastructureByConventionTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerSync _consumer; @@ -69,11 +68,11 @@ public AwsValidateInfrastructureByConventionTests() _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -81,19 +80,20 @@ public async Task When_infrastructure_exists_can_verify() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue _consumer.Acknowledge(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); _consumer.Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_posting_a_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_posting_a_message_via_the_messaging_gateway.cs index 1ae3276b2d..e9b9b515cc 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_posting_a_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_posting_a_message_via_the_messaging_gateway.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerSendTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerSendTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -62,12 +61,12 @@ public SqsMessageProducerSendTests() new SnsPublication{Topic = new RoutingKey(_topicName), MakeChannels = OnMissingChannel.Create}); } - [Fact] + [Test] public async Task When_posting_a_message_via_the_producer() { //arrange _message.Header.Subject = "test subject"; - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -77,30 +76,31 @@ public async Task When_posting_a_message_via_the_producer() _channel.Acknowledge(message); //should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_topicName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_topicName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); //allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); //{"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_queues_missing_assume_throws.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_queues_missing_assume_throws.cs index ca98234a85..d8e6c30453 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_queues_missing_assume_throws.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_queues_missing_assume_throws.cs @@ -4,24 +4,24 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -public class AwsAssumeQueuesTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsAssumeQueuesTests : IAsyncDisposable { - private readonly ChannelFactory _channelFactory; - private readonly SqsMessageConsumer _consumer; + private ChannelFactory _channelFactory; + private SqsMessageConsumer _consumer; - public AwsAssumeQueuesTests() + [Before(Test)] + public async Task Setup() { var channelName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); string topicName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); var routingKey = new RoutingKey(topicName); - + var subscription = new SqsSubscription( subscriptionName: new SubscriptionName(channelName), channelName: new ChannelName(channelName), @@ -31,36 +31,37 @@ public AwsAssumeQueuesTests() makeChannels: OnMissingChannel.Assume, queueAttributes: new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }), topicAttributes: new SnsAttributes(tags: [new Tag { Key = "Environment", Value = "Test" }])); - + var awsConnection = GatewayFactory.CreateFactory(); - + //create the topic, we want the queue to be the issue //We need to create the topic at least, to check the queues - var producer = new SnsMessageProducer(awsConnection, + var producer = new SnsMessageProducer(awsConnection, new SnsPublication { - MakeChannels = OnMissingChannel.Create + MakeChannels = OnMissingChannel.Create }); - - producer.ConfirmTopicExistsAsync(topicName).Wait(); - + + await producer.ConfirmTopicExistsAsync(topicName); + _channelFactory = new ChannelFactory(awsConnection); var channel = _channelFactory.CreateSyncChannel(subscription); - + //We need to create the topic at least, to check the queues _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName()); } - [Fact] - public void When_queues_missing_assume_throws() + [Test] + public async Task When_queues_missing_assume_throws() { //we will try to get the queue url, and fail because it does not exist - Assert.Throws(() => _consumer.Receive(TimeSpan.FromMilliseconds(1000))); + await Assert.That(() => _consumer.Receive(TimeSpan.FromMilliseconds(1000))).ThrowsExactly(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_queues_missing_verify_throws.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_queues_missing_verify_throws.cs index 8793261de3..f684654695 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_queues_missing_verify_throws.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_queues_missing_verify_throws.cs @@ -4,25 +4,25 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -public class AwsValidateQueuesTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsValidateQueuesTests : IAsyncDisposable { - private readonly AWSMessagingGatewayConnection _awsConnection; - private readonly SqsSubscription _subscription; + private AWSMessagingGatewayConnection _awsConnection; + private SqsSubscription _subscription; private ChannelFactory? _channelFactory; - public AwsValidateQueuesTests() + [Before(Test)] + public async Task Setup() { var channelName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); string topicName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); var routingKey = new RoutingKey(topicName); - + _subscription = new SqsSubscription( subscriptionName: new SubscriptionName(channelName), channelName: new ChannelName(channelName), @@ -32,32 +32,33 @@ public AwsValidateQueuesTests() makeChannels: OnMissingChannel.Validate, queueAttributes: new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }), topicAttributes: new SnsAttributes(tags: [new Tag { Key = "Environment", Value = "Test" }])); - + _awsConnection = GatewayFactory.CreateFactory(); - + //We need to create the topic at least, to check the queues - var producer = new SnsMessageProducer(_awsConnection, + var producer = new SnsMessageProducer(_awsConnection, new SnsPublication { - MakeChannels = OnMissingChannel.Create + MakeChannels = OnMissingChannel.Create }); - producer.ConfirmTopicExistsAsync(topicName).Wait(); - + await producer.ConfirmTopicExistsAsync(topicName); + } - [Fact] - public void When_queues_missing_verify_throws() + [Test] + public async Task When_queues_missing_verify_throws() { //We have no queues so we should throw //We need to do this manually in a test - will create the channel from subscriber parameters _channelFactory = new ChannelFactory(_awsConnection); - Assert.Throws(() => _channelFactory.CreateSyncChannel(_subscription)); + await Assert.That(() => _channelFactory.CreateSyncChannel(_subscription)).ThrowsExactly(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { if (_channelFactory != null) - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_raw_message_delivery_disabled.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_raw_message_delivery_disabled.cs index 043a6650da..72e3fbfd92 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_raw_message_delivery_disabled.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_raw_message_delivery_disabled.cs @@ -5,13 +5,12 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -public class SqsRawMessageDeliveryTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsRawMessageDeliveryTests : IAsyncDisposable { private readonly SnsMessageProducer _messageProducer; private readonly ChannelFactory _channelFactory; @@ -48,8 +47,8 @@ public SqsRawMessageDeliveryTests() }); } - [Fact] - public void When_raw_message_delivery_disabled() + [Test] + public async Task When_raw_message_delivery_disabled() { //arrange var messageHeader = new MessageHeader( @@ -66,28 +65,29 @@ public void When_raw_message_delivery_disabled() var messageToSent = new Message(messageHeader, new MessageBody("test content one")); //act - _messageProducer.Send(messageToSent); + await _messageProducer.SendAsync(messageToSent); var messageReceived = _channel.Receive(TimeSpan.FromMilliseconds(10000)); _channel.Acknowledge(messageReceived); //assert - Assert.Equal(messageToSent.Id, messageReceived.Id); - Assert.Equal(messageToSent.Header.Topic, messageReceived.Header.Topic); - Assert.Equal(messageToSent.Header.MessageType, messageReceived.Header.MessageType); - Assert.Equal(messageToSent.Header.CorrelationId, messageReceived.Header.CorrelationId); - Assert.Equal(messageToSent.Header.ReplyTo, messageReceived.Header.ReplyTo); - Assert.Equal(messageToSent.Header.ContentType, messageReceived.Header.ContentType); - Assert.Contains(customHeaderItem.Key, messageReceived.Header.Bag); - Assert.Equal(customHeaderItem.Value, messageReceived.Header.Bag[customHeaderItem.Key]); - Assert.Equal(messageToSent.Body.Value, messageReceived.Body.Value); + await Assert.That(messageReceived.Id).IsEqualTo(messageToSent.Id); + await Assert.That(messageReceived.Header.Topic).IsEqualTo(messageToSent.Header.Topic); + await Assert.That(messageReceived.Header.MessageType).IsEqualTo(messageToSent.Header.MessageType); + await Assert.That(messageReceived.Header.CorrelationId).IsEqualTo(messageToSent.Header.CorrelationId); + await Assert.That(messageReceived.Header.ReplyTo).IsEqualTo(messageToSent.Header.ReplyTo); + await Assert.That(messageReceived.Header.ContentType).IsEqualTo(messageToSent.Header.ContentType); + await Assert.That(messageReceived.Header.Bag).ContainsKey(customHeaderItem.Key); + await Assert.That(messageReceived.Header.Bag[customHeaderItem.Key]).IsEqualTo(customHeaderItem.Value); + await Assert.That(messageReceived.Body.Value).IsEqualTo(messageToSent.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_rejecting_a_message_should_delete_from_queue.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_rejecting_a_message_should_delete_from_queue.cs index d917a0e962..f3e95c63b0 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_rejecting_a_message_should_delete_from_queue.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_rejecting_a_message_should_delete_from_queue.cs @@ -8,13 +8,12 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerRejectTests : IDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerRejectTests { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -58,11 +57,11 @@ public SqsMessageConsumerRejectTests() _messageProducer = new SnsMessageProducer(awsConnection, new SnsPublication{MakeChannels = OnMissingChannel.Create}); } - [Fact] - public void When_rejecting_a_message_should_delete_from_queue() + [Test] + public async Task When_rejecting_a_message_should_delete_from_queue() { //Arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); //Act @@ -71,13 +70,14 @@ public void When_rejecting_a_message_should_delete_from_queue() //Assert - message should be deleted, not requeued message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_requeueing_a_message.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_requeueing_a_message.cs index 32764d9ec3..13d1010cf5 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_requeueing_a_message.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_requeueing_a_message.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerRequeueTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerRequeueTests : IAsyncDisposable { private readonly IAmAMessageProducerSync _sender; private Message? _requeuedMessage; @@ -61,8 +60,8 @@ public SqsMessageProducerRequeueTests() _channel = _channelFactory.CreateSyncChannel(subscription); } - [Fact] - public void When_requeueing_a_message() + [Test] + public async Task When_requeueing_a_message() { _sender.Send(_message); _receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); @@ -73,13 +72,14 @@ public void When_requeueing_a_message() //clear the queue _channel.Acknowledge(_requeuedMessage ); - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_requeueing_redrives_to_the_dlq.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_requeueing_redrives_to_the_dlq.cs index d60073bb71..31dd674faf 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_requeueing_redrives_to_the_dlq.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_requeueing_redrives_to_the_dlq.cs @@ -10,23 +10,23 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageProducerDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageProducerDlqTests : IAsyncDisposable { - private readonly SnsMessageProducer _sender; - private readonly IAmAChannelSync _channel; - private readonly ChannelFactory _channelFactory; - private readonly Message _message; - private readonly AWSMessagingGatewayConnection _awsConnection; - private readonly string _dlqChannelName; - - public SqsMessageProducerDlqTests() + private SnsMessageProducer _sender; + private IAmAChannelSync _channel; + private ChannelFactory _channelFactory; + private Message _message; + private AWSMessagingGatewayConnection _awsConnection; + private string _dlqChannelName; + + [Before(Test)] + public async Task Setup() { MyCommand myCommand = new MyCommand { Value = "Test" }; string correlationId = Guid.NewGuid().ToString(); @@ -60,17 +60,17 @@ public SqsMessageProducerDlqTests() _sender = new SnsMessageProducer(_awsConnection, new SnsPublication { MakeChannels = OnMissingChannel.Create }); - _sender.ConfirmTopicExistsAsync(topicName).Wait(); + await _sender.ConfirmTopicExistsAsync(topicName); //We need to do this manually in a test - will create the channel from subscriber parameters _channelFactory = new ChannelFactory(_awsConnection); _channel = _channelFactory.CreateSyncChannel(subscription); } - [Fact] - public void When_requeueing_redrives_to_the_queue() + [Test] + public async Task When_requeueing_redrives_to_the_queue() { - _sender.Send(_message); + await _sender.SendAsync(_message); var receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); _channel.Requeue(receivedMessage); @@ -84,19 +84,19 @@ public void When_requeueing_redrives_to_the_queue() Task.Delay(5000); //inspect the dlq - Assert.Equal(1, GetDLQCount(_dlqChannelName)); + await Assert.That(await GetDLQCount(_dlqChannelName)).IsEqualTo(1); } - private int GetDLQCount(string queueName) + private async Task GetDLQCount(string queueName) { using var sqsClient = new AWSClientFactory(_awsConnection).CreateSqsClient(); - var queueUrlResponse = sqsClient.GetQueueUrlAsync(queueName).GetAwaiter().GetResult(); - var response = sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest + var queueUrlResponse = await sqsClient.GetQueueUrlAsync(queueName); + var response = await sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest { QueueUrl = queueUrlResponse.QueueUrl, WaitTimeSeconds = 5, MessageAttributeNames = new List { "All", "ApproximateReceiveCount" } - }).GetAwaiter().GetResult(); + }); if (response.HttpStatusCode != HttpStatusCode.OK) { @@ -107,10 +107,11 @@ private int GetDLQCount(string queueName) return response.Messages.Count; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_throwing_defer_action_respect_redrive.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_throwing_defer_action_respect_redrive.cs index 45d5998bf9..69a260bd3d 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_throwing_defer_action_respect_redrive.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_throwing_defer_action_respect_redrive.cs @@ -13,13 +13,12 @@ using Paramore.Brighter.MessagingGateway.AWSSQS; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SnsReDrivePolicySDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SnsReDrivePolicySDlqTests : IAsyncDisposable { private readonly IAmAMessagePump _messagePump; private readonly Message _message; @@ -117,17 +116,17 @@ public SnsReDrivePolicySDlqTests() }; } - private int GetDLQCount(string queueName) + private async Task GetDLQCount(string queueName) { - using var sqsClient = new AWSClientFactory(_awsConnection).CreateSqsClient(); - var queueUrlResponse = sqsClient.GetQueueUrlAsync(queueName).GetAwaiter().GetResult(); - var response = sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest + using var sqsClient = new AWSClientFactory(_awsConnection).CreateSqsClient(); + var queueUrlResponse = await sqsClient.GetQueueUrlAsync(queueName); + var response = await sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest { QueueUrl = queueUrlResponse.QueueUrl, WaitTimeSeconds = 5, MessageSystemAttributeNames = ["ApproximateReceiveCount"], MessageAttributeNames = new List { "All" } - }).GetAwaiter().GetResult(); + }); if (response.HttpStatusCode != HttpStatusCode.OK) { @@ -139,11 +138,11 @@ private int GetDLQCount(string queueName) } - [Fact] + [Test] public async Task When_throwing_defer_action_respect_redrive() { //put something on an SNS topic, which will be delivered to our SQS queue - _sender.Send(_message); + await _sender.SendAsync(_message); //start a message pump, let it process messages var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); @@ -159,13 +158,14 @@ public async Task When_throwing_defer_action_respect_redrive() await Task.Delay(5000); //inspect the dlq - Assert.Equal(1, GetDLQCount(_dlqChannelName)); + await Assert.That(await GetDLQCount(_dlqChannelName)).IsEqualTo(1); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_topic_missing_verify_throws.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_topic_missing_verify_throws.cs index cefa94068d..0e1920fd45 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_topic_missing_verify_throws.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sns/Standard/Reactor/When_topic_missing_verify_throws.cs @@ -1,11 +1,10 @@ -using System; +using System; using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AwsValidateMissingTopicTests { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -21,8 +20,8 @@ public AwsValidateMissingTopicTests() //Because we don't use channel factory to create the infrastructure -it won't exist } - [Fact] - public void When_topic_missing_verify_throws() + [Test] + public async Task When_topic_missing_verify_throws() { //arrange var producer = new SnsMessageProducer(_awsConnection, @@ -32,8 +31,11 @@ public void When_topic_missing_verify_throws() }); //act && assert - Assert.Throws(() => producer.Send(new Message( - new MessageHeader("", _routingKey, MessageType.MT_EVENT, type: new CloudEventsType("plain/text")), - new MessageBody("Test")))); + Assert.ThrowsExactly(() => + { + producer.Send(new Message( + new MessageHeader("", _routingKey, MessageType.MT_EVENT, type: new CloudEventsType("plain/text")), + new MessageBody("Test"))); + }); } } diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs index c82cd1b508..4cc0337cb2 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs @@ -6,23 +6,23 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsBufferedConsumerTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsBufferedConsumerTestsAsync : IAsyncDisposable { - private readonly SqsMessageProducer _messageProducer; - private readonly SqsMessageConsumer _consumer; - private readonly string _queueName; - private readonly ChannelFactory _channelFactory; + private SqsMessageProducer _messageProducer; + private SqsMessageConsumer _consumer; + private string _queueName; + private ChannelFactory _channelFactory; private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; private const int MessageCount = 4; - public SqsBufferedConsumerTestsAsync() + [Before(Test)] + public async Task Setup() { var awsConnection = GatewayFactory.CreateFactory(); @@ -38,8 +38,8 @@ public SqsBufferedConsumerTestsAsync() deduplicationScope: DeduplicationScope.MessageGroup, fifoThroughputLimit: FifoThroughputLimit.PerMessageGroupId, tags: new Dictionary { { "Environment", "Test" } }); - - var channel = _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( + + var channel = await _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( subscriptionName: new SubscriptionName(_queueName), channelName: channelName, channelType: ChannelType.PointToPoint, @@ -47,8 +47,7 @@ public SqsBufferedConsumerTestsAsync() bufferSize: BufferSize, queueAttributes: queueAttributes, messagePumpType: MessagePumpType.Proactor, - makeChannels: OnMissingChannel.Create)) - .GetAwaiter().GetResult(); + makeChannels: OnMissingChannel.Create)); //we want to access via a consumer, to receive multiple messages - we don't want to expose on channel //just for the tests, so create a new consumer from the properties @@ -58,7 +57,7 @@ public SqsBufferedConsumerTestsAsync() new SqsPublication(channelName: channelName, queueAttributes: queueAttributes, makeChannels: OnMissingChannel.Create)); } - [Fact] + [Test] public async Task When_a_message_consumer_reads_multiple_messages_async() { var routingKey = new RoutingKey(_queueName); @@ -120,10 +119,10 @@ public async Task When_a_message_consumer_reads_multiple_messages_async() //retrieve messages var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.True(messages.Length <= outstandingMessageCount); + await Assert.That(messages.Length <= outstandingMessageCount).IsTrue(); //should not receive more than buffer in one hit - Assert.True(messages.Length <= BufferSize); + await Assert.That(messages.Length <= BufferSize).IsTrue(); var moreMessages = messages.Where(m => m.Header.MessageType == MessageType.MT_COMMAND); foreach (var message in moreMessages) @@ -137,7 +136,7 @@ public async Task When_a_message_consumer_reads_multiple_messages_async() await Task.Delay(1000); } while ((iteration <= 5) && (messagesReceivedCount < MessageCount)); - Assert.Equal(4, messagesReceivedCount); + await Assert.That(messagesReceivedCount).IsEqualTo(4); } public async ValueTask DisposeAsync() @@ -147,10 +146,11 @@ public async ValueTask DisposeAsync() await _messageProducer.DisposeAsync(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().GetAwaiter().GetResult(); - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _messageProducer.DisposeAsync().GetAwaiter().GetResult(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } } diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infastructure_exists_can_assume_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infastructure_exists_can_assume_async.cs index 3d5fdab046..167fd414e6 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infastructure_exists_can_assume_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infastructure_exists_can_assume_async.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AwsAssumeInfrastructureTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AwsAssumeInfrastructureTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly SqsMessageConsumer _consumer; @@ -71,7 +70,7 @@ public AwsAssumeInfrastructureTestsAsync() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName(true)); } - [Fact] + [Test] public async Task When_infastructure_exists_can_assume() { //arrange @@ -81,17 +80,18 @@ public async Task When_infastructure_exists_can_assume() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infrastructure_exists_can_verify_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infrastructure_exists_can_verify_async.cs index 5e910cf263..179b0df72f 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infrastructure_exists_can_verify_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infrastructure_exists_can_verify_async.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AwsValidateInfrastructureTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AwsValidateInfrastructureTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerAsync _consumer; @@ -67,7 +66,7 @@ public AwsValidateInfrastructureTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify_async() { await _messageProducer.SendAsync(_message); @@ -77,18 +76,19 @@ public async Task When_infrastructure_exists_can_verify_async() var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); ((IAmAMessageConsumerSync)_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infrastructure_exists_can_verify_by_url_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infrastructure_exists_can_verify_by_url_async.cs index 12f883ebf6..7f16051660 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infrastructure_exists_can_verify_by_url_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infrastructure_exists_can_verify_by_url_async.cs @@ -7,22 +7,22 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AwsValidateInfrastructureByUrlTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AwsValidateInfrastructureByUrlTestsAsync : IAsyncDisposable { - private readonly Message _message; - private readonly IAmAMessageConsumerAsync _consumer; - private readonly SqsMessageProducer _messageProducer; - private readonly ChannelFactory _channelFactory; - private readonly MyCommand _myCommand; - - public AwsValidateInfrastructureByUrlTestsAsync() + private Message _message; + private IAmAMessageConsumerAsync _consumer; + private SqsMessageProducer _messageProducer; + private ChannelFactory _channelFactory; + private MyCommand _myCommand; + + [Before(Test)] + public async Task Setup() { _myCommand = new MyCommand { Value = "Test" }; const string replyTo = "http:\\queueUrl"; @@ -53,9 +53,9 @@ public AwsValidateInfrastructureByUrlTestsAsync() var awsConnection = GatewayFactory.CreateFactory(); _channelFactory = new ChannelFactory(awsConnection); - var channel = _channelFactory.CreateAsyncChannel(subscription); + var channel = await _channelFactory.CreateAsyncChannelAsync(subscription); - var queueUrl = FindQueueUrl(awsConnection, routingKey.ToValidSQSQueueName(true)).Result; + var queueUrl = await FindQueueUrl(awsConnection, routingKey.ToValidSQSQueueName(true)); subscription.MakeChannels = OnMissingChannel.Validate; @@ -72,7 +72,7 @@ public AwsValidateInfrastructureByUrlTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify_async() { await _messageProducer.SendAsync(_message); @@ -82,7 +82,7 @@ public async Task When_infrastructure_exists_can_verify_async() var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); await _consumer.AcknowledgeAsync(message); } @@ -94,13 +94,14 @@ private static async Task FindQueueUrl(AWSMessagingGatewayConnection con return topicResponse.QueueUrl; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); ((IAmAMessageConsumerSync)_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs index 0ba4f344e5..37cc0378cf 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerSendAsyncTests : IAsyncDisposable, IDisposable +[Category("AWS")] +public class SqsMessageProducerSendAsyncTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -72,7 +71,7 @@ public SqsMessageProducerSendAsyncTests() new SqsPublication(channelName: channelName, queueAttributes: queueAttributes, makeChannels: OnMissingChannel.Create)); } - [Fact] + [Test] public async Task When_posting_a_message_via_the_producer_async() { // arrange @@ -87,34 +86,35 @@ public async Task When_posting_a_message_via_the_producer_async() await _channel.AcknowledgeAsync(message); // should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_queueName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_queueName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); // allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); // {"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); - Assert.Equal(_messageGroupId, message.Header.PartitionKey); - Assert.Contains(HeaderNames.DeduplicationId, message.Header.Bag); - Assert.Equal(_deduplicationId, message.Header.Bag[HeaderNames.DeduplicationId]); + await Assert.That(message.Header.PartitionKey).IsEqualTo(_messageGroupId); + await Assert.That(message.Header.Bag).ContainsKey(HeaderNames.DeduplicationId); + await Assert.That(message.Header.Bag[HeaderNames.DeduplicationId]).IsEqualTo(_deduplicationId); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_queues_missing_assume_throws_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_queues_missing_assume_throws_async.cs index d2a10185e7..a3ec40015c 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_queues_missing_assume_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_queues_missing_assume_throws_async.cs @@ -4,13 +4,12 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -public class AwsAssumeQueuesTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +public class AwsAssumeQueuesTestsAsync : IAsyncDisposable { private readonly ChannelFactory _channelFactory; private readonly IAmAMessageConsumerAsync _consumer; @@ -39,7 +38,7 @@ public AwsAssumeQueuesTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_queues_missing_assume_throws_async() { //we will try to get the queue url, and fail because it does not exist @@ -47,9 +46,10 @@ await Assert.ThrowsAsync(async () => await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_queues_missing_verify_throws_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_queues_missing_verify_throws_async.cs index ce80e26df5..60de2a9244 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_queues_missing_verify_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_queues_missing_verify_throws_async.cs @@ -4,12 +4,11 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AwsValidateQueuesTestsAsync : IAsyncDisposable { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -34,7 +33,7 @@ public AwsValidateQueuesTestsAsync() _awsConnection = GatewayFactory.CreateFactory(); } - [Fact] + [Test] public async Task When_queues_missing_verify_throws_async() { // We have no queues so we should throw diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_raw_message_delivery_disabled_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_raw_message_delivery_disabled_async.cs index 1fa31a414b..75048b7f93 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_raw_message_delivery_disabled_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_raw_message_delivery_disabled_async.cs @@ -5,13 +5,12 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsRawMessageDeliveryTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsRawMessageDeliveryTestsAsync : IAsyncDisposable { private readonly SqsMessageProducer _messageProducer; private readonly ChannelFactory _channelFactory; @@ -55,7 +54,7 @@ public SqsRawMessageDeliveryTestsAsync() ); } - [Fact] + [Test] public async Task When_raw_message_delivery_disabled_async() { // Arrange @@ -83,24 +82,25 @@ public async Task When_raw_message_delivery_disabled_async() await _channel.AcknowledgeAsync(messageReceived); // Assert - Assert.Equal(messageToSend.Id, messageReceived.Id); - Assert.Equal(messageToSend.Header.Topic.ToValidSNSTopicName(true), messageReceived.Header.Topic); - Assert.Equal(messageToSend.Header.MessageType, messageReceived.Header.MessageType); - Assert.Equal(messageToSend.Header.CorrelationId, messageReceived.Header.CorrelationId); - Assert.Equal(messageToSend.Header.ReplyTo, messageReceived.Header.ReplyTo); - Assert.StartsWith(messageToSend.Header.ContentType?.ToString(), messageReceived.Header.ContentType?.ToString()); - Assert.Contains(customHeaderItem.Key, messageReceived.Header.Bag); - Assert.Equal(customHeaderItem.Value, messageReceived.Header.Bag[customHeaderItem.Key]); - Assert.Equal(messageToSend.Body.Value, messageReceived.Body.Value); - Assert.Equal(messageGroupId, messageReceived.Header.PartitionKey); - Assert.Contains(HeaderNames.DeduplicationId, messageReceived.Header.Bag); - Assert.Equal(deduplicationId, messageReceived.Header.Bag[HeaderNames.DeduplicationId]); + await Assert.That(messageReceived.Id).IsEqualTo(messageToSend.Id); + await Assert.That(messageReceived.Header.Topic).IsEqualTo(messageToSend.Header.Topic.ToValidSNSTopicName(true)); + await Assert.That(messageReceived.Header.MessageType).IsEqualTo(messageToSend.Header.MessageType); + await Assert.That(messageReceived.Header.CorrelationId).IsEqualTo(messageToSend.Header.CorrelationId); + await Assert.That(messageReceived.Header.ReplyTo).IsEqualTo(messageToSend.Header.ReplyTo); + await Assert.That(messageReceived.Header.ContentType?.ToString()).StartsWith(messageToSend.Header.ContentType?.ToString()); + await Assert.That(messageReceived.Header.Bag).ContainsKey(customHeaderItem.Key); + await Assert.That(messageReceived.Header.Bag[customHeaderItem.Key]).IsEqualTo(customHeaderItem.Value); + await Assert.That(messageReceived.Body.Value).IsEqualTo(messageToSend.Body.Value); + await Assert.That(messageReceived.Header.PartitionKey).IsEqualTo(messageGroupId); + await Assert.That(messageReceived.Header.Bag).ContainsKey(HeaderNames.DeduplicationId); + await Assert.That(messageReceived.Header.Bag[HeaderNames.DeduplicationId]).IsEqualTo(deduplicationId); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs index 06bd88cead..4d4a164b37 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerRejectTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerRejectTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -63,7 +62,7 @@ public SqsMessageConsumerRejectTestsAsync() ); } - [Fact] + [Test] public async Task When_rejecting_a_message_should_delete_from_queue_async() { //Arrange @@ -76,13 +75,14 @@ public async Task When_rejecting_a_message_should_delete_from_queue_async() //Assert - message should be deleted, not requeued message = await _channel.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq_async.cs index 9a78e07c24..6cc13724c2 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq_async.cs @@ -30,13 +30,12 @@ THE SOFTWARE. */ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerFifoDeliveryErrorDlqTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerFifoDeliveryErrorDlqTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -107,7 +106,7 @@ public SqsMessageConsumerFifoDeliveryErrorDlqTestsAsync() _dlqChannel = _dlqChannelFactory.CreateAsyncChannel(dlqSubscription); } - [Fact] + [Test] public async Task When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq_async() { //Arrange @@ -121,32 +120,33 @@ public async Task When_rejecting_fifo_message_with_delivery_error_should_send_to //Assert - message should appear on DLQ var dlqMessage = await _dlqChannel.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); //verify FIFO attributes are preserved on DLQ message - Assert.Equal(_messageGroupId, dlqMessage.Header.PartitionKey); + await Assert.That(dlqMessage.Header.PartitionKey).IsEqualTo(_messageGroupId); //verify rejection metadata was added - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(originalTopic, dlqMessage.Header.Bag["originalTopic"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.DeliveryError.ToString(), dlqMessage.Header.Bag["rejectionReason"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal(MessageType.MT_COMMAND.ToString(), dlqMessage.Header.Bag["originalMessageType"].ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalTopic"].ToString()).IsEqualTo(originalTopic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.DeliveryError.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalMessageType"].ToString()).IsEqualTo(MessageType.MT_COMMAND.ToString()); //verify original message is deleted from source queue var sourceMessage = await _channel.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, sourceMessage.Header.MessageType); + await Assert.That(sourceMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _dlqChannelFactory.DeleteTopicAsync().Wait(); - _dlqChannelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _dlqChannelFactory.DeleteTopicAsync(); + await _dlqChannelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_requeueing_a_message_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_requeueing_a_message_async.cs index e41357e9f4..ec5fcab28f 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_requeueing_a_message_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_requeueing_a_message_async.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerRequeueTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerRequeueTestsAsync : IAsyncDisposable { private readonly IAmAMessageProducerAsync _sender; private Message? _requeuedMessage; @@ -61,7 +60,7 @@ public SqsMessageProducerRequeueTestsAsync() _channel = _channelFactory.CreateAsyncChannel(subscription); } - [Fact] + [Test] public async Task When_requeueing_a_message_async() { await _sender.SendAsync(_message); @@ -72,13 +71,14 @@ public async Task When_requeueing_a_message_async() await _channel.AcknowledgeAsync(_requeuedMessage); - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_requeueing_redrives_to_the_dlq_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_requeueing_redrives_to_the_dlq_async.cs index 7cb781618d..20736e79da 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_requeueing_redrives_to_the_dlq_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_requeueing_redrives_to_the_dlq_async.cs @@ -9,14 +9,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageProducerDlqTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageProducerDlqTestsAsync : IAsyncDisposable { private readonly SqsMessageProducer _sender; private readonly IAmAChannelAsync _channel; @@ -69,7 +68,7 @@ public SqsMessageProducerDlqTestsAsync() _channel = _channelFactory.CreateAsyncChannel(subscription); } - [Fact] + [Test] public async Task When_requeueing_redrives_to_the_queue_async() { await _sender.SendAsync(_message); @@ -85,7 +84,7 @@ public async Task When_requeueing_redrives_to_the_queue_async() await Task.Delay(5000); int dlqCount = await GetDLQCountAsync(_dlqChannelName.ToValidSQSQueueName(true)); - Assert.Equal(1, dlqCount); + await Assert.That(dlqCount).IsEqualTo(1); } private async Task GetDLQCountAsync(string queueName) @@ -108,10 +107,11 @@ private async Task GetDLQCountAsync(string queueName) return response.Messages.Count; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_throwing_defer_action_respect_redrive_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_throwing_defer_action_respect_redrive_async.cs index c76d8a0288..c6cb3de602 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_throwing_defer_action_respect_redrive_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_throwing_defer_action_respect_redrive_async.cs @@ -12,13 +12,12 @@ using Paramore.Brighter.MessagingGateway.AWSSQS; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SnsReDrivePolicySDlqTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SnsReDrivePolicySDlqTestsAsync : IAsyncDisposable { private readonly IAmAMessagePump _messagePump; private readonly Message _message; @@ -127,7 +126,7 @@ public async Task GetDLQCountAsync(string queueName) return response.Messages.Count; } - [Fact(Skip = "This test is skipped because running tests of the DLQ is unreliable in the CI environment")] + [Test, Skip("This test is skipped because running tests of the DLQ is unreliable in the CI environment")] public async Task When_throwing_defer_action_respect_redrive_async() { await _sender.SendAsync(_message); @@ -143,13 +142,14 @@ public async Task When_throwing_defer_action_respect_redrive_async() await Task.Delay(5000); var dlqCount = await GetDLQCountAsync(_dlqChannelName + ".fifo"); - Assert.Equal(1, dlqCount); + await Assert.That(dlqCount).IsEqualTo(1); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_topic_missing_verify_throws_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_topic_missing_verify_throws_async.cs index 67ff91a4be..9d9acf6bce 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_topic_missing_verify_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_topic_missing_verify_throws_async.cs @@ -3,12 +3,11 @@ using Amazon.SQS.Model; using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AwsValidateMissingTopicTestsAsync { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -25,7 +24,7 @@ public AwsValidateMissingTopicTestsAsync() // Because we don't use channel factory to create the infrastructure - it won't exist } - [Fact] + [Test] public async Task When_queue_missing_verify_throws_async() { // arrange diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_a_message_consumer_reads_multiple_messages.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_a_message_consumer_reads_multiple_messages.cs index 920a9cc001..eaebd6dce6 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_a_message_consumer_reads_multiple_messages.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_a_message_consumer_reads_multiple_messages.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsBufferedConsumerTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsBufferedConsumerTests : IAsyncDisposable { private readonly SqsMessageProducer _messageProducer; private readonly SqsMessageConsumer _consumer; @@ -62,7 +61,7 @@ public SqsBufferedConsumerTests() )); } - [Fact] + [Test] public async Task When_a_message_consumer_reads_multiple_messages() { var routingKey = new RoutingKey(_queueName); @@ -109,11 +108,11 @@ public async Task When_a_message_consumer_reads_multiple_messages() ); //send MESSAGE_COUNT messages - _messageProducer.Send(messageOne); - _messageProducer.Send(messageTwo); - _messageProducer.Send(messageThree); - _messageProducer.Send(messageFour); - _messageProducer.Send(messageFive); + await _messageProducer.SendAsync(messageOne); + await _messageProducer.SendAsync(messageTwo); + await _messageProducer.SendAsync(messageThree); + await _messageProducer.SendAsync(messageFour); + await _messageProducer.SendAsync(messageFive); int iteration = 0; @@ -125,18 +124,18 @@ public async Task When_a_message_consumer_reads_multiple_messages() var outstandingMessageCount = MessageCount - messagesReceivedCount; //retrieve messages - var messages = _consumer.Receive(TimeSpan.FromMilliseconds(10000)); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.True(messages.Length <= outstandingMessageCount); + await Assert.That(messages.Length <= outstandingMessageCount).IsTrue(); //should not receive more than buffer in one hit - Assert.True(messages.Length <= BufferSize); + await Assert.That(messages.Length <= BufferSize).IsTrue(); var moreMessages = messages.Where(m => m.Header.MessageType == MessageType.MT_COMMAND); foreach (var message in moreMessages) { messagesReceived.Add(message); - _consumer.Acknowledge(message); + await _consumer.AcknowledgeAsync(message); } messagesReceivedCount = messagesReceived.Count; @@ -145,15 +144,16 @@ public async Task When_a_message_consumer_reads_multiple_messages() } while ((iteration <= 5) && (messagesReceivedCount < MessageCount)); - Assert.Equal(4, messagesReceivedCount); + await Assert.That(messagesReceivedCount).IsEqualTo(4); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_assume.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_assume.cs index ad14259cf7..db36ec7cd8 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_assume.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_assume.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AwsAssumeInfrastructureTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AwsAssumeInfrastructureTests : IAsyncDisposable { private readonly Message _message; private readonly SqsMessageConsumer _consumer; @@ -69,27 +68,28 @@ public AwsAssumeInfrastructureTests() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName(true)); } - [Fact] - public void When_infastructure_exists_can_assume() + [Test] + public async Task When_infastructure_exists_can_assume() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); - var messages = _consumer.Receive(TimeSpan.FromMilliseconds(5000)); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue - _consumer.Acknowledge(message); + await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_verify.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_verify.cs index ac6d2bbdbf..f05120586d 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_verify.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_verify.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AwsValidateInfrastructureTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AwsValidateInfrastructureTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerSync _consumer; @@ -74,11 +73,11 @@ public AwsValidateInfrastructureTests() _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -86,19 +85,20 @@ public async Task When_infrastructure_exists_can_verify() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue _consumer.Acknowledge(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); _consumer.Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_verify_by_url.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_verify_by_url.cs index 6c69d9cb6d..bc0b8a4ad9 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_verify_by_url.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_verify_by_url.cs @@ -7,22 +7,22 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AwsValidateInfrastructureByUrlTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AwsValidateInfrastructureByUrlTests : IAsyncDisposable { - private readonly Message _message; - private readonly IAmAMessageConsumerSync _consumer; - private readonly SqsMessageProducer _messageProducer; - private readonly ChannelFactory _channelFactory; - private readonly MyCommand _myCommand; - - public AwsValidateInfrastructureByUrlTests () + private Message _message; + private IAmAMessageConsumerSync _consumer; + private SqsMessageProducer _messageProducer; + private ChannelFactory _channelFactory; + private MyCommand _myCommand; + + [Before(Test)] + public async Task Setup() { var replyTo = new RoutingKey("http:\\queueUrl"); var contentType = new ContentType(MediaTypeNames.Text.Plain); @@ -62,7 +62,7 @@ public AwsValidateInfrastructureByUrlTests () _channelFactory = new ChannelFactory(awsConnection); var channel = _channelFactory.CreateSyncChannel(subscription); - var queueUrl = FindQueueUrl(awsConnection, routingKey.ToValidSQSQueueName(true)); + var queueUrl = await FindQueueUrl(awsConnection, routingKey.ToValidSQSQueueName(true)); //Now change the subscription to validate, just check what we made subscription.MakeChannels = OnMissingChannel.Validate; @@ -81,11 +81,11 @@ public AwsValidateInfrastructureByUrlTests () _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -93,19 +93,20 @@ public async Task When_infrastructure_exists_can_verify() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue _consumer.Acknowledge(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); _consumer.Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() @@ -116,10 +117,10 @@ public async ValueTask DisposeAsync() await _messageProducer.DisposeAsync(); } - private static string FindQueueUrl(AWSMessagingGatewayConnection connection, string queueName) + private static async Task FindQueueUrl(AWSMessagingGatewayConnection connection, string queueName) { - using var snsClient = new AWSClientFactory(connection).CreateSqsClient(); - var topicResponse = snsClient.GetQueueUrlAsync(queueName).GetAwaiter().GetResult(); + using var snsClient = new AWSClientFactory(connection).CreateSqsClient(); + var topicResponse = await snsClient.GetQueueUrlAsync(queueName); return topicResponse.QueueUrl; } } diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_posting_a_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_posting_a_message_via_the_messaging_gateway.cs index dfd107352d..8511cefc41 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_posting_a_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_posting_a_message_via_the_messaging_gateway.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerSendAsyncTests : IAsyncDisposable, IDisposable +[Category("AWS")] +public class SqsMessageProducerSendAsyncTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -71,14 +70,14 @@ public SqsMessageProducerSendAsyncTests() ); } - [Fact] - public void When_posting_a_message_via_the_producer() + [Test] + public async Task When_posting_a_message_via_the_producer() { // arrange _message.Header.Subject = "test subject"; - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); - Task.Delay(1000).GetAwaiter().GetResult(); + await Task.Delay(1000); var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); @@ -86,34 +85,35 @@ public void When_posting_a_message_via_the_producer() _channel.Acknowledge(message); // should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_queueName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_queueName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); // allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); // {"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); - Assert.Equal(_messageGroupId, message.Header.PartitionKey); - Assert.Contains(HeaderNames.DeduplicationId, message.Header.Bag); - Assert.Equal(_deduplicationId, message.Header.Bag[HeaderNames.DeduplicationId]); + await Assert.That(message.Header.PartitionKey).IsEqualTo(_messageGroupId); + await Assert.That(message.Header.Bag).ContainsKey(HeaderNames.DeduplicationId); + await Assert.That(message.Header.Bag[HeaderNames.DeduplicationId]).IsEqualTo(_deduplicationId); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_queues_missing_assume_throws.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_queues_missing_assume_throws.cs index 56c4d7fc9d..5eda21a309 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_queues_missing_assume_throws.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_queues_missing_assume_throws.cs @@ -4,13 +4,12 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -public class AWSAssumeQueuesTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AWSAssumeQueuesTests : IAsyncDisposable { private readonly ChannelFactory _channelFactory; private readonly SqsMessageConsumer _consumer; @@ -40,16 +39,17 @@ public AWSAssumeQueuesTests() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName()); } - [Fact] - public void When_queues_missing_assume_throws() + [Test] + public async Task When_queues_missing_assume_throws() { //we will try to get the queue url, and fail because it does not exist - Assert.Throws(() => _consumer.Receive(TimeSpan.FromMilliseconds(1000))); + await Assert.That(() => _consumer.Receive(TimeSpan.FromMilliseconds(1000))).ThrowsExactly(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_queues_missing_verify_throws.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_queues_missing_verify_throws.cs index 7113cd218a..26e0ab6039 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_queues_missing_verify_throws.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_queues_missing_verify_throws.cs @@ -4,12 +4,11 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AWSValidateQueuesTests : IAsyncDisposable { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -37,13 +36,13 @@ public AWSValidateQueuesTests() _awsConnection = GatewayFactory.CreateFactory(); } - [Fact] - public void When_queues_missing_verify_throws() + [Test] + public async Task When_queues_missing_verify_throws() { // We have no queues so we should throw // We need to do this manually in a test - will create the channel from subscriber parameters _channelFactory = new ChannelFactory(_awsConnection); - Assert.Throws(() => _channelFactory.CreateAsyncChannel(_subscription)); + await Assert.That(() => _channelFactory.CreateAsyncChannel(_subscription)).ThrowsExactly(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_rejecting_a_message_should_delete_from_queue.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_rejecting_a_message_should_delete_from_queue.cs index d27d62e842..7ae11f7033 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_rejecting_a_message_should_delete_from_queue.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_rejecting_a_message_should_delete_from_queue.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerRejectTests : IDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerRejectTests { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -59,11 +58,11 @@ public SqsMessageConsumerRejectTests() ); } - [Fact] - public void When_rejecting_a_message_should_delete_from_queue() + [Test] + public async Task When_rejecting_a_message_should_delete_from_queue() { //Arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); //Act @@ -72,13 +71,14 @@ public void When_rejecting_a_message_should_delete_from_queue() //Assert - message should be deleted, not requeued message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq.cs index 1984144559..20415e9a32 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq.cs @@ -30,13 +30,12 @@ THE SOFTWARE. */ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerFifoDeliveryErrorDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerFifoDeliveryErrorDlqTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -107,11 +106,11 @@ public SqsMessageConsumerFifoDeliveryErrorDlqTests() _dlqChannel = _dlqChannelFactory.CreateSyncChannel(dlqSubscription); } - [Fact] - public void When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq() + [Test] + public async Task When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq() { //Arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); //Act @@ -121,32 +120,33 @@ public void When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq() //Assert - message should appear on DLQ var dlqMessage = _dlqChannel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); //verify FIFO attributes are preserved on DLQ message - Assert.Equal(_messageGroupId, dlqMessage.Header.PartitionKey); + await Assert.That(dlqMessage.Header.PartitionKey).IsEqualTo(_messageGroupId); //verify rejection metadata was added - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(originalTopic, dlqMessage.Header.Bag["originalTopic"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.DeliveryError.ToString(), dlqMessage.Header.Bag["rejectionReason"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal(MessageType.MT_COMMAND.ToString(), dlqMessage.Header.Bag["originalMessageType"].ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalTopic"].ToString()).IsEqualTo(originalTopic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.DeliveryError.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalMessageType"].ToString()).IsEqualTo(MessageType.MT_COMMAND.ToString()); //verify original message is deleted from source queue var sourceMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, sourceMessage.Header.MessageType); + await Assert.That(sourceMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _dlqChannelFactory.DeleteTopicAsync().Wait(); - _dlqChannelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _dlqChannelFactory.DeleteTopicAsync(); + await _dlqChannelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_requeueing_a_message.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_requeueing_a_message.cs index 0b14c11b17..6e1dcb8446 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_requeueing_a_message.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_requeueing_a_message.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerRequeueTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerRequeueTests : IAsyncDisposable { private readonly IAmAMessageProducerSync _sender; private Message _requeuedMessage; @@ -63,8 +62,8 @@ public SqsMessageProducerRequeueTests() _channel = _channelFactory.CreateSyncChannel(subscription); } - [Fact] - public void When_requeueing_a_message() + [Test] + public async Task When_requeueing_a_message() { _sender.Send(_message); _receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); @@ -74,13 +73,14 @@ public void When_requeueing_a_message() _channel.Acknowledge(_requeuedMessage); - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_requeueing_redrives_to_the_dlq.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_requeueing_redrives_to_the_dlq.cs index e0f95e877a..2fbb42c5d3 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_requeueing_redrives_to_the_dlq.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_requeueing_redrives_to_the_dlq.cs @@ -9,14 +9,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageProducerDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageProducerDlqTests : IAsyncDisposable { private readonly SqsMessageProducer _sender; private readonly IAmAChannelSync _channel; @@ -71,10 +70,10 @@ public SqsMessageProducerDlqTests() _channel = _channelFactory.CreateSyncChannel(subscription); } - [Fact] - public void When_requeueing_redrives_to_the_queue() + [Test] + public async Task When_requeueing_redrives_to_the_queue() { - _sender.Send(_message); + await _sender.SendAsync(_message); var receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); _channel.Requeue(receivedMessage); @@ -88,19 +87,19 @@ public void When_requeueing_redrives_to_the_queue() Task.Delay(5000); //inspect the dlq - Assert.Equal(1, GetDLQCount(_dlqChannelName + ".fifo")); + await Assert.That(await GetDLQCount(_dlqChannelName + ".fifo")).IsEqualTo(1); } - private int GetDLQCount(string queueName) + private async Task GetDLQCount(string queueName) { using var sqsClient = new AWSClientFactory(_awsConnection).CreateSqsClient(); - var queueUrlResponse = sqsClient.GetQueueUrlAsync(queueName).GetAwaiter().GetResult(); - var response = sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest + var queueUrlResponse = await sqsClient.GetQueueUrlAsync(queueName); + var response = await sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest { QueueUrl = queueUrlResponse.QueueUrl, WaitTimeSeconds = 5, MessageAttributeNames = ["All", "ApproximateReceiveCount"] - }).GetAwaiter().GetResult(); + }); if (response.HttpStatusCode != HttpStatusCode.OK) { @@ -111,10 +110,11 @@ private int GetDLQCount(string queueName) return response.Messages.Count; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_throwing_defer_action_respect_redrive.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_throwing_defer_action_respect_redrive.cs index 3804fbe7be..cf935901d5 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_throwing_defer_action_respect_redrive.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_throwing_defer_action_respect_redrive.cs @@ -12,13 +12,12 @@ using Paramore.Brighter.MessagingGateway.AWSSQS; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SnsReDrivePolicySDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SnsReDrivePolicySDlqTests : IAsyncDisposable { private readonly IAmAMessagePump _messagePump; private readonly Message _message; @@ -105,17 +104,17 @@ public SnsReDrivePolicySDlqTests() }; } - public int GetDLQCountAsync(string queueName) + public async Task GetDLQCountAsync(string queueName) { using var sqsClient = new AWSClientFactory(_awsConnection).CreateSqsClient(); - var queueUrlResponse = sqsClient.GetQueueUrlAsync(queueName.ToValidSQSQueueName(true)).GetAwaiter().GetResult(); - var response = sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest + var queueUrlResponse = await sqsClient.GetQueueUrlAsync(queueName.ToValidSQSQueueName(true)); + var response = await sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest { QueueUrl = queueUrlResponse.QueueUrl, WaitTimeSeconds = 5, MessageSystemAttributeNames = ["ApproximateReceiveCount"], MessageAttributeNames = new List { "All" } - }).GetAwaiter().GetResult(); + }); if (response.HttpStatusCode != HttpStatusCode.OK) { @@ -126,29 +125,30 @@ public int GetDLQCountAsync(string queueName) return response.Messages.Count; } - [Fact(Skip = "This test is skipped because running tests of the DLQ is unreliable in the CI environment")] - public void When_throwing_defer_action_respect_redrive_async() + [Test, Skip("This test is skipped because running tests of the DLQ is unreliable in the CI environment")] + public async Task When_throwing_defer_action_respect_redrive_async() { - _sender.Send(_message); + await _sender.SendAsync(_message); var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); - Task.Delay(5000).GetAwaiter().GetResult(); + await Task.Delay(5000); var quitMessage = MessageFactory.CreateQuitMessage(_subscription.RoutingKey); _channel.Enqueue(quitMessage); - Task.WaitAll(task); + await task; - Task.Delay(5000).GetAwaiter().GetResult(); + await Task.Delay(5000); - var dlqCount = GetDLQCountAsync(_dlqChannelName); - Assert.Equal(1, dlqCount); + var dlqCount = await GetDLQCountAsync(_dlqChannelName); + await Assert.That(dlqCount).IsEqualTo(1); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_topic_missing_verify_throws.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_topic_missing_verify_throws.cs index e18511000f..a462f5c8d3 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_topic_missing_verify_throws.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_topic_missing_verify_throws.cs @@ -1,13 +1,12 @@ -using System; +using System; using System.Collections.Generic; using Amazon.SQS.Model; using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AWSValidateMissingTopicTests { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -23,8 +22,8 @@ public AWSValidateMissingTopicTests() // Because we don't use channel factory to create the infrastructure - it won't exist } - [Fact] - public void When_channel_missing_verify_throws() + [Test] + public async Task When_channel_missing_verify_throws() { // arrange var producer = new SqsMessageProducer( @@ -39,10 +38,12 @@ public void When_channel_missing_verify_throws() var messageGroupId = $"MessageGroup{Guid.NewGuid():N}"; // act & assert - Assert.Throws(() => + Assert.ThrowsExactly(() => + { producer.Send(new Message( new MessageHeader("", _routingKey, MessageType.MT_EVENT, type: new CloudEventsType("plain/text"), partitionKey: messageGroupId), - new MessageBody("Test")))); + new MessageBody("Test"))); + }); } } diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs index 8a538e1cc6..8c1e7be081 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs @@ -6,23 +6,23 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SQSBufferedConsumerTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SQSBufferedConsumerTestsAsync : IAsyncDisposable { - private readonly SqsMessageProducer _messageProducer; - private readonly SqsMessageConsumer _consumer; - private readonly string _queueName; - private readonly ChannelFactory _channelFactory; + private SqsMessageProducer _messageProducer; + private SqsMessageConsumer _consumer; + private string _queueName; + private ChannelFactory _channelFactory; private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; private const int MessageCount = 4; - public SQSBufferedConsumerTestsAsync() + [Before(Test)] + public async Task Setup() { var awsConnection = GatewayFactory.CreateFactory(); @@ -33,16 +33,15 @@ public SQSBufferedConsumerTestsAsync() //we need the channel to create the queues and notifications var routingKey = new RoutingKey(_queueName); var channelName = new ChannelName(_queueName); - - var channel = _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( + + var channel = await _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( subscriptionName: new SubscriptionName(subscriptionName), channelName: channelName, - channelType: ChannelType.PointToPoint, - routingKey: routingKey, - bufferSize: BufferSize, + channelType: ChannelType.PointToPoint, + routingKey: routingKey, + bufferSize: BufferSize, makeChannels: OnMissingChannel.Create, - queueAttributes: new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }))) - .GetAwaiter().GetResult(); + queueAttributes: new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }))); //we want to access via a consumer, to receive multiple messages - we don't want to expose on channel //just for the tests, so create a new consumer from the properties @@ -53,7 +52,7 @@ public SQSBufferedConsumerTestsAsync() ); } - [Fact] + [Test] public async Task When_a_message_consumer_reads_multiple_messages_async() { var routingKey = new RoutingKey(_queueName); @@ -99,10 +98,10 @@ public async Task When_a_message_consumer_reads_multiple_messages_async() //retrieve messages var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.True(messages.Length <= outstandingMessageCount); + await Assert.That(messages.Length <= outstandingMessageCount).IsTrue(); //should not receive more than buffer in one hit - Assert.True(messages.Length <= BufferSize); + await Assert.That(messages.Length <= BufferSize).IsTrue(); var moreMessages = messages.Where(m => m.Header.MessageType == MessageType.MT_COMMAND); foreach (var message in moreMessages) @@ -117,7 +116,7 @@ public async Task When_a_message_consumer_reads_multiple_messages_async() } while ((iteration <= 5) && (messagesReceivedCount < MessageCount)); - Assert.Equal(4, messagesReceivedCount); + await Assert.That(messagesReceivedCount).IsEqualTo(4); } public async ValueTask DisposeAsync() @@ -127,10 +126,11 @@ public async ValueTask DisposeAsync() await _messageProducer.DisposeAsync(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().GetAwaiter().GetResult(); - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _messageProducer.DisposeAsync().GetAwaiter().GetResult(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } } diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_customising_aws_client_config_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_customising_aws_client_config_async.cs index 8ae5d61eb0..7cc722fca2 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_customising_aws_client_config_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_customising_aws_client_config_async.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -public class CustomisingAwsClientConfigTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +public class CustomisingAwsClientConfigTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -65,7 +64,7 @@ public CustomisingAwsClientConfigTestsAsync() ); } - [Fact] + [Test] public async Task When_customising_aws_client_config() { //arrange @@ -79,18 +78,19 @@ public async Task When_customising_aws_client_config() await _channel.AcknowledgeAsync(message); //publish_and_subscribe_should_use_custom_http_client_factory - Assert.Contains("sqs_async_sub", InterceptingDelegatingHandler.RequestCount); - Assert.True((InterceptingDelegatingHandler.RequestCount["sqs_async_sub"]) > (0)); + await Assert.That(InterceptingDelegatingHandler.RequestCount).ContainsKey("sqs_async_sub"); + await Assert.That((InterceptingDelegatingHandler.RequestCount["sqs_async_sub"]) > (0)).IsTrue(); - Assert.Contains("sqs_async_pub", InterceptingDelegatingHandler.RequestCount); - Assert.True((InterceptingDelegatingHandler.RequestCount["sqs_async_pub"]) > (0)); + await Assert.That(InterceptingDelegatingHandler.RequestCount).ContainsKey("sqs_async_pub"); + await Assert.That((InterceptingDelegatingHandler.RequestCount["sqs_async_pub"]) > (0)).IsTrue(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_assume_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_assume_async.cs index 32ddae4f3a..2dd5ce6528 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_assume_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_assume_async.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AWSAssumeInfrastructureTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AWSAssumeInfrastructureTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly SqsMessageConsumer _consumer; @@ -67,7 +66,7 @@ public AWSAssumeInfrastructureTestsAsync() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName()); } - [Fact] + [Test] public async Task When_infastructure_exists_can_assume() { //arrange @@ -77,17 +76,18 @@ public async Task When_infastructure_exists_can_assume() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_verify_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_verify_async.cs index 03acba2f5d..e19f00cc1d 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_verify_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_verify_async.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Proactor { - [Trait("Category", "AWS")] - [Trait("Fragile", "CI")] - public class AwsValidateInfrastructureTestsAsync : IDisposable, IAsyncDisposable + [Category("AWS")] + [Property("Fragile", "CI")] + public class AwsValidateInfrastructureTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerAsync _consumer; @@ -64,7 +63,7 @@ public AwsValidateInfrastructureTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify_async() { await _messageProducer.SendAsync(_message); @@ -74,18 +73,19 @@ public async Task When_infrastructure_exists_can_verify_async() var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); ((IAmAMessageConsumerSync)_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_verify_by_url.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_verify_by_url.cs index b32e0faabf..eb2fbd1be9 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_verify_by_url.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_verify_by_url.cs @@ -7,22 +7,22 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AWSValidateInfrastructureByUrlTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AWSValidateInfrastructureByUrlTests : IAsyncDisposable { - private readonly Message _message; - private readonly IAmAMessageConsumerSync _consumer; - private readonly SqsMessageProducer _messageProducer; - private readonly ChannelFactory _channelFactory; - private readonly MyCommand _myCommand; - - public AWSValidateInfrastructureByUrlTests() + private Message _message; + private IAmAMessageConsumerSync _consumer; + private SqsMessageProducer _messageProducer; + private ChannelFactory _channelFactory; + private MyCommand _myCommand; + + [Before(Test)] + public async Task Setup() { _myCommand = new MyCommand { Value = "Test" }; var replyTo = new RoutingKey("http:\\queueUrl"); @@ -51,7 +51,7 @@ public AWSValidateInfrastructureByUrlTests() _channelFactory = new ChannelFactory(awsConnection); var channel = _channelFactory.CreateSyncChannel(subscription); - var queueUrl = FindQueueUrl(awsConnection, routingKey.Value); + var queueUrl = await FindQueueUrl(awsConnection, routingKey.Value); //Now change the subscription to validate, just check what we made subscription = new SqsSubscription( @@ -76,11 +76,11 @@ public AWSValidateInfrastructureByUrlTests() _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -88,19 +88,20 @@ public async Task When_infrastructure_exists_can_verify() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue _consumer.Acknowledge(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); _consumer.Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() @@ -111,10 +112,10 @@ public async ValueTask DisposeAsync() await _messageProducer.DisposeAsync(); } - private static string FindQueueUrl(AWSMessagingGatewayConnection connection, string queueName) + private static async Task FindQueueUrl(AWSMessagingGatewayConnection connection, string queueName) { using var snsClient = new AWSClientFactory(connection).CreateSqsClient(); - var topicResponse = snsClient.GetQueueUrlAsync(queueName).GetAwaiter().GetResult(); + var topicResponse = await snsClient.GetQueueUrlAsync(queueName); return topicResponse.QueueUrl; } } diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_verify_by_url_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_verify_by_url_async.cs index 4973c64b2d..fd3d4fc2f2 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_verify_by_url_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_verify_by_url_async.cs @@ -7,22 +7,22 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AwsValidateInfrastructureByUrlTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AwsValidateInfrastructureByUrlTestsAsync : IAsyncDisposable { - private readonly Message _message; - private readonly IAmAMessageConsumerAsync _consumer; - private readonly SqsMessageProducer _messageProducer; - private readonly ChannelFactory _channelFactory; - private readonly MyCommand _myCommand; - - public AwsValidateInfrastructureByUrlTestsAsync() + private Message _message; + private IAmAMessageConsumerAsync _consumer; + private SqsMessageProducer _messageProducer; + private ChannelFactory _channelFactory; + private MyCommand _myCommand; + + [Before(Test)] + public async Task Setup() { _myCommand = new MyCommand { Value = "Test" }; const string replyTo = "http:\\queueUrl"; @@ -52,9 +52,9 @@ public AwsValidateInfrastructureByUrlTestsAsync() var awsConnection = GatewayFactory.CreateFactory(); _channelFactory = new ChannelFactory(awsConnection); - var channel = _channelFactory.CreateAsyncChannel(subscription); + var channel = await _channelFactory.CreateAsyncChannelAsync(subscription); - var queueUrl = FindQueueUrl(awsConnection, routingKey.Value).Result; + var queueUrl = await FindQueueUrl(awsConnection, routingKey.Value); subscription = new( subscriptionName: new SubscriptionName(subscriptionName), @@ -77,7 +77,7 @@ public AwsValidateInfrastructureByUrlTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify_async() { await _messageProducer.SendAsync(_message); @@ -87,7 +87,7 @@ public async Task When_infrastructure_exists_can_verify_async() var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); await _consumer.AcknowledgeAsync(message); } @@ -99,13 +99,14 @@ private static async Task FindQueueUrl(AWSMessagingGatewayConnection con return response.QueueUrl; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); ((IAmAMessageConsumerSync)_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_posting_a_message_resources_are_tagged_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_posting_a_message_resources_are_tagged_async.cs index fa323d48f0..7c23d953c9 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_posting_a_message_resources_are_tagged_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_posting_a_message_resources_are_tagged_async.cs @@ -8,12 +8,11 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerResourcesAreTaggedAsyncTests : IAsyncDisposable, IDisposable +[Category("AWS")] +public class SqsMessageProducerResourcesAreTaggedAsyncTests : IAsyncDisposable { private readonly SqsMessageProducer _messageProducer; private readonly ChannelFactory _channelFactory; @@ -59,7 +58,7 @@ public SqsMessageProducerResourcesAreTaggedAsyncTests() }); } - [Fact] + [Test] public async Task When_posting_a_message_resources_are_tagged_async() { // arrange @@ -72,14 +71,15 @@ public async Task When_posting_a_message_resources_are_tagged_async() new ListQueueTagsRequest { QueueUrl = queueUrlResponse.QueueUrl }); // assert - queue has Environment=Test tag - Assert.True(queueTagsResponse.Tags.ContainsKey("Environment")); - Assert.Equal("Test", queueTagsResponse.Tags["Environment"]); + await Assert.That(queueTagsResponse.Tags.ContainsKey("Environment")).IsTrue(); + await Assert.That(queueTagsResponse.Tags["Environment"]).IsEqualTo("Test"); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs index 3d562dad76..36d73f7441 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerSendAsyncTests : IAsyncDisposable, IDisposable +[Category("AWS")] +public class SqsMessageProducerSendAsyncTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -62,7 +61,7 @@ public SqsMessageProducerSendAsyncTests() }); } - [Fact] + [Test] public async Task When_posting_a_message_via_the_producer_async() { // arrange @@ -77,30 +76,31 @@ public async Task When_posting_a_message_via_the_producer_async() await _channel.AcknowledgeAsync(message); // should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_queueName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_queueName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); // allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); // {"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_queues_missing_assume_throws_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_queues_missing_assume_throws_async.cs index 30ee9ccda7..0fa3d8865d 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_queues_missing_assume_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_queues_missing_assume_throws_async.cs @@ -4,18 +4,18 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -public class AWSAssumeQueuesTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +public class AWSAssumeQueuesTestsAsync : IAsyncDisposable { - private readonly ChannelFactory _channelFactory; - private readonly IAmAMessageConsumerAsync _consumer; + private ChannelFactory _channelFactory; + private IAmAMessageConsumerAsync _consumer; - public AWSAssumeQueuesTestsAsync() + [Before(Test)] + public async Task Setup() { var channelName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); var queueName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); @@ -37,25 +37,26 @@ public AWSAssumeQueuesTestsAsync() MakeChannels = OnMissingChannel.Create }); - producer.ConfirmTopicExistsAsync(queueName).Wait(); + await producer.ConfirmTopicExistsAsync(queueName); _channelFactory = new ChannelFactory(awsConnection); - var channel = _channelFactory.CreateAsyncChannel(subscription); + var channel = await _channelFactory.CreateAsyncChannelAsync(subscription); //We need to create the topic at least, to check the queues _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_queues_missing_assume_throws_async() { //we will try to get the queue url, and fail because it does not exist - await Assert.ThrowsAsync(() => _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))); + await Assert.That(() => _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))).ThrowsExactly(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_queues_missing_verify_throws_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_queues_missing_verify_throws_async.cs index 13ca375e79..2c6e774b35 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_queues_missing_verify_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_queues_missing_verify_throws_async.cs @@ -4,12 +4,11 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AWSValidateQueuesTestsAsync : IAsyncDisposable { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -31,13 +30,13 @@ public AWSValidateQueuesTestsAsync() _awsConnection = GatewayFactory.CreateFactory(); } - [Fact] + [Test] public async Task When_queues_missing_verify_throws_async() { // We have no queues so we should throw // We need to do this manually in a test - will create the channel from subscriber parameters _channelFactory = new ChannelFactory(_awsConnection); - await Assert.ThrowsAsync(() => _channelFactory.CreateAsyncChannelAsync(_subscription)); + await Assert.That(() => _channelFactory.CreateAsyncChannelAsync(_subscription)).ThrowsExactly(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs index cac38d8505..db20097e27 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerRejectTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerRejectTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -60,7 +59,7 @@ public SqsMessageConsumerRejectTestsAsync() ); } - [Fact] + [Test] public async Task When_rejecting_a_message_should_delete_from_queue_async() { //Arrange @@ -73,13 +72,14 @@ public async Task When_rejecting_a_message_should_delete_from_queue_async() //Assert - message should be deleted, not requeued message = await _channel.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs index 786e400dd5..0c5646a5ff 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs @@ -30,13 +30,12 @@ THE SOFTWARE. */ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerDeliveryErrorDlqTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerDeliveryErrorDlqTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -96,7 +95,7 @@ public SqsMessageConsumerDeliveryErrorDlqTestsAsync() _dlqChannel = _dlqChannelFactory.CreateAsyncChannel(dlqSubscription); } - [Fact] + [Test] public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq_async() { //Arrange @@ -110,29 +109,30 @@ public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq_ //Assert - message should appear on DLQ var dlqMessage = await _dlqChannel.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); //verify rejection metadata was added (keys are camelCase due to JSON serialization policy) - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(originalTopic, dlqMessage.Header.Bag["originalTopic"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.DeliveryError.ToString(), dlqMessage.Header.Bag["rejectionReason"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal(MessageType.MT_COMMAND.ToString(), dlqMessage.Header.Bag["originalMessageType"].ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalTopic"].ToString()).IsEqualTo(originalTopic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.DeliveryError.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalMessageType"].ToString()).IsEqualTo(MessageType.MT_COMMAND.ToString()); //verify original message is deleted from source queue var sourceMessage = await _channel.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, sourceMessage.Header.MessageType); + await Assert.That(sourceMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _dlqChannelFactory.DeleteTopicAsync().Wait(); - _dlqChannelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _dlqChannelFactory.DeleteTopicAsync(); + await _dlqChannelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_requeueing_a_message_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_requeueing_a_message_async.cs index 98781fa72d..99d5ea2eb8 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_requeueing_a_message_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_requeueing_a_message_async.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerRequeueTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerRequeueTestsAsync : IAsyncDisposable { private readonly IAmAMessageProducerAsync _sender; private Message _requeuedMessage; @@ -54,7 +53,7 @@ public SqsMessageProducerRequeueTestsAsync() _channel = _channelFactory.CreateAsyncChannel(subscription); } - [Fact] + [Test] public async Task When_requeueing_a_message_async() { await _sender.SendAsync(_message); @@ -65,13 +64,14 @@ public async Task When_requeueing_a_message_async() await _channel.AcknowledgeAsync(_requeuedMessage); - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_requeueing_redrives_to_the_dlq_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_requeueing_redrives_to_the_dlq_async.cs index 8491371c90..e316275ecc 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_requeueing_redrives_to_the_dlq_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_requeueing_redrives_to_the_dlq_async.cs @@ -9,14 +9,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageProducerDlqTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageProducerDlqTestsAsync : IAsyncDisposable { private readonly SqsMessageProducer _sender; private readonly IAmAChannelAsync _channel; @@ -65,7 +64,7 @@ public SqsMessageProducerDlqTestsAsync() _channel = _channelFactory.CreateAsyncChannel(subscription); } - [Fact] + [Test] public async Task When_requeueing_redrives_to_the_queue_async() { await _sender.SendAsync(_message); @@ -81,7 +80,7 @@ public async Task When_requeueing_redrives_to_the_queue_async() await Task.Delay(5000); int dlqCount = await GetDLQCountAsync(_dlqChannelName); - Assert.Equal(1, dlqCount); + await Assert.That(dlqCount).IsEqualTo(1); } private async Task GetDLQCountAsync(string queueName) @@ -104,10 +103,11 @@ private async Task GetDLQCountAsync(string queueName) return response.Messages.Count; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_throwing_defer_action_respect_redrive_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_throwing_defer_action_respect_redrive_async.cs index 33898b0bc0..27e02c8f77 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_throwing_defer_action_respect_redrive_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_throwing_defer_action_respect_redrive_async.cs @@ -12,13 +12,12 @@ using Paramore.Brighter.MessagingGateway.AWSSQS; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SnsReDrivePolicySDlqTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SnsReDrivePolicySDlqTestsAsync : IAsyncDisposable { private readonly IAmAMessagePump _messagePump; private readonly Message _message; @@ -125,7 +124,7 @@ private async Task GetDLQCountAsync(string queueName) return response.Messages.Count; } - [Fact(Skip = "DLQ is fragile on async tests")] + [Test, Skip("DLQ is fragile on async tests")] public async Task When_throwing_defer_action_respect_redrive_async() { await _sender.SendAsync(_message); @@ -141,13 +140,14 @@ public async Task When_throwing_defer_action_respect_redrive_async() await Task.Delay(5000); int dlqCount = await GetDLQCountAsync(_dlqQueueName); - Assert.Equal(1, dlqCount); + await Assert.That(dlqCount).IsEqualTo(1); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_topic_missing_verify_throws_async.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_topic_missing_verify_throws_async.cs index 2b4ad9eeb2..11e1d6e6c7 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_topic_missing_verify_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Proactor/When_topic_missing_verify_throws_async.cs @@ -1,13 +1,12 @@ -using System; +using System; using System.Threading.Tasks; using Amazon.SQS.Model; using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AWSValidateMissingTopicTestsAsync { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -24,7 +23,7 @@ public AWSValidateMissingTopicTestsAsync() // Because we don't use channel factory to create the infrastructure - it won't exist } - [Fact] + [Test] public async Task When_topic_missing_verify_throws_async() { // arrange diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_a_message_consumer_reads_multiple_messages.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_a_message_consumer_reads_multiple_messages.cs index 49ff050640..7f39b18820 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_a_message_consumer_reads_multiple_messages.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_a_message_consumer_reads_multiple_messages.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SQSBufferedConsumerTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SQSBufferedConsumerTests : IAsyncDisposable { private readonly SqsMessageProducer _messageProducer; private readonly SqsMessageConsumer _consumer; @@ -53,7 +52,7 @@ public SQSBufferedConsumerTests() new SqsPublication(channelName: channelName, makeChannels: OnMissingChannel.Create)); } - [Fact] + [Test] public async Task When_a_message_consumer_reads_multiple_messages() { var routingKey = new RoutingKey(_queueName); @@ -83,10 +82,10 @@ public async Task When_a_message_consumer_reads_multiple_messages() ); //send MESSAGE_COUNT messages - _messageProducer.Send(messageOne); - _messageProducer.Send(messageTwo); - _messageProducer.Send(messageThree); - _messageProducer.Send(messageFour); + await _messageProducer.SendAsync(messageOne); + await _messageProducer.SendAsync(messageTwo); + await _messageProducer.SendAsync(messageThree); + await _messageProducer.SendAsync(messageFour); int iteration = 0; @@ -98,18 +97,18 @@ public async Task When_a_message_consumer_reads_multiple_messages() var outstandingMessageCount = MessageCount - messagesReceivedCount; //retrieve messages - var messages = _consumer.Receive(TimeSpan.FromMilliseconds(10000)); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.True(messages.Length <= outstandingMessageCount); + await Assert.That(messages.Length <= outstandingMessageCount).IsTrue(); //should not receive more than buffer in one hit - Assert.True(messages.Length <= BufferSize); + await Assert.That(messages.Length <= BufferSize).IsTrue(); var moreMessages = messages.Where(m => m.Header.MessageType == MessageType.MT_COMMAND); foreach (var message in moreMessages) { messagesReceived.Add(message); - _consumer.Acknowledge(message); + await _consumer.AcknowledgeAsync(message); } messagesReceivedCount = messagesReceived.Count; @@ -119,16 +118,17 @@ public async Task When_a_message_consumer_reads_multiple_messages() } while ((iteration <= 5) && (messagesReceivedCount < MessageCount)); - Assert.Equal(4, messagesReceivedCount); + await Assert.That(messagesReceivedCount).IsEqualTo(4); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_customising_aws_client_config.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_customising_aws_client_config.cs index 396a5cffa2..daa7bd4827 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_customising_aws_client_config.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_customising_aws_client_config.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -public class CustomisingAwsClientConfigTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class CustomisingAwsClientConfigTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -60,11 +59,11 @@ public CustomisingAwsClientConfigTests() new SqsPublication { ChannelName = channelName, MakeChannels = OnMissingChannel.Create }); } - [Fact] + [Test] public async Task When_customising_aws_client_config() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -74,18 +73,19 @@ public async Task When_customising_aws_client_config() _channel.Acknowledge(message); //publish_and_subscribe_should_use_custom_http_client_factory - Assert.Contains("sqs_sync_sub", InterceptingDelegatingHandler.RequestCount); - Assert.True((InterceptingDelegatingHandler.RequestCount["sqs_sync_sub"]) > (0)); + await Assert.That(InterceptingDelegatingHandler.RequestCount).ContainsKey("sqs_sync_sub"); + await Assert.That((InterceptingDelegatingHandler.RequestCount["sqs_sync_sub"]) > (0)).IsTrue(); - Assert.Contains("sqs_sync_pub", InterceptingDelegatingHandler.RequestCount); - Assert.True((InterceptingDelegatingHandler.RequestCount["sqs_sync_pub"]) > (0)); + await Assert.That(InterceptingDelegatingHandler.RequestCount).ContainsKey("sqs_sync_pub"); + await Assert.That((InterceptingDelegatingHandler.RequestCount["sqs_sync_pub"]) > (0)).IsTrue(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_infastructure_exists_can_assume.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_infastructure_exists_can_assume.cs index 7fb816dae3..e9b45cb2c0 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_infastructure_exists_can_assume.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_infastructure_exists_can_assume.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AWSAssumeInfrastructureTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AWSAssumeInfrastructureTests : IAsyncDisposable { private readonly Message _message; private readonly SqsMessageConsumer _consumer; @@ -68,27 +67,28 @@ public AWSAssumeInfrastructureTests() _consumer = new SqsMessageConsumer(awsConnection, channel.Name); } - [Fact] - public void When_infastructure_exists_can_assume() + [Test] + public async Task When_infastructure_exists_can_assume() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); - var messages = _consumer.Receive(TimeSpan.FromMilliseconds(5000)); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue - _consumer.Acknowledge(message); + await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_infrastructure_exists_can_verify.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_infrastructure_exists_can_verify.cs index bd65975469..3bb9c7549a 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_infrastructure_exists_can_verify.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_infrastructure_exists_can_verify.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AWSValidateInfrastructureTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AWSValidateInfrastructureTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerSync _consumer; @@ -73,11 +72,11 @@ public AWSValidateInfrastructureTests() _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -85,19 +84,20 @@ public async Task When_infrastructure_exists_can_verify() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue _consumer.Acknowledge(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); _consumer.Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_posting_a_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_posting_a_message_via_the_messaging_gateway.cs index e59958e576..d9e1dd3082 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_posting_a_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_posting_a_message_via_the_messaging_gateway.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerSendTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerSendTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -63,12 +62,12 @@ public SqsMessageProducerSendTests() ); } - [Fact] + [Test] public async Task When_posting_a_message_via_the_producer() { //arrange _message.Header.Subject = "test subject"; - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -78,30 +77,31 @@ public async Task When_posting_a_message_via_the_producer() _channel.Acknowledge(message); //should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_queueName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_queueName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); //allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); //{"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queue_missing_verify_throws.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queue_missing_verify_throws.cs index 41e5ad966a..080177f41c 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queue_missing_verify_throws.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queue_missing_verify_throws.cs @@ -1,12 +1,11 @@ -using System; +using System; using Amazon.SQS.Model; using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AwsValidateMissingTopicTests { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -22,8 +21,8 @@ public AwsValidateMissingTopicTests() //Because we don't use channel factory to create the infrastructure -it won't exist } - [Fact] - public void When_queue_missing_verify_throws() + [Test] + public async Task When_queue_missing_verify_throws() { //arrange var producer = new SqsMessageProducer( @@ -31,8 +30,11 @@ public void When_queue_missing_verify_throws() new SqsPublication(channelName: new ChannelName(_routingKey), makeChannels: OnMissingChannel.Validate)); //act && assert - Assert.Throws(() => producer.Send(new Message( - new MessageHeader("", _routingKey, MessageType.MT_EVENT, type: new CloudEventsType("plain/text")), - new MessageBody("Test")))); + Assert.ThrowsExactly(() => + { + producer.Send(new Message( + new MessageHeader("", _routingKey, MessageType.MT_EVENT, type: new CloudEventsType("plain/text")), + new MessageBody("Test"))); + }); } } diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queues_missing_assume_throws.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queues_missing_assume_throws.cs index 1f6ac50789..79de69d336 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queues_missing_assume_throws.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queues_missing_assume_throws.cs @@ -4,13 +4,12 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -public class AWSAssumeQueuesTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AWSAssumeQueuesTests : IAsyncDisposable { private readonly ChannelFactory _channelFactory; private readonly SqsMessageConsumer _consumer; @@ -36,16 +35,17 @@ public AWSAssumeQueuesTests() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName()); } - [Fact] - public void When_queues_missing_assume_throws() + [Test] + public async Task When_queues_missing_assume_throws() { //we will try to get the queue url, and fail because it does not exist - Assert.Throws(() => _consumer.Receive(TimeSpan.FromMilliseconds(1000))); + await Assert.That(() => _consumer.Receive(TimeSpan.FromMilliseconds(1000))).ThrowsExactly(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queues_missing_verify_throws.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queues_missing_verify_throws.cs index 22298a15e9..34e05fe7b7 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queues_missing_verify_throws.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queues_missing_verify_throws.cs @@ -4,13 +4,12 @@ using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -public class AWSValidateQueuesTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AWSValidateQueuesTests : IAsyncDisposable { private readonly AWSMessagingGatewayConnection _awsConnection; private readonly SqsSubscription _subscription; @@ -31,18 +30,19 @@ public AWSValidateQueuesTests() _awsConnection = GatewayFactory.CreateFactory(); } - [Fact] - public void When_queues_missing_verify_throws() + [Test] + public async Task When_queues_missing_verify_throws() { //We have no queues so we should throw //We need to do this manually in a test - will create the channel from subscriber parameters _channelFactory = new ChannelFactory(_awsConnection); - Assert.Throws(() => _channelFactory.CreateSyncChannel(_subscription)); + await Assert.That(() => _channelFactory.CreateSyncChannel(_subscription)).ThrowsExactly(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_a_message_should_delete_from_queue.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_a_message_should_delete_from_queue.cs index 8787d2a256..83fc6a6b49 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_a_message_should_delete_from_queue.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_a_message_should_delete_from_queue.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerRejectTests : IDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerRejectTests { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -61,11 +60,11 @@ public SqsMessageConsumerRejectTests() ); } - [Fact] - public void When_rejecting_a_message_should_delete_from_queue() + [Test] + public async Task When_rejecting_a_message_should_delete_from_queue() { //Arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); //Act @@ -74,13 +73,14 @@ public void When_rejecting_a_message_should_delete_from_queue() //Assert - message should be deleted, not requeued message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs index deb6f28168..d14f5e1cb0 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs @@ -30,13 +30,12 @@ THE SOFTWARE. */ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerDeliveryErrorDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerDeliveryErrorDlqTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -96,11 +95,11 @@ public SqsMessageConsumerDeliveryErrorDlqTests() _dlqChannel = _dlqChannelFactory.CreateSyncChannel(dlqSubscription); } - [Fact] - public void When_rejecting_message_with_delivery_error_should_send_to_dlq() + [Test] + public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq() { //Arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); //Act @@ -110,29 +109,30 @@ public void When_rejecting_message_with_delivery_error_should_send_to_dlq() //Assert - message should appear on DLQ var dlqMessage = _dlqChannel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); //verify rejection metadata was added (keys are camelCase due to JSON serialization policy) - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(originalTopic, dlqMessage.Header.Bag["originalTopic"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.DeliveryError.ToString(), dlqMessage.Header.Bag["rejectionReason"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal(MessageType.MT_COMMAND.ToString(), dlqMessage.Header.Bag["originalMessageType"].ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalTopic"].ToString()).IsEqualTo(originalTopic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.DeliveryError.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalMessageType"].ToString()).IsEqualTo(MessageType.MT_COMMAND.ToString()); //verify original message is deleted from source queue var sourceMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, sourceMessage.Header.MessageType); + await Assert.That(sourceMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _dlqChannelFactory.DeleteTopicAsync().Wait(); - _dlqChannelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _dlqChannelFactory.DeleteTopicAsync(); + await _dlqChannelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log.cs index d3aaa2ab63..c2d0d34de1 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log.cs @@ -30,13 +30,12 @@ THE SOFTWARE. */ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerNoChannelsRejectTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerNoChannelsRejectTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -79,11 +78,11 @@ public SqsMessageConsumerNoChannelsRejectTests() new SqsPublication(channelName: channelName, makeChannels: OnMissingChannel.Create)); } - [Fact] - public void When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log() + [Test] + public async Task When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log() { //Arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); //Act - reject with a DeliveryError reason but no DLQ configured @@ -91,13 +90,14 @@ public void When_rejecting_message_with_no_channels_configured_should_acknowledg //Assert - original message should be deleted (acknowledged) since there is no DLQ var sourceMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, sourceMessage.Header.MessageType); + await Assert.That(sourceMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs index 2af0f741a9..281d751de7 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs @@ -30,13 +30,12 @@ THE SOFTWARE. */ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerUnacceptableFallbackToDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerUnacceptableFallbackToDlqTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -97,11 +96,11 @@ public SqsMessageConsumerUnacceptableFallbackToDlqTests() _dlqChannel = _dlqChannelFactory.CreateSyncChannel(dlqSubscription); } - [Fact] - public void When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq() + [Test] + public async Task When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq() { //Arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); //Act @@ -111,29 +110,30 @@ public void When_rejecting_message_with_unacceptable_and_no_invalid_channel_shou //Assert - message should fall back to the DLQ since no invalid message queue is configured var dlqMessage = _dlqChannel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); //verify rejection metadata was added (keys are camelCase due to JSON serialization policy) - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(originalTopic, dlqMessage.Header.Bag["originalTopic"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.Unacceptable.ToString(), dlqMessage.Header.Bag["rejectionReason"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal(MessageType.MT_COMMAND.ToString(), dlqMessage.Header.Bag["originalMessageType"].ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalTopic"].ToString()).IsEqualTo(originalTopic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.Unacceptable.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalMessageType"].ToString()).IsEqualTo(MessageType.MT_COMMAND.ToString()); //verify original message is deleted from source queue var sourceMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, sourceMessage.Header.MessageType); + await Assert.That(sourceMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _dlqChannelFactory.DeleteTopicAsync().Wait(); - _dlqChannelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _dlqChannelFactory.DeleteTopicAsync(); + await _dlqChannelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs index 7ab61b8ac9..af45471cdd 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs @@ -30,13 +30,12 @@ THE SOFTWARE. */ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerUnacceptableInvalidChannelTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerUnacceptableInvalidChannelTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -114,11 +113,11 @@ public SqsMessageConsumerUnacceptableInvalidChannelTests() _dlqChannel = _dlqChannelFactory.CreateSyncChannel(dlqSubscription); } - [Fact] - public void When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel() + [Test] + public async Task When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel() { //Arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); //Act @@ -128,35 +127,36 @@ public void When_rejecting_message_with_unacceptable_reason_should_send_to_inval //Assert - message should appear on the invalid message queue var invalidMessage = _invalidChannel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.NotEqual(MessageType.MT_NONE, invalidMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, invalidMessage.Body.Value); + await Assert.That(invalidMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(invalidMessage.Body.Value).IsEqualTo(_message.Body.Value); //verify rejection metadata was added (keys are camelCase due to JSON serialization policy) - Assert.True(invalidMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(originalTopic, invalidMessage.Header.Bag["originalTopic"].ToString()); - Assert.True(invalidMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.Unacceptable.ToString(), invalidMessage.Header.Bag["rejectionReason"].ToString()); - Assert.True(invalidMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.True(invalidMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal(MessageType.MT_COMMAND.ToString(), invalidMessage.Header.Bag["originalMessageType"].ToString()); + await Assert.That(invalidMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(invalidMessage.Header.Bag["originalTopic"].ToString()).IsEqualTo(originalTopic); + await Assert.That(invalidMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(invalidMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.Unacceptable.ToString()); + await Assert.That(invalidMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(invalidMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(invalidMessage.Header.Bag["originalMessageType"].ToString()).IsEqualTo(MessageType.MT_COMMAND.ToString()); //verify message did NOT go to the DLQ var dlqMessage = _dlqChannel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, dlqMessage.Header.MessageType); + await Assert.That(dlqMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); //verify original message is deleted from source queue var sourceMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, sourceMessage.Header.MessageType); + await Assert.That(sourceMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _invalidChannelFactory.DeleteTopicAsync().Wait(); - _invalidChannelFactory.DeleteQueueAsync().Wait(); - _dlqChannelFactory.DeleteTopicAsync().Wait(); - _dlqChannelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _invalidChannelFactory.DeleteTopicAsync(); + await _invalidChannelFactory.DeleteQueueAsync(); + await _dlqChannelFactory.DeleteTopicAsync(); + await _dlqChannelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_requeueing_a_message.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_requeueing_a_message.cs index 441eebc13d..8623bfb27c 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_requeueing_a_message.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_requeueing_a_message.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerRequeueTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerRequeueTests : IAsyncDisposable { private readonly IAmAMessageProducerSync _sender; private Message _requeuedMessage; @@ -63,8 +62,8 @@ public SqsMessageProducerRequeueTests() _channel = _channelFactory.CreateSyncChannel(subscription); } - [Fact] - public void When_requeueing_a_message() + [Test] + public async Task When_requeueing_a_message() { _sender.Send(_message); _receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); @@ -75,13 +74,14 @@ public void When_requeueing_a_message() //clear the queue _channel.Acknowledge(_requeuedMessage); - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_requeueing_redrives_to_the_dlq.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_requeueing_redrives_to_the_dlq.cs index 2bc57911a5..0c0e89ab11 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_requeueing_redrives_to_the_dlq.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_requeueing_redrives_to_the_dlq.cs @@ -10,13 +10,12 @@ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageProducerDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageProducerDlqTests : IAsyncDisposable { private readonly SqsMessageProducer _sender; private readonly IAmAChannelSync _channel; @@ -69,10 +68,10 @@ public SqsMessageProducerDlqTests() _channel = _channelFactory.CreateSyncChannel(subscription); } - [Fact] - public void When_requeueing_redrives_to_the_queue() + [Test] + public async Task When_requeueing_redrives_to_the_queue() { - _sender.Send(_message); + await _sender.SendAsync(_message); var receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); _channel.Requeue(receivedMessage); @@ -86,19 +85,19 @@ public void When_requeueing_redrives_to_the_queue() Task.Delay(5000); //inspect the dlq - Assert.Equal(1, GetDLQCount(_dlqChannelName)); + await Assert.That(await GetDLQCount(_dlqChannelName)).IsEqualTo(1); } - private int GetDLQCount(string queueName) + private async Task GetDLQCount(string queueName) { using var sqsClient = new AWSClientFactory(_awsConnection).CreateSqsClient(); - var queueUrlResponse = sqsClient.GetQueueUrlAsync(queueName).GetAwaiter().GetResult(); - var response = sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest + var queueUrlResponse = await sqsClient.GetQueueUrlAsync(queueName); + var response = await sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest { QueueUrl = queueUrlResponse.QueueUrl, WaitTimeSeconds = 5, MessageAttributeNames = new List { "All", "ApproximateReceiveCount" } - }).GetAwaiter().GetResult(); + }); if (response.HttpStatusCode != HttpStatusCode.OK) { @@ -109,10 +108,11 @@ private int GetDLQCount(string queueName) return response.Messages.Count; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_throwing_defer_action_respect_redrive.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_throwing_defer_action_respect_redrive.cs index 207c9a994b..af02e2dadf 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_throwing_defer_action_respect_redrive.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/Standard/Reactor/When_throwing_defer_action_respect_redrive.cs @@ -12,13 +12,12 @@ using Paramore.Brighter.MessagingGateway.AWSSQS; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SnsReDrivePolicySDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SnsReDrivePolicySDlqTests : IAsyncDisposable { private readonly IAmAMessagePump _messagePump; private readonly Message _message; @@ -117,17 +116,17 @@ public SnsReDrivePolicySDlqTests() }; } - private int GetDLQCount(string queueName) + private async Task GetDLQCount(string queueName) { - using var sqsClient = new AWSClientFactory(_awsConnection).CreateSqsClient(); - var queueUrlResponse = sqsClient.GetQueueUrlAsync(queueName).GetAwaiter().GetResult(); - var response = sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest + using var sqsClient = new AWSClientFactory(_awsConnection).CreateSqsClient(); + var queueUrlResponse = await sqsClient.GetQueueUrlAsync(queueName); + var response = await sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest { QueueUrl = queueUrlResponse.QueueUrl, WaitTimeSeconds = 5, MessageSystemAttributeNames = ["ApproximateReceiveCount"], MessageAttributeNames = new List { "All" } - }).GetAwaiter().GetResult(); + }); if (response.HttpStatusCode != HttpStatusCode.OK) { @@ -139,11 +138,11 @@ private int GetDLQCount(string queueName) } - [Fact] + [Test] public async Task When_throwing_defer_action_respect_redrive() { //put something on an SNS topic, which will be delivered to our SQS queue - _sender.Send(_message); + await _sender.SendAsync(_message); //start a message pump, let it process messages var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); @@ -159,13 +158,14 @@ public async Task When_throwing_defer_action_respect_redrive() await Task.Delay(5000); //inspect the dlq - Assert.Equal(1, GetDLQCount(_dlqChannelName)); + await Assert.That(await GetDLQCount(_dlqChannelName)).IsEqualTo(1); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/When_creating_sqs_consumer_with_dlq_subscription_should_pass_routing_keys.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/When_creating_sqs_consumer_with_dlq_subscription_should_pass_routing_keys.cs index aab7f9aaa2..7a3b1301ea 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/When_creating_sqs_consumer_with_dlq_subscription_should_pass_routing_keys.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/When_creating_sqs_consumer_with_dlq_subscription_should_pass_routing_keys.cs @@ -27,7 +27,6 @@ THE SOFTWARE. */ using Amazon.Runtime; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs; @@ -45,8 +44,8 @@ public SqsMessageConsumerFactoryDlqTests() _factory = new SqsMessageConsumerFactory(connection); } - [Fact] - public void When_creating_sqs_consumer_with_dlq_subscription_should_pass_routing_keys() + [Test] + public async Task When_creating_sqs_consumer_with_dlq_subscription_should_pass_routing_keys() { //Arrange var dlqRoutingKey = new RoutingKey("orders-dlq"); @@ -64,7 +63,7 @@ public void When_creating_sqs_consumer_with_dlq_subscription_should_pass_routing _consumer = _factory.Create(subscription); //Assert - verify the factory passed routing keys to the consumer - Assert.NotNull(_consumer); + await Assert.That(_consumer).IsNotNull(); var consumerType = _consumer.GetType(); var dlqField = consumerType.GetField("_deadLetterRoutingKey", @@ -72,17 +71,17 @@ public void When_creating_sqs_consumer_with_dlq_subscription_should_pass_routing var invalidField = consumerType.GetField("_invalidMessageRoutingKey", BindingFlags.NonPublic | BindingFlags.Instance); - Assert.NotNull(dlqField); - Assert.NotNull(invalidField); + await Assert.That(dlqField).IsNotNull(); + await Assert.That(invalidField).IsNotNull(); var actualDlq = dlqField.GetValue(_consumer) as RoutingKey; var actualInvalid = invalidField.GetValue(_consumer) as RoutingKey; - Assert.NotNull(actualDlq); - Assert.Equal("orders-dlq", actualDlq.Value); + await Assert.That(actualDlq).IsNotNull(); + await Assert.That(actualDlq.Value).IsEqualTo("orders-dlq"); - Assert.NotNull(actualInvalid); - Assert.Equal("orders-invalid", actualInvalid.Value); + await Assert.That(actualInvalid).IsNotNull(); + await Assert.That(actualInvalid.Value).IsEqualTo("orders-invalid"); } public void Dispose() diff --git a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/When_creating_sqs_subscription_with_dlq_routing_keys_should_expose_properties.cs b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/When_creating_sqs_subscription_with_dlq_routing_keys_should_expose_properties.cs index f3d71de9ab..af568e4970 100644 --- a/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/When_creating_sqs_subscription_with_dlq_routing_keys_should_expose_properties.cs +++ b/tests/Paramore.Brighter.AWS.Tests/MessagingGateway/Sqs/When_creating_sqs_subscription_with_dlq_routing_keys_should_expose_properties.cs @@ -23,14 +23,13 @@ THE SOFTWARE. */ using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.MessagingGateway.Sqs; public class SqsSubscriptionDlqRoutingKeyTests { - [Fact] - public void When_creating_sqs_subscription_with_dlq_routing_keys_should_expose_properties() + [Test] + public async Task When_creating_sqs_subscription_with_dlq_routing_keys_should_expose_properties() { //Arrange var deadLetterRoutingKey = new RoutingKey("orders-dlq"); @@ -46,17 +45,17 @@ public void When_creating_sqs_subscription_with_dlq_routing_keys_should_expose_p ); //Assert - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var dlqSupport = (IUseBrighterDeadLetterSupport)subscription; - Assert.Equal(deadLetterRoutingKey, dlqSupport.DeadLetterRoutingKey); + await Assert.That(dlqSupport.DeadLetterRoutingKey).IsEqualTo(deadLetterRoutingKey); - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var invalidSupport = (IUseBrighterInvalidMessageSupport)subscription; - Assert.Equal(invalidMessageRoutingKey, invalidSupport.InvalidMessageRoutingKey); + await Assert.That(invalidSupport.InvalidMessageRoutingKey).IsEqualTo(invalidMessageRoutingKey); } - [Fact] - public void When_creating_sqs_subscription_without_dlq_routing_keys_should_default_to_null() + [Test] + public async Task When_creating_sqs_subscription_without_dlq_routing_keys_should_default_to_null() { //Arrange & Act var subscription = new SqsSubscription( @@ -66,12 +65,12 @@ public void When_creating_sqs_subscription_without_dlq_routing_keys_should_defau ); //Assert - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var dlqSupport = (IUseBrighterDeadLetterSupport)subscription; - Assert.Null(dlqSupport.DeadLetterRoutingKey); + await Assert.That(dlqSupport.DeadLetterRoutingKey).IsNull(); - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var invalidSupport = (IUseBrighterInvalidMessageSupport)subscription; - Assert.Null(invalidSupport.InvalidMessageRoutingKey); + await Assert.That(invalidSupport.InvalidMessageRoutingKey).IsNull(); } } diff --git a/tests/Paramore.Brighter.AWS.Tests/Paramore.Brighter.AWS.Tests.csproj b/tests/Paramore.Brighter.AWS.Tests/Paramore.Brighter.AWS.Tests.csproj index 7ea80ae547..5e3c4e8c97 100644 --- a/tests/Paramore.Brighter.AWS.Tests/Paramore.Brighter.AWS.Tests.csproj +++ b/tests/Paramore.Brighter.AWS.Tests/Paramore.Brighter.AWS.Tests.csproj @@ -1,30 +1,15 @@ - $(BrighterTestTargetFrameworks) false + Exe - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - + - @@ -32,9 +17,7 @@ - - - + \ No newline at end of file diff --git a/tests/Paramore.Brighter.AWS.Tests/Transformers/When_creating_luggagestore_missing_parameters.cs b/tests/Paramore.Brighter.AWS.Tests/Transformers/When_creating_luggagestore_missing_parameters.cs index 55f7825494..fea60f7010 100644 --- a/tests/Paramore.Brighter.AWS.Tests/Transformers/When_creating_luggagestore_missing_parameters.cs +++ b/tests/Paramore.Brighter.AWS.Tests/Transformers/When_creating_luggagestore_missing_parameters.cs @@ -1,10 +1,9 @@ -using System; +using System; using System.Net.Http; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.AWS.Tests.Helpers; using Paramore.Brighter.Transformers.AWS; -using Xunit; namespace Paramore.Brighter.AWS.Tests.Transformers; @@ -23,39 +22,39 @@ public S3LuggageUploadMissingParametersTests() _bucketName = $"brightertestbucket-{Guid.NewGuid()}"; } - [Fact] - public void When_creating_luggagestore_missing_client() + [Test] + public async Task When_creating_luggagestore_missing_client() { //arrange var exception = Catch.Exception(() => new S3LuggageStore(new S3LuggageOptions(null!, null!))); - Assert.NotNull(exception); - Assert.IsType(exception); + await Assert.That(exception).IsNotNull(); + await Assert.That(exception).IsTypeOf(); } - [Theory] - [InlineData("")] - [InlineData(null)] - public void When_creating_luggagestore_missing_bucketName(string? bucketName) + [Test] + [Arguments("")] + [Arguments(null)] + public async Task When_creating_luggagestore_missing_bucketName(string? bucketName) { //arrange var exception = Catch.Exception(() => new S3LuggageStore(new S3LuggageOptions(GatewayFactory.CreateS3Connection(), bucketName!))); - Assert.NotNull(exception); - Assert.IsType(exception); + await Assert.That(exception).IsNotNull(); + await Assert.That(exception).IsTypeOf(); } - [Fact] + [Test] public async Task When_creating_luggagestore_bad_bucketName() { //arrange var exception = Catch.Exception(() => new S3LuggageStore(new S3LuggageOptions(GatewayFactory.CreateS3Connection(), "A" ))); - Assert.NotNull(exception); - Assert.IsType(exception); + await Assert.That(exception).IsNotNull(); + await Assert.That(exception).IsTypeOf(); } - [Fact] + [Test] public async Task When_creating_luggagestore_missing_httpClient() { //arrange @@ -65,11 +64,11 @@ public async Task When_creating_luggagestore_missing_httpClient() await store.EnsureStoreExistsAsync(); }); - Assert.NotNull(exception); - Assert.IsType(exception); + await Assert.That(exception).IsNotNull(); + await Assert.That(exception).IsTypeOf(); } - [Fact] + [Test] public async Task When_creating_luggagestore_missing_ACL() { //arrange @@ -83,7 +82,7 @@ public async Task When_creating_luggagestore_missing_ACL() await store.EnsureStoreExistsAsync(); }); - Assert.NotNull(exception); - Assert.IsType(exception); + await Assert.That(exception).IsNotNull(); + await Assert.That(exception).IsTypeOf(); } } diff --git a/tests/Paramore.Brighter.AWS.Tests/Transformers/When_unwrapping_a_large_message.cs b/tests/Paramore.Brighter.AWS.Tests/Transformers/When_unwrapping_a_large_message.cs index 56690adc44..6d5b44cb4e 100644 --- a/tests/Paramore.Brighter.AWS.Tests/Transformers/When_unwrapping_a_large_message.cs +++ b/tests/Paramore.Brighter.AWS.Tests/Transformers/When_unwrapping_a_large_message.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Net.Http; using System.Text.Json; @@ -11,12 +11,11 @@ using Paramore.Brighter.Observability; using Paramore.Brighter.Transformers.AWS; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.AWS.Tests.Transformers; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] +[Category("AWS")] +[Property("Fragile", "CI")] public class LargeMessagePaylodUnwrapTests : IAsyncDisposable { private readonly TransformPipelineBuilderAsync _pipelineBuilder; @@ -27,7 +26,6 @@ public class LargeMessagePaylodUnwrapTests : IAsyncDisposable public LargeMessagePaylodUnwrapTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); var mapperRegistry = new MessageMapperRegistry( null, @@ -59,7 +57,7 @@ public LargeMessagePaylodUnwrapTests() _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.All); } - [Fact] + [Test] public async Task When_unwrapping_a_large_message() { //arrange @@ -98,8 +96,8 @@ public async Task When_unwrapping_a_large_message() //assert //contents should be from storage - Assert.Equal(contents, transformedMessage.Value); - Assert.False((await _luggageStore.HasClaimAsync(id))); + await Assert.That(transformedMessage.Value).IsEqualTo(contents); + await Assert.That((await _luggageStore.HasClaimAsync(id))).IsFalse(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/Transformers/When_uploading_luggage_to_S3.cs b/tests/Paramore.Brighter.AWS.Tests/Transformers/When_uploading_luggage_to_S3.cs index 5ae9a9f24a..073379125e 100644 --- a/tests/Paramore.Brighter.AWS.Tests/Transformers/When_uploading_luggage_to_S3.cs +++ b/tests/Paramore.Brighter.AWS.Tests/Transformers/When_uploading_luggage_to_S3.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Net; using System.Net.Http; @@ -11,7 +11,6 @@ using Polly; using Polly.Contrib.WaitAndRetry; using Polly.Retry; -using Xunit; using Policy = Polly.Policy; namespace Paramore.Brighter.AWS.Tests.Transformers; @@ -30,7 +29,7 @@ public S3LuggageUploadTests() _bucketName = $"brightertestbucket-{Guid.NewGuid()}"; } - [Fact] + [Test] public async Task When_uploading_luggage_to_S3() { //arrange @@ -58,12 +57,12 @@ public async Task When_uploading_luggage_to_S3() //assert //do we have a claim? - Assert.True((await luggageStore.HasClaimAsync(claim))); + await Assert.That((await luggageStore.HasClaimAsync(claim))).IsTrue(); //check for the contents indicated by the claim id on S3 var result = await luggageStore.RetrieveAsync(claim); var resultAsString = await new StreamReader(result).ReadToEndAsync(); - Assert.Equal(testContent, resultAsString); + await Assert.That(resultAsString).IsEqualTo(testContent); await luggageStore.DeleteAsync(claim); diff --git a/tests/Paramore.Brighter.AWS.Tests/Transformers/When_validating_a_luggage_store_exists.cs b/tests/Paramore.Brighter.AWS.Tests/Transformers/When_validating_a_luggage_store_exists.cs index 3b71382985..7663bc7aa9 100644 --- a/tests/Paramore.Brighter.AWS.Tests/Transformers/When_validating_a_luggage_store_exists.cs +++ b/tests/Paramore.Brighter.AWS.Tests/Transformers/When_validating_a_luggage_store_exists.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Http; using System.Threading.Tasks; using Amazon.S3; @@ -8,12 +8,11 @@ using Paramore.Brighter.MessagingGateway.AWSSQS; using Paramore.Brighter.Transformers.AWS; using Paramore.Brighter.Transforms.Storage; -using Xunit; namespace Paramore.Brighter.AWS.Tests.Transformers; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] +[Category("AWS")] +[Property("Fragile", "CI")] public class S3LuggageStoreExistsTests { private readonly IHttpClientFactory _httpClientFactory; @@ -27,7 +26,7 @@ public S3LuggageStoreExistsTests() _httpClientFactory = provider.GetRequiredService(); } - [Fact] + [Test] public async Task When_checking_store_that_exists() { var bucketName = $"brightertestbucket-{Guid.NewGuid()}"; @@ -55,7 +54,7 @@ public async Task When_checking_store_that_exists() Tags = [new Tag { Key = "BrighterTests", Value = "S3LuggageUploadTests" }], }); - Assert.NotNull(luggageStore); + await Assert.That(luggageStore).IsNotNull(); //teardown var factory = new AWSClientFactory(GatewayFactory.CreateFactory()); @@ -63,7 +62,7 @@ public async Task When_checking_store_that_exists() await client.DeleteBucketAsync(bucketName); } - [Fact] + [Test] public async Task When_checking_store_that_does_not_exist() { //act @@ -82,7 +81,7 @@ public async Task When_checking_store_that_does_not_exist() await luggageStore.EnsureStoreExistsAsync(); }); - Assert.NotNull(doesNotExist); - Assert.True(doesNotExist is InvalidOperationException); + await Assert.That(doesNotExist).IsNotNull(); + await Assert.That(doesNotExist is InvalidOperationException).IsTrue(); } } diff --git a/tests/Paramore.Brighter.AWS.Tests/Transformers/When_wrapping_a_large_message.cs b/tests/Paramore.Brighter.AWS.Tests/Transformers/When_wrapping_a_large_message.cs index 1ec692ec15..9cc070b234 100644 --- a/tests/Paramore.Brighter.AWS.Tests/Transformers/When_wrapping_a_large_message.cs +++ b/tests/Paramore.Brighter.AWS.Tests/Transformers/When_wrapping_a_large_message.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Http; using System.Threading.Tasks; using Amazon.S3; @@ -10,7 +10,6 @@ using Paramore.Brighter.Observability; using Paramore.Brighter.Transformers.AWS; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.AWS.Tests.Transformers; @@ -29,7 +28,6 @@ public class LargeMessagePayloadWrapTests : IAsyncDisposable public LargeMessagePayloadWrapTests() { //arrange - TransformPipelineBuilderAsync.ClearPipelineCache(); var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync( @@ -67,7 +65,7 @@ public LargeMessagePayloadWrapTests() _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, transformerFactoryAsync, InstrumentationOptions.All); } - [Fact] + [Test] public async Task When_wrapping_a_large_message() { //act @@ -75,12 +73,12 @@ public async Task When_wrapping_a_large_message() var message = await _transformPipeline.WrapAsync(_myCommand, new RequestContext(), _publication); //assert - Assert.True(message.Header.Bag.ContainsKey(ClaimCheckTransformer.CLAIM_CHECK)); - Assert.NotNull(message.Header.DataRef); + await Assert.That(message.Header.Bag.ContainsKey(ClaimCheckTransformer.CLAIM_CHECK)).IsTrue(); + await Assert.That(message.Header.DataRef).IsNotNull(); _id = (string)message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK]; - Assert.Equal($"Claim Check {_id}", message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo($"Claim Check {_id}"); - Assert.True(await _luggageStore.HasClaimAsync(_id)); + await Assert.That(await _luggageStore.HasClaimAsync(_id)).IsTrue(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.Tests/When_creating_sns_attributes_with_tags.cs b/tests/Paramore.Brighter.AWS.Tests/When_creating_sns_attributes_with_tags.cs index c807142089..b5f8703c72 100644 --- a/tests/Paramore.Brighter.AWS.Tests/When_creating_sns_attributes_with_tags.cs +++ b/tests/Paramore.Brighter.AWS.Tests/When_creating_sns_attributes_with_tags.cs @@ -1,14 +1,13 @@ using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; using Paramore.Brighter.MessagingGateway.AWSSQS; -using Xunit; namespace Paramore.Brighter.AWS.Tests; public class When_creating_sns_attributes_with_tags { - [Fact] - public void When_tags_provided_should_store_them() + [Test] + public async Task When_tags_provided_should_store_them() { //arrange var tags = new List { new() { Key = "Environment", Value = "Test" } }; @@ -17,36 +16,36 @@ public void When_tags_provided_should_store_them() var snsAttributes = new SnsAttributes(tags: tags); //assert - Assert.NotNull(snsAttributes.Tags); - Assert.Single(snsAttributes.Tags); - Assert.Equal("Environment", snsAttributes.Tags[0].Key); - Assert.Equal("Test", snsAttributes.Tags[0].Value); + await Assert.That(snsAttributes.Tags).IsNotNull(); + await Assert.That(snsAttributes.Tags).HasSingleItem(); + await Assert.That(snsAttributes.Tags[0].Key).IsEqualTo("Environment"); + await Assert.That(snsAttributes.Tags[0].Value).IsEqualTo("Test"); } - [Fact] - public void When_no_tags_provided_should_be_empty() + [Test] + public async Task When_no_tags_provided_should_be_empty() { //act var snsAttributes = new SnsAttributes(); //assert - Assert.NotNull(snsAttributes.Tags); - Assert.Empty(snsAttributes.Tags); + await Assert.That(snsAttributes.Tags).IsNotNull(); + await Assert.That(snsAttributes.Tags).IsEmpty(); } - [Fact] - public void When_empty_should_have_empty_tags() + [Test] + public async Task When_empty_should_have_empty_tags() { //act var snsAttributes = SnsAttributes.Empty; //assert - Assert.NotNull(snsAttributes.Tags); - Assert.Empty(snsAttributes.Tags); + await Assert.That(snsAttributes.Tags).IsNotNull(); + await Assert.That(snsAttributes.Tags).IsEmpty(); } - [Fact] - public void When_tags_provided_should_not_affect_other_parameters() + [Test] + public async Task When_tags_provided_should_not_affect_other_parameters() { //arrange var tags = new List { new() { Key = "Environment", Value = "Test" } }; @@ -63,11 +62,11 @@ public void When_tags_provided_should_not_affect_other_parameters() ); //assert - Assert.Equal(deliveryPolicy, snsAttributes.DeliveryPolicy); - Assert.Equal(policy, snsAttributes.Policy); - Assert.Equal(SqsType.Fifo, snsAttributes.Type); - Assert.False(snsAttributes.ContentBasedDeduplication); - Assert.NotNull(snsAttributes.Tags); - Assert.Single(snsAttributes.Tags); + await Assert.That(snsAttributes.DeliveryPolicy).IsEqualTo(deliveryPolicy); + await Assert.That(snsAttributes.Policy).IsEqualTo(policy); + await Assert.That(snsAttributes.Type).IsEqualTo(SqsType.Fifo); + await Assert.That(snsAttributes.ContentBasedDeduplication).IsFalse(); + await Assert.That(snsAttributes.Tags).IsNotNull(); + await Assert.That(snsAttributes.Tags).HasSingleItem(); } } diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs index 01d6c06be6..f84e9bf2d9 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs @@ -6,23 +6,23 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsBufferedConsumerTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsBufferedConsumerTestsAsync : IAsyncDisposable { - private readonly SnsMessageProducer _messageProducer; - private readonly SqsMessageConsumer _consumer; - private readonly string _topicName; - private readonly ChannelFactory _channelFactory; + private SnsMessageProducer _messageProducer; + private SqsMessageConsumer _consumer; + private string _topicName; + private ChannelFactory _channelFactory; private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; private const int MessageCount = 4; - public SqsBufferedConsumerTestsAsync() + [Before(Test)] + public async Task Setup() { var awsConnection = GatewayFactory.CreateFactory(); @@ -34,7 +34,7 @@ public SqsBufferedConsumerTestsAsync() //we need the channel to create the queues and notifications var routingKey = new RoutingKey(_topicName); - var channel = _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( + var channel = await _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( subscriptionName: new SubscriptionName(channelName), channelName: new ChannelName(channelName), channelType: ChannelType.PubSub, @@ -45,9 +45,9 @@ public SqsBufferedConsumerTestsAsync() type: SqsType.Fifo, deduplicationScope: DeduplicationScope.MessageGroup, fifoThroughputLimit: FifoThroughputLimit.PerMessageGroupId, - tags: new Dictionary { { "Environment", "Test" } }), + tags: new Dictionary { { "Environment", "Test" } }), topicAttributes: topicAttributes, - makeChannels: OnMissingChannel.Create)).GetAwaiter().GetResult(); + makeChannels: OnMissingChannel.Create)); //we want to access via a consumer, to receive multiple messages - we don't want to expose on channel //just for the tests, so create a new consumer from the properties @@ -59,7 +59,7 @@ public SqsBufferedConsumerTestsAsync() }); } - [Fact] + [Test] public async Task When_a_message_consumer_reads_multiple_messages_async() { var routingKey = new RoutingKey(_topicName); @@ -121,10 +121,10 @@ public async Task When_a_message_consumer_reads_multiple_messages_async() //retrieve messages var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.True(messages.Length <= outstandingMessageCount); + await Assert.That(messages.Length <= outstandingMessageCount).IsTrue(); //should not receive more than buffer in one hit - Assert.True(messages.Length <= BufferSize); + await Assert.That(messages.Length <= BufferSize).IsTrue(); var moreMessages = messages.Where(m => m.Header.MessageType == MessageType.MT_COMMAND); foreach (var message in moreMessages) @@ -138,7 +138,7 @@ public async Task When_a_message_consumer_reads_multiple_messages_async() await Task.Delay(1000); } while ((iteration <= 5) && (messagesReceivedCount < MessageCount)); - Assert.Equal(4, messagesReceivedCount); + await Assert.That(messagesReceivedCount).IsEqualTo(4); } public async ValueTask DisposeAsync() @@ -148,10 +148,11 @@ public async ValueTask DisposeAsync() await _messageProducer.DisposeAsync(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().GetAwaiter().GetResult(); - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _messageProducer.DisposeAsync().GetAwaiter().GetResult(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } } diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infastructure_exists_can_assume_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infastructure_exists_can_assume_async.cs index 1c85ad66e4..847bfbdc9e 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infastructure_exists_can_assume_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infastructure_exists_can_assume_async.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -public class AwsAssumeInfrastructureTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsAssumeInfrastructureTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly SqsMessageConsumer _consumer; @@ -65,7 +64,7 @@ public AwsAssumeInfrastructureTestsAsync() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName(true)); } - [Fact] + [Test] public async Task When_infastructure_exists_can_assume() { //arrange @@ -75,17 +74,18 @@ public async Task When_infastructure_exists_can_assume() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infrastructure_exists_can_verify_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infrastructure_exists_can_verify_async.cs index cc7579b106..807217a178 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infrastructure_exists_can_verify_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infrastructure_exists_can_verify_async.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -public class AwsValidateInfrastructureTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsValidateInfrastructureTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerAsync _consumer; @@ -71,7 +70,7 @@ public AwsValidateInfrastructureTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify_async() { await _messageProducer.SendAsync(_message); @@ -81,18 +80,19 @@ public async Task When_infrastructure_exists_can_verify_async() var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); ((IAmAMessageConsumerSync)_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infrastructure_exists_can_verify_by_arn_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infrastructure_exists_can_verify_by_arn_async.cs index b288e02e7a..ad2825aa76 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infrastructure_exists_can_verify_by_arn_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_infrastructure_exists_can_verify_by_arn_async.cs @@ -7,21 +7,21 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -public class AwsValidateInfrastructureByArnTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +public class AwsValidateInfrastructureByArnTestsAsync : IAsyncDisposable { - private readonly Message _message; - private readonly IAmAMessageConsumerAsync _consumer; - private readonly SnsMessageProducer _messageProducer; - private readonly ChannelFactory _channelFactory; - private readonly MyCommand _myCommand; - - public AwsValidateInfrastructureByArnTestsAsync() + private Message _message; + private IAmAMessageConsumerAsync _consumer; + private SnsMessageProducer _messageProducer; + private ChannelFactory _channelFactory; + private MyCommand _myCommand; + + [Before(Test)] + public async Task Setup() { _myCommand = new MyCommand { Value = "Test" }; const string replyTo = "http:\\queueUrl"; @@ -37,9 +37,9 @@ public AwsValidateInfrastructureByArnTestsAsync() channelName: new ChannelName(channelName), channelType: ChannelType.PubSub, routingKey: routingKey, - queueAttributes: new SqsAttributes(type: SqsType.Fifo, tags: new Dictionary { { "Environment", "Test" } }), + queueAttributes: new SqsAttributes(type: SqsType.Fifo, tags: new Dictionary { { "Environment", "Test" } }), topicAttributes: topicAttributes, - messagePumpType: MessagePumpType.Proactor, + messagePumpType: MessagePumpType.Proactor, makeChannels: OnMissingChannel.Create); _message = new Message( @@ -51,9 +51,9 @@ public AwsValidateInfrastructureByArnTestsAsync() var awsConnection = GatewayFactory.CreateFactory(); _channelFactory = new ChannelFactory(awsConnection); - var channel = _channelFactory.CreateAsyncChannel(subscription); + var channel = await _channelFactory.CreateAsyncChannelAsync(subscription); - var topicArn = FindTopicArn(awsConnection, routingKey.ToValidSNSTopicName(true)).Result; + var topicArn = await FindTopicArn(awsConnection, routingKey.ToValidSNSTopicName(true)); var routingKeyArn = new RoutingKey(topicArn); subscription.MakeChannels = OnMissingChannel.Validate; @@ -74,7 +74,7 @@ public AwsValidateInfrastructureByArnTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify_async() { await _messageProducer.SendAsync(_message); @@ -84,7 +84,7 @@ public async Task When_infrastructure_exists_can_verify_async() var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); await _consumer.AcknowledgeAsync(message); } @@ -96,13 +96,14 @@ private static async Task FindTopicArn(AWSMessagingGatewayConnection con return topicResponse.TopicArn; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); ((IAmAMessageConsumerSync)_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs index 609634fcf1..0d220e6bfb 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerSendAsyncTests : IAsyncDisposable, IDisposable +[Category("AWS")] +public class SqsMessageProducerSendAsyncTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -72,7 +71,7 @@ public SqsMessageProducerSendAsyncTests() }); } - [Fact] + [Test] public async Task When_posting_a_message_via_the_producer_async() { // arrange @@ -87,34 +86,35 @@ public async Task When_posting_a_message_via_the_producer_async() await _channel.AcknowledgeAsync(message); // should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_topicName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_topicName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); // allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); // {"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); - Assert.Equal(_messageGroupId, message.Header.PartitionKey); - Assert.Contains(HeaderNames.DeduplicationId, message.Header.Bag); - Assert.Equal(_deduplicationId, message.Header.Bag[HeaderNames.DeduplicationId]); + await Assert.That(message.Header.PartitionKey).IsEqualTo(_messageGroupId); + await Assert.That(message.Header.Bag).ContainsKey(HeaderNames.DeduplicationId); + await Assert.That(message.Header.Bag[HeaderNames.DeduplicationId]).IsEqualTo(_deduplicationId); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_queues_missing_assume_throws_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_queues_missing_assume_throws_async.cs index 75b22b2f3d..6672bbf9af 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_queues_missing_assume_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_queues_missing_assume_throws_async.cs @@ -4,18 +4,18 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -public class AwsAssumeQueuesTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +public class AwsAssumeQueuesTestsAsync : IAsyncDisposable { - private readonly ChannelFactory _channelFactory; - private readonly IAmAMessageConsumerAsync _consumer; + private ChannelFactory _channelFactory; + private IAmAMessageConsumerAsync _consumer; - public AwsAssumeQueuesTestsAsync() + [Before(Test)] + public async Task Setup() { var channelName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); string topicName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); @@ -27,9 +27,9 @@ public AwsAssumeQueuesTestsAsync() channelName: new ChannelName(channelName), channelType: ChannelType.PubSub, routingKey: routingKey, - queueAttributes: new SqsAttributes( type:SqsType.Fifo, tags: new Dictionary { { "Environment", "Test" } }), + queueAttributes: new SqsAttributes( type:SqsType.Fifo, tags: new Dictionary { { "Environment", "Test" } }), topicAttributes: topicAttributes, - messagePumpType: MessagePumpType.Proactor, + messagePumpType: MessagePumpType.Proactor, makeChannels: OnMissingChannel.Assume); var awsConnection = GatewayFactory.CreateFactory(); @@ -42,16 +42,16 @@ public AwsAssumeQueuesTestsAsync() MakeChannels = OnMissingChannel.Create, TopicAttributes = topicAttributes }); - producer.ConfirmTopicExistsAsync(topicName).Wait(); + await producer.ConfirmTopicExistsAsync(topicName); _channelFactory = new ChannelFactory(awsConnection); - var channel = _channelFactory.CreateAsyncChannel(subscription); + var channel = await _channelFactory.CreateAsyncChannelAsync(subscription); //We need to create the topic at least, to check the queues _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_queues_missing_assume_throws_async() { //we will try to get the queue url, and fail because it does not exist @@ -59,9 +59,10 @@ await Assert.ThrowsAsync(async () => await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_queues_missing_verify_throws_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_queues_missing_verify_throws_async.cs index d74896366b..23a81d23fe 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_queues_missing_verify_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_queues_missing_verify_throws_async.cs @@ -4,19 +4,19 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AwsValidateQueuesTestsAsync : IAsyncDisposable { - private readonly AWSMessagingGatewayConnection _awsConnection; - private readonly SqsSubscription _subscription; + private AWSMessagingGatewayConnection _awsConnection; + private SqsSubscription _subscription; private ChannelFactory? _channelFactory; - public AwsValidateQueuesTestsAsync() + [Before(Test)] + public async Task Setup() { var channelName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); string topicName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); @@ -41,10 +41,10 @@ public AwsValidateQueuesTestsAsync() { MakeChannels = OnMissingChannel.Create, TopicAttributes = topicAttributes }); - producer.ConfirmTopicExistsAsync(topicName).Wait(); + await producer.ConfirmTopicExistsAsync(topicName); } - [Fact] + [Test] public async Task When_queues_missing_verify_throws_async() { // We have no queues so we should throw diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_raw_message_delivery_disabled_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_raw_message_delivery_disabled_async.cs index 3899575aaa..51bbc9aedf 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_raw_message_delivery_disabled_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_raw_message_delivery_disabled_async.cs @@ -5,12 +5,11 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -public class SqsRawMessageDeliveryTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +public class SqsRawMessageDeliveryTestsAsync : IAsyncDisposable { private readonly SnsMessageProducer _messageProducer; private readonly ChannelFactory _channelFactory; @@ -48,7 +47,7 @@ public SqsRawMessageDeliveryTestsAsync() }); } - [Fact] + [Test] public async Task When_raw_message_delivery_disabled_async() { // Arrange @@ -76,24 +75,25 @@ public async Task When_raw_message_delivery_disabled_async() await _channel.AcknowledgeAsync(messageReceived); // Assert - Assert.Equal(messageToSend.Id, messageReceived.Id); - Assert.Equal(messageToSend.Header.Topic.ToValidSNSTopicName(true), messageReceived.Header.Topic); - Assert.Equal(messageToSend.Header.MessageType, messageReceived.Header.MessageType); - Assert.Equal(messageToSend.Header.CorrelationId, messageReceived.Header.CorrelationId); - Assert.Equal(messageToSend.Header.ReplyTo, messageReceived.Header.ReplyTo); - Assert.Equal(messageToSend.Header.ContentType, messageReceived.Header.ContentType); - Assert.Contains(customHeaderItem.Key, messageReceived.Header.Bag); - Assert.Equal(customHeaderItem.Value, messageReceived.Header.Bag[customHeaderItem.Key]); - Assert.Equal(messageToSend.Body.Value, messageReceived.Body.Value); - Assert.Equal(messageGroupId, messageReceived.Header.PartitionKey); - Assert.Contains(HeaderNames.DeduplicationId, messageReceived.Header.Bag); - Assert.Equal(deduplicationId, messageReceived.Header.Bag[HeaderNames.DeduplicationId]); + await Assert.That(messageReceived.Id).IsEqualTo(messageToSend.Id); + await Assert.That(messageReceived.Header.Topic).IsEqualTo(messageToSend.Header.Topic.ToValidSNSTopicName(true)); + await Assert.That(messageReceived.Header.MessageType).IsEqualTo(messageToSend.Header.MessageType); + await Assert.That(messageReceived.Header.CorrelationId).IsEqualTo(messageToSend.Header.CorrelationId); + await Assert.That(messageReceived.Header.ReplyTo).IsEqualTo(messageToSend.Header.ReplyTo); + await Assert.That(messageReceived.Header.ContentType).IsEqualTo(messageToSend.Header.ContentType); + await Assert.That(messageReceived.Header.Bag).ContainsKey(customHeaderItem.Key); + await Assert.That(messageReceived.Header.Bag[customHeaderItem.Key]).IsEqualTo(customHeaderItem.Value); + await Assert.That(messageReceived.Body.Value).IsEqualTo(messageToSend.Body.Value); + await Assert.That(messageReceived.Header.PartitionKey).IsEqualTo(messageGroupId); + await Assert.That(messageReceived.Header.Bag).ContainsKey(HeaderNames.DeduplicationId); + await Assert.That(messageReceived.Header.Bag[HeaderNames.DeduplicationId]).IsEqualTo(deduplicationId); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs index f87d92cd8c..79b0b60046 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageConsumerRejectTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageConsumerRejectTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -62,7 +61,7 @@ public SqsMessageConsumerRejectTestsAsync() }); } - [Fact] + [Test] public async Task When_rejecting_a_message_should_delete_from_queue_async() { //Arrange @@ -75,13 +74,14 @@ public async Task When_rejecting_a_message_should_delete_from_queue_async() //Assert - message should be deleted, not requeued message = await _channel.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_requeueing_a_message_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_requeueing_a_message_async.cs index c6b69a5536..217b64d61c 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_requeueing_a_message_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_requeueing_a_message_async.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerRequeueTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerRequeueTestsAsync : IAsyncDisposable { private readonly IAmAMessageProducerAsync _sender; private Message _requeuedMessage; @@ -63,7 +62,7 @@ public SqsMessageProducerRequeueTestsAsync() _channel = _channelFactory.CreateAsyncChannel(subscription); } - [Fact] + [Test] public async Task When_requeueing_a_message_async() { await _sender.SendAsync(_message); @@ -74,13 +73,14 @@ public async Task When_requeueing_a_message_async() await _channel.AcknowledgeAsync(_requeuedMessage); - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_requeueing_redrives_to_the_dlq_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_requeueing_redrives_to_the_dlq_async.cs index fe3055058b..0175c20533 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_requeueing_redrives_to_the_dlq_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_requeueing_redrives_to_the_dlq_async.cs @@ -10,22 +10,22 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageProducerDlqTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageProducerDlqTestsAsync : IAsyncDisposable { - private readonly SnsMessageProducer _sender; - private readonly IAmAChannelAsync _channel; - private readonly ChannelFactory _channelFactory; - private readonly Message _message; - private readonly AWSMessagingGatewayConnection _awsConnection; - private readonly ChannelName _deadLetterChannel; - - public SqsMessageProducerDlqTestsAsync() + private SnsMessageProducer _sender; + private IAmAChannelAsync _channel; + private ChannelFactory _channelFactory; + private Message _message; + private AWSMessagingGatewayConnection _awsConnection; + private ChannelName _deadLetterChannel; + + [Before(Test)] + public async Task Setup() { MyCommand myCommand = new MyCommand { Value = "Test" }; const string replyTo = "http:\\queueUrl"; @@ -67,13 +67,13 @@ public SqsMessageProducerDlqTestsAsync() TopicAttributes = topicAttributes }); - _sender.ConfirmTopicExistsAsync(topicName).Wait(); + await _sender.ConfirmTopicExistsAsync(topicName); _channelFactory = new ChannelFactory(_awsConnection); - _channel = _channelFactory.CreateAsyncChannel(subscription); + _channel = await _channelFactory.CreateAsyncChannelAsync(subscription); } - [Fact] + [Test] public async Task When_requeueing_redrives_to_the_queue_async() { await _sender.SendAsync(_message); @@ -89,7 +89,7 @@ public async Task When_requeueing_redrives_to_the_queue_async() await Task.Delay(5000); int dlqCount = await GetDLQCountAsync(); - Assert.Equal(1, dlqCount); + await Assert.That(dlqCount).IsEqualTo(1); } private async Task GetDLQCountAsync() @@ -112,10 +112,11 @@ private async Task GetDLQCountAsync() return response.Messages.Count; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_throwing_defer_action_respect_redrive_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_throwing_defer_action_respect_redrive_async.cs index 462edc1afc..878da9010c 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_throwing_defer_action_respect_redrive_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_throwing_defer_action_respect_redrive_async.cs @@ -12,13 +12,12 @@ using Paramore.Brighter.MessagingGateway.AWSSQS.V4; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SnsReDrivePolicySDlqTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SnsReDrivePolicySDlqTestsAsync : IAsyncDisposable { private readonly IAmAMessagePump _messagePump; private readonly Message _message; @@ -128,7 +127,7 @@ public async Task GetDLQCountAsync(string queueName) return response.Messages.Count; } - [Fact(Skip = "Failing async tests caused by task scheduler issues")] + [Test, Skip("Failing async tests caused by task scheduler issues")] public async Task When_throwing_defer_action_respect_redrive_async() { await _sender.SendAsync(_message); @@ -144,13 +143,14 @@ public async Task When_throwing_defer_action_respect_redrive_async() await Task.Delay(5000); var dlqCount = await GetDLQCountAsync(_dlqChannelName + ".fifo"); - Assert.Equal(1, dlqCount); + await Assert.That(dlqCount).IsEqualTo(1); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_topic_missing_verify_throws_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_topic_missing_verify_throws_async.cs index 5689410af7..f9e8656908 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_topic_missing_verify_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Proactor/When_topic_missing_verify_throws_async.cs @@ -1,12 +1,11 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Proactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AwsValidateMissingTopicTestsAsync { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -22,7 +21,7 @@ public AwsValidateMissingTopicTestsAsync() // Because we don't use channel factory to create the infrastructure - it won't exist } - [Fact] + [Test] public async Task When_topic_missing_verify_throws_async() { // arrange diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_a_message_consumer_reads_multiple_messages.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_a_message_consumer_reads_multiple_messages.cs index dab990d887..c6787ba083 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_a_message_consumer_reads_multiple_messages.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_a_message_consumer_reads_multiple_messages.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsBufferedConsumerTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsBufferedConsumerTests : IAsyncDisposable { private readonly SnsMessageProducer _messageProducer; private readonly SqsMessageConsumer _consumer; @@ -63,7 +62,7 @@ public SqsBufferedConsumerTests() }); } - [Fact] + [Test] public async Task When_a_message_consumer_reads_multiple_messages() { var routingKey = new RoutingKey(_topicName); @@ -110,11 +109,11 @@ public async Task When_a_message_consumer_reads_multiple_messages() ); //send MESSAGE_COUNT messages - _messageProducer.Send(messageOne); - _messageProducer.Send(messageTwo); - _messageProducer.Send(messageThree); - _messageProducer.Send(messageFour); - _messageProducer.Send(messageFive); + await _messageProducer.SendAsync(messageOne); + await _messageProducer.SendAsync(messageTwo); + await _messageProducer.SendAsync(messageThree); + await _messageProducer.SendAsync(messageFour); + await _messageProducer.SendAsync(messageFive); int iteration = 0; @@ -126,18 +125,18 @@ public async Task When_a_message_consumer_reads_multiple_messages() var outstandingMessageCount = MessageCount - messagesReceivedCount; //retrieve messages - var messages = _consumer.Receive(TimeSpan.FromMilliseconds(10000)); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.True(messages.Length <= outstandingMessageCount); + await Assert.That(messages.Length <= outstandingMessageCount).IsTrue(); //should not receive more than buffer in one hit - Assert.True(messages.Length <= BufferSize); + await Assert.That(messages.Length <= BufferSize).IsTrue(); var moreMessages = messages.Where(m => m.Header.MessageType == MessageType.MT_COMMAND); foreach (var message in moreMessages) { messagesReceived.Add(message); - _consumer.Acknowledge(message); + await _consumer.AcknowledgeAsync(message); } messagesReceivedCount = messagesReceived.Count; @@ -146,15 +145,16 @@ public async Task When_a_message_consumer_reads_multiple_messages() } while ((iteration <= 5) && (messagesReceivedCount < MessageCount)); - Assert.Equal(4, messagesReceivedCount); + await Assert.That(messagesReceivedCount).IsEqualTo(4); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_assume.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_assume.cs index 501045ca21..c54ac9802b 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_assume.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_assume.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -public class AwsAssumeInfrastructureTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsAssumeInfrastructureTests : IAsyncDisposable { private readonly Message _message; private readonly SqsMessageConsumer _consumer; @@ -81,27 +80,28 @@ public AwsAssumeInfrastructureTests() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName(true)); } - [Fact] - public void When_infastructure_exists_can_assume() + [Test] + public async Task When_infastructure_exists_can_assume() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); - var messages = _consumer.Receive(TimeSpan.FromMilliseconds(5000)); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue - _consumer.Acknowledge(message); + await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify.cs index d9687ad4d6..2b28904fe4 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -public class AwsValidateInfrastructureTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsValidateInfrastructureTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerSync _consumer; @@ -78,11 +77,11 @@ public AwsValidateInfrastructureTests() _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -90,19 +89,20 @@ public async Task When_infrastructure_exists_can_verify() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue _consumer.Acknowledge(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); _consumer.Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify_by_arn.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify_by_arn.cs index 3890f9d9b7..1a133b264f 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify_by_arn.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify_by_arn.cs @@ -7,22 +7,22 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("CI", "Fragile")] -public class AwsValidateInfrastructureByArnTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("CI", "Fragile")] +public class AwsValidateInfrastructureByArnTests : IAsyncDisposable { - private readonly Message _message; - private readonly IAmAMessageConsumerSync _consumer; - private readonly SnsMessageProducer _messageProducer; - private readonly ChannelFactory _channelFactory; - private readonly MyCommand _myCommand; - - public AwsValidateInfrastructureByArnTests() + private Message _message; + private IAmAMessageConsumerSync _consumer; + private SnsMessageProducer _messageProducer; + private ChannelFactory _channelFactory; + private MyCommand _myCommand; + + [Before(Test)] + public async Task Setup() { const string replyTo = "http:\\queueUrl"; var contentType = new ContentType(MediaTypeNames.Text.Plain); @@ -39,9 +39,9 @@ public AwsValidateInfrastructureByArnTests() channelName: new ChannelName(channelName), channelType: ChannelType.PubSub, routingKey: routingKey, - queueAttributes: new SqsAttributes(type: SqsType.Fifo, tags: new Dictionary { { "Environment", "Test" } }), + queueAttributes: new SqsAttributes(type: SqsType.Fifo, tags: new Dictionary { { "Environment", "Test" } }), topicAttributes: topicAttributes, - messagePumpType: MessagePumpType.Reactor, + messagePumpType: MessagePumpType.Reactor, makeChannels: OnMissingChannel.Create); _message = new Message( @@ -58,7 +58,7 @@ public AwsValidateInfrastructureByArnTests() _channelFactory = new ChannelFactory(awsConnection); var channel = _channelFactory.CreateSyncChannel(subscription); - var topicArn = FindTopicArn(awsConnection, routingKey.ToValidSNSTopicName(true)); + var topicArn = await FindTopicArn(awsConnection, routingKey.ToValidSNSTopicName(true)); var routingKeyArn = new RoutingKey(topicArn); //Now change the subscription to validate, just check what we made @@ -79,11 +79,11 @@ public AwsValidateInfrastructureByArnTests() _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -91,19 +91,20 @@ public async Task When_infrastructure_exists_can_verify() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue _consumer.Acknowledge(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); _consumer.Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() @@ -114,10 +115,10 @@ public async ValueTask DisposeAsync() await _messageProducer.DisposeAsync(); } - private static string FindTopicArn(AWSMessagingGatewayConnection connection, string topicName) + private static async Task FindTopicArn(AWSMessagingGatewayConnection connection, string topicName) { using var snsClient = new AWSClientFactory(connection).CreateSnsClient(); - var topicResponse = snsClient.FindTopicAsync(topicName).GetAwaiter().GetResult(); + var topicResponse = await snsClient.FindTopicAsync(topicName); return topicResponse.TopicArn; } } diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify_by_convention.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify_by_convention.cs index 97c7881e53..935786e141 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify_by_convention.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infastructure_exists_can_verify_by_convention.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -public class AwsValidateInfrastructureByConventionTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsValidateInfrastructureByConventionTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerSync _consumer; @@ -78,11 +77,11 @@ public AwsValidateInfrastructureByConventionTests() _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -90,19 +89,20 @@ public async Task When_infrastructure_exists_can_verify() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue _consumer.Acknowledge(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); _consumer.Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infrastructure_exists_can_verify_by_convention.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infrastructure_exists_can_verify_by_convention.cs index 8687631e40..d24841ccf5 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infrastructure_exists_can_verify_by_convention.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_infrastructure_exists_can_verify_by_convention.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -public class AwsValidateInfrastructureByConventionTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +public class AwsValidateInfrastructureByConventionTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerSync _consumer; @@ -72,28 +71,29 @@ public AwsValidateInfrastructureByConventionTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify_async() { - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); var messages = _consumer.Receive(TimeSpan.FromMilliseconds(5000)); var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); _consumer.Acknowledge(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); (_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_posting_a_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_posting_a_message_via_the_messaging_gateway.cs index 9e5dba4e24..669f2a5ae2 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_posting_a_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_posting_a_message_via_the_messaging_gateway.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerSendTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerSendTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -76,12 +75,12 @@ public SqsMessageProducerSendTests() }); } - [Fact] + [Test] public async Task When_posting_a_message_via_the_producer() { //arrange _message.Header.Subject = "test subject"; - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -91,34 +90,35 @@ public async Task When_posting_a_message_via_the_producer() _channel.Acknowledge(message); //should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_topicName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_topicName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); //allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); //{"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); - Assert.Equal(_messageGroupId, message.Header.PartitionKey); - Assert.Contains(HeaderNames.DeduplicationId, message.Header.Bag); - Assert.Equal(_deduplicationId, message.Header.Bag[HeaderNames.DeduplicationId]); + await Assert.That(message.Header.PartitionKey).IsEqualTo(_messageGroupId); + await Assert.That(message.Header.Bag).ContainsKey(HeaderNames.DeduplicationId); + await Assert.That(message.Header.Bag[HeaderNames.DeduplicationId]).IsEqualTo(_deduplicationId); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_queues_missing_assume_throws.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_queues_missing_assume_throws.cs index bb9ad8bd9d..dacb2ae9dd 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_queues_missing_assume_throws.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_queues_missing_assume_throws.cs @@ -4,18 +4,18 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -public class AwsAssumeQueuesTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsAssumeQueuesTests : IAsyncDisposable { - private readonly ChannelFactory _channelFactory; - private readonly SqsMessageConsumer _consumer; + private ChannelFactory _channelFactory; + private SqsMessageConsumer _consumer; - public AwsAssumeQueuesTests() + [Before(Test)] + public async Task Setup() { var channelName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); string topicName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); @@ -45,7 +45,7 @@ public AwsAssumeQueuesTests() MakeChannels = OnMissingChannel.Create, TopicAttributes = topicAttributes }); - producer.ConfirmTopicExistsAsync(topicName).Wait(); + await producer.ConfirmTopicExistsAsync(topicName); _channelFactory = new ChannelFactory(awsConnection); var channel = _channelFactory.CreateSyncChannel(subscription); @@ -54,16 +54,17 @@ public AwsAssumeQueuesTests() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName()); } - [Fact] - public void When_queues_missing_assume_throws() + [Test] + public async Task When_queues_missing_assume_throws() { //we will try to get the queue url, and fail because it does not exist - Assert.Throws(() => _consumer.Receive(TimeSpan.FromMilliseconds(1000))); + await Assert.That(() => _consumer.Receive(TimeSpan.FromMilliseconds(1000))).ThrowsExactly(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_queues_missing_verify_throws.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_queues_missing_verify_throws.cs index 97f6561b0a..2885ece17f 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_queues_missing_verify_throws.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_queues_missing_verify_throws.cs @@ -4,19 +4,19 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -public class AwsValidateQueuesTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsValidateQueuesTests : IAsyncDisposable { - private readonly AWSMessagingGatewayConnection _awsConnection; - private readonly SqsSubscription _subscription; + private AWSMessagingGatewayConnection _awsConnection; + private SqsSubscription _subscription; private ChannelFactory? _channelFactory; - public AwsValidateQueuesTests() + [Before(Test)] + public async Task Setup() { var channelName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); string topicName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); @@ -41,22 +41,23 @@ public AwsValidateQueuesTests() { MakeChannels = OnMissingChannel.Create, TopicAttributes = topicAttributes }); - producer.ConfirmTopicExistsAsync(topicName).Wait(); + await producer.ConfirmTopicExistsAsync(topicName); } - [Fact] - public void When_queues_missing_verify_throws() + [Test] + public async Task When_queues_missing_verify_throws() { //We have no queues so we should throw //We need to do this manually in a test - will create the channel from subscriber parameters _channelFactory = new ChannelFactory(_awsConnection); - Assert.Throws(() => _channelFactory.CreateSyncChannel(_subscription)); + await Assert.That(() => _channelFactory.CreateSyncChannel(_subscription)).ThrowsExactly(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { if (_channelFactory != null) - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_raw_message_delivery_disabled.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_raw_message_delivery_disabled.cs index 34f0156b24..1f8e0fb4e2 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_raw_message_delivery_disabled.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_raw_message_delivery_disabled.cs @@ -5,12 +5,11 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -public class SqsRawMessageDeliveryTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsRawMessageDeliveryTests : IAsyncDisposable { private readonly SnsMessageProducer _messageProducer; private readonly ChannelFactory _channelFactory; @@ -51,8 +50,8 @@ public SqsRawMessageDeliveryTests() }); } - [Fact] - public void When_raw_message_delivery_disabled() + [Test] + public async Task When_raw_message_delivery_disabled() { //arrange var messageGroupId = $"MessageGroupId{Guid.NewGuid():N}"; @@ -72,32 +71,33 @@ public void When_raw_message_delivery_disabled() var messageToSent = new Message(messageHeader, new MessageBody("test content one")); //act - _messageProducer.Send(messageToSent); + await _messageProducer.SendAsync(messageToSent); var messageReceived = _channel.Receive(TimeSpan.FromMilliseconds(10000)); _channel.Acknowledge(messageReceived); //assert - Assert.Equal(messageToSent.Id, messageReceived.Id); - Assert.Equal(messageToSent.Header.Topic.ToValidSNSTopicName(true), messageReceived.Header.Topic); - Assert.Equal(messageToSent.Header.MessageType, messageReceived.Header.MessageType); - Assert.Equal(messageToSent.Header.CorrelationId, messageReceived.Header.CorrelationId); - Assert.Equal(messageToSent.Header.ReplyTo, messageReceived.Header.ReplyTo); - Assert.Equal(messageToSent.Header.ContentType, messageReceived.Header.ContentType); - Assert.Contains(customHeaderItem.Key, messageReceived.Header.Bag); - Assert.Equal(customHeaderItem.Value, messageReceived.Header.Bag[customHeaderItem.Key]); - Assert.Equal(messageToSent.Body.Value, messageReceived.Body.Value); - - Assert.Equal(messageGroupId, messageReceived.Header.PartitionKey); - Assert.Contains(HeaderNames.DeduplicationId, messageReceived.Header.Bag); - Assert.Equal(deduplicationId, messageReceived.Header.Bag[HeaderNames.DeduplicationId]); + await Assert.That(messageReceived.Id).IsEqualTo(messageToSent.Id); + await Assert.That(messageReceived.Header.Topic).IsEqualTo(messageToSent.Header.Topic.ToValidSNSTopicName(true)); + await Assert.That(messageReceived.Header.MessageType).IsEqualTo(messageToSent.Header.MessageType); + await Assert.That(messageReceived.Header.CorrelationId).IsEqualTo(messageToSent.Header.CorrelationId); + await Assert.That(messageReceived.Header.ReplyTo).IsEqualTo(messageToSent.Header.ReplyTo); + await Assert.That(messageReceived.Header.ContentType).IsEqualTo(messageToSent.Header.ContentType); + await Assert.That(messageReceived.Header.Bag).ContainsKey(customHeaderItem.Key); + await Assert.That(messageReceived.Header.Bag[customHeaderItem.Key]).IsEqualTo(customHeaderItem.Value); + await Assert.That(messageReceived.Body.Value).IsEqualTo(messageToSent.Body.Value); + + await Assert.That(messageReceived.Header.PartitionKey).IsEqualTo(messageGroupId); + await Assert.That(messageReceived.Header.Bag).ContainsKey(HeaderNames.DeduplicationId); + await Assert.That(messageReceived.Header.Bag[HeaderNames.DeduplicationId]).IsEqualTo(deduplicationId); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_rejecting_a_message_should_delete_from_queue.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_rejecting_a_message_should_delete_from_queue.cs index 97289301e2..e3f056cc03 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_rejecting_a_message_should_delete_from_queue.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_rejecting_a_message_should_delete_from_queue.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerRejectTests : IDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerRejectTests { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -64,11 +63,11 @@ public SqsMessageConsumerRejectTests() }); } - [Fact] - public void When_rejecting_a_message_should_delete_from_queue() + [Test] + public async Task When_rejecting_a_message_should_delete_from_queue() { //Arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); //Act @@ -77,13 +76,14 @@ public void When_rejecting_a_message_should_delete_from_queue() //Assert - message should be deleted, not requeued message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_requeueing_a_message.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_requeueing_a_message.cs index 1f0a6d8759..ad32deaaae 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_requeueing_a_message.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_requeueing_a_message.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerRequeueTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerRequeueTests : IAsyncDisposable { private readonly IAmAMessageProducerSync _sender; private Message? _requeuedMessage; @@ -62,8 +61,8 @@ public SqsMessageProducerRequeueTests() _channel = _channelFactory.CreateSyncChannel(subscription); } - [Fact] - public void When_requeueing_a_message() + [Test] + public async Task When_requeueing_a_message() { _sender.Send(_message); _receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); @@ -74,13 +73,14 @@ public void When_requeueing_a_message() //clear the queue _channel.Acknowledge(_requeuedMessage); - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_requeueing_redrives_to_the_dlq.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_requeueing_redrives_to_the_dlq.cs index fdf5f77873..f015351b87 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_requeueing_redrives_to_the_dlq.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_requeueing_redrives_to_the_dlq.cs @@ -9,23 +9,23 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageProducerDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageProducerDlqTests : IAsyncDisposable { - private readonly SnsMessageProducer _sender; - private readonly IAmAChannelSync _channel; - private readonly ChannelFactory _channelFactory; - private readonly Message _message; - private readonly AWSMessagingGatewayConnection _awsConnection; - private readonly string _dlqChannelName; - - public SqsMessageProducerDlqTests() + private SnsMessageProducer _sender; + private IAmAChannelSync _channel; + private ChannelFactory _channelFactory; + private Message _message; + private AWSMessagingGatewayConnection _awsConnection; + private string _dlqChannelName; + + [Before(Test)] + public async Task Setup() { MyCommand myCommand = new MyCommand { Value = "Test" }; const string replyTo = "http:\\queueUrl"; @@ -70,17 +70,17 @@ public SqsMessageProducerDlqTests() TopicAttributes = topicAttributes }); - _sender.ConfirmTopicExistsAsync(topicName).Wait(); + await _sender.ConfirmTopicExistsAsync(topicName); //We need to do this manually in a test - will create the channel from subscriber parameters _channelFactory = new ChannelFactory(_awsConnection); _channel = _channelFactory.CreateSyncChannel(subscription); } - [Fact] - public void When_requeueing_redrives_to_the_queue() + [Test] + public async Task When_requeueing_redrives_to_the_queue() { - _sender.Send(_message); + await _sender.SendAsync(_message); var receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); _channel.Requeue(receivedMessage); @@ -94,19 +94,19 @@ public void When_requeueing_redrives_to_the_queue() Task.Delay(5000); //inspect the dlq - Assert.Equal(1, GetDLQCount(_dlqChannelName + ".fifo")); + await Assert.That(await GetDLQCount(_dlqChannelName + ".fifo")).IsEqualTo(1); } - private int GetDLQCount(string queueName) + private async Task GetDLQCount(string queueName) { using var sqsClient = new AWSClientFactory(_awsConnection).CreateSqsClient(); - var queueUrlResponse = sqsClient.GetQueueUrlAsync(queueName).GetAwaiter().GetResult(); - var response = sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest + var queueUrlResponse = await sqsClient.GetQueueUrlAsync(queueName); + var response = await sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest { QueueUrl = queueUrlResponse.QueueUrl, WaitTimeSeconds = 5, MessageAttributeNames = ["All", "ApproximateReceiveCount"] - }).GetAwaiter().GetResult(); + }); if (response.HttpStatusCode != HttpStatusCode.OK) { @@ -117,10 +117,11 @@ private int GetDLQCount(string queueName) return response.Messages.Count; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_throwing_defer_action_respect_redrive.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_throwing_defer_action_respect_redrive.cs index abd438e537..7c98e29285 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_throwing_defer_action_respect_redrive.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_throwing_defer_action_respect_redrive.cs @@ -11,14 +11,13 @@ using Paramore.Brighter.MessagingGateway.AWSSQS.V4; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SnsReDrivePolicySDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SnsReDrivePolicySDlqTests : IAsyncDisposable { private readonly IAmAMessagePump _messagePump; private readonly Message _message; @@ -118,17 +117,17 @@ public SnsReDrivePolicySDlqTests() }; } - private int GetDLQCount(string queueName) + private async Task GetDLQCount(string queueName) { using var sqsClient = new AWSClientFactory(_awsConnection).CreateSqsClient(); - var queueUrlResponse = sqsClient.GetQueueUrlAsync(queueName).GetAwaiter().GetResult(); - var response = sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest + var queueUrlResponse = await sqsClient.GetQueueUrlAsync(queueName); + var response = await sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest { QueueUrl = queueUrlResponse.QueueUrl, WaitTimeSeconds = 5, MessageSystemAttributeNames = ["ApproximateReceiveCount"], MessageAttributeNames = ["All"] - }).GetAwaiter().GetResult(); + }); if (response.HttpStatusCode != HttpStatusCode.OK) { @@ -140,17 +139,17 @@ private int GetDLQCount(string queueName) } - [Fact] + [Test] public async Task When_throwing_defer_action_respect_redrive() { //put something on an SNS topic, which will be delivered to our SQS queue - _sender.Send(_message); + await _sender.SendAsync(_message); //start a message pump, let it process messages var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); await Task.Delay(5000); - //send a quit message to the pump to terminate it + //send a quit message to the pump to terminate it var quitMessage = MessageFactory.CreateQuitMessage(_subscription.RoutingKey); _channel.Enqueue(quitMessage); @@ -160,13 +159,14 @@ public async Task When_throwing_defer_action_respect_redrive() await Task.Delay(5000); //inspect the dlq - Assert.Equal(1, GetDLQCount(_dlqChannelName + ".fifo")); + await Assert.That(await GetDLQCount(_dlqChannelName + ".fifo")).IsEqualTo(1); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_topic_missing_verify_throws.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_topic_missing_verify_throws.cs index dc98c208c4..6d9bf9fb36 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_topic_missing_verify_throws.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Fifo/Reactor/When_topic_missing_verify_throws.cs @@ -1,11 +1,10 @@ -using System; +using System; using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Fifo.Reactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AwsValidateMissingTopicTests { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -21,8 +20,8 @@ public AwsValidateMissingTopicTests() //Because we don't use channel factory to create the infrastructure -it won't exist } - [Fact] - public void When_topic_missing_verify_throws() + [Test] + public async Task When_topic_missing_verify_throws() { //arrange var producer = new SnsMessageProducer(_awsConnection, @@ -35,9 +34,12 @@ public void When_topic_missing_verify_throws() var messageGroupId = $"MessageGroup{Guid.NewGuid():N}"; //act && assert - Assert.Throws(() => producer.Send(new Message( - new MessageHeader("", _routingKey, MessageType.MT_EVENT, - type: new CloudEventsType("plain/text"), partitionKey: messageGroupId), - new MessageBody("Test")))); + Assert.ThrowsExactly(() => + { + producer.Send(new Message( + new MessageHeader("", _routingKey, MessageType.MT_EVENT, + type: new CloudEventsType("plain/text"), partitionKey: messageGroupId), + new MessageBody("Test"))); + }); } } diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs index eb7874b0d0..eb5a8e236e 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs @@ -6,24 +6,24 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsBufferedConsumerTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsBufferedConsumerTestsAsync : IAsyncDisposable { - private readonly SnsMessageProducer _messageProducer; - private readonly SqsMessageConsumer _consumer; - private readonly string _topicName; - private readonly ChannelFactory _channelFactory; + private SnsMessageProducer _messageProducer; + private SqsMessageConsumer _consumer; + private string _topicName; + private ChannelFactory _channelFactory; private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; private const int MessageCount = 4; - public SqsBufferedConsumerTestsAsync() + [Before(Test)] + public async Task Setup() { var awsConnection = GatewayFactory.CreateFactory(); @@ -34,7 +34,7 @@ public SqsBufferedConsumerTestsAsync() //we need the channel to create the queues and notifications var routingKey = new RoutingKey(_topicName); - var channel = _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( + var channel = await _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( subscriptionName: new SubscriptionName(channelName), channelName: new ChannelName(channelName), routingKey: routingKey, @@ -42,7 +42,7 @@ public SqsBufferedConsumerTestsAsync() messagePumpType: MessagePumpType.Proactor, makeChannels: OnMissingChannel.Create, queueAttributes: new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }), - topicAttributes: new SnsAttributes(tags: [new Tag { Key = "Environment", Value = "Test" }]))).GetAwaiter().GetResult(); + topicAttributes: new SnsAttributes(tags: [new Tag { Key = "Environment", Value = "Test" }]))); //we want to access via a consumer, to receive multiple messages - we don't want to expose on channel //just for the tests, so create a new consumer from the properties @@ -51,9 +51,9 @@ public SqsBufferedConsumerTestsAsync() new SnsPublication { MakeChannels = OnMissingChannel.Create }); } - [Theory] - [InlineData(true)] - [InlineData(false)] + [Test] + [Arguments(true)] + [Arguments(false)] public async Task When_a_message_consumer_reads_multiple_messages_async(bool fairQueue) { var partitionOne = fairQueue ? new PartitionKey(Uuid.NewAsString()) : PartitionKey.Empty; @@ -101,10 +101,10 @@ public async Task When_a_message_consumer_reads_multiple_messages_async(bool fai //retrieve messages var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.True(messages.Length <= outstandingMessageCount); + await Assert.That(messages.Length <= outstandingMessageCount).IsTrue(); //should not receive more than buffer in one hit - Assert.True(messages.Length <= BufferSize); + await Assert.That(messages.Length <= BufferSize).IsTrue(); var moreMessages = messages.Where(m => m.Header.MessageType == MessageType.MT_COMMAND); foreach (var message in moreMessages) @@ -119,7 +119,7 @@ public async Task When_a_message_consumer_reads_multiple_messages_async(bool fai } while ((iteration <= 5) && (messagesReceivedCount < MessageCount)); - Assert.Equal(4, messagesReceivedCount); + await Assert.That(messagesReceivedCount).IsEqualTo(4); } public async ValueTask DisposeAsync() @@ -129,10 +129,11 @@ public async ValueTask DisposeAsync() await _messageProducer.DisposeAsync(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().GetAwaiter().GetResult(); - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _messageProducer.DisposeAsync().GetAwaiter().GetResult(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } } diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_customising_aws_client_config_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_customising_aws_client_config_async.cs index 8063220d2c..0335e38f64 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_customising_aws_client_config_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_customising_aws_client_config_async.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -public class CustomisingAwsClientConfigTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +public class CustomisingAwsClientConfigTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -67,7 +66,7 @@ public CustomisingAwsClientConfigTestsAsync() ); } - [Fact] + [Test] public async Task When_customising_aws_client_config() { //arrange @@ -78,22 +77,23 @@ public async Task When_customising_aws_client_config() var message = await _channel.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); //clear the queue - Assert.NotEqual(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); await _channel.AcknowledgeAsync(message); //publish_and_subscribe_should_use_custom_http_client_factory - Assert.Contains("async_pub", InterceptingDelegatingHandler.RequestCount); - Assert.True((InterceptingDelegatingHandler.RequestCount["async_pub"]) > (0)); + await Assert.That(InterceptingDelegatingHandler.RequestCount).ContainsKey("async_pub"); + await Assert.That((InterceptingDelegatingHandler.RequestCount["async_pub"]) > (0)).IsTrue(); - Assert.Contains("async_pub", InterceptingDelegatingHandler.RequestCount); - Assert.True((InterceptingDelegatingHandler.RequestCount["async_pub"]) > (0)); + await Assert.That(InterceptingDelegatingHandler.RequestCount).ContainsKey("async_pub"); + await Assert.That((InterceptingDelegatingHandler.RequestCount["async_pub"]) > (0)).IsTrue(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_infastructure_exists_can_assume_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_infastructure_exists_can_assume_async.cs index 1eef276308..8f3003ea6b 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_infastructure_exists_can_assume_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_infastructure_exists_can_assume_async.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -public class AwsAssumeInfrastructureTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsAssumeInfrastructureTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly SqsMessageConsumer _consumer; private readonly SnsMessageProducer _messageProducer; @@ -68,7 +67,7 @@ public AwsAssumeInfrastructureTestsAsync() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName()); } - [Fact] + [Test] public async Task When_infastructure_exists_can_assume() { //arrange @@ -78,17 +77,18 @@ public async Task When_infastructure_exists_can_assume() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_async.cs index 54c1b2ab2e..fb0579a5d2 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_async.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Proactor { - [Trait("Category", "AWS")] - public class AwsValidateInfrastructureTestsAsync : IDisposable, IAsyncDisposable + [Category("AWS")] + public class AwsValidateInfrastructureTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerAsync _consumer; @@ -69,7 +68,7 @@ public AwsValidateInfrastructureTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify_async() { await _messageProducer.SendAsync(_message); @@ -79,18 +78,19 @@ public async Task When_infrastructure_exists_can_verify_async() var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); ((IAmAMessageConsumerSync)_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_by_arn_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_by_arn_async.cs index 3bca81d33d..8ce295488d 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_by_arn_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_by_arn_async.cs @@ -9,22 +9,22 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -public class AwsValidateInfrastructureByArnTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +public class AwsValidateInfrastructureByArnTestsAsync : IAsyncDisposable { - private readonly Message _message; - private readonly IAmAMessageConsumerAsync _consumer; - private readonly SnsMessageProducer _messageProducer; - private readonly ChannelFactory _channelFactory; - private readonly MyCommand _myCommand; - - public AwsValidateInfrastructureByArnTestsAsync() + private Message _message; + private IAmAMessageConsumerAsync _consumer; + private SnsMessageProducer _messageProducer; + private ChannelFactory _channelFactory; + private MyCommand _myCommand; + + [Before(Test)] + public async Task Setup() { _myCommand = new MyCommand { Value = "Test" }; string correlationId = Id.Random(); @@ -53,9 +53,9 @@ public AwsValidateInfrastructureByArnTestsAsync() var awsConnection = GatewayFactory.CreateFactory(credentials, region); _channelFactory = new ChannelFactory(awsConnection); - var channel = _channelFactory.CreateAsyncChannel(subscription); + var channel = await _channelFactory.CreateAsyncChannelAsync(subscription); - var topicArn = FindTopicArn(awsConnection, routingKey.Value).Result; + var topicArn = await FindTopicArn(awsConnection, routingKey.Value); var routingKeyArn = new RoutingKey(topicArn); subscription.MakeChannels = OnMissingChannel.Validate; @@ -75,7 +75,7 @@ public AwsValidateInfrastructureByArnTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify_async() { await _messageProducer.SendAsync(_message); @@ -85,7 +85,7 @@ public async Task When_infrastructure_exists_can_verify_async() var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); await _consumer.AcknowledgeAsync(message); } @@ -97,13 +97,14 @@ private static async Task FindTopicArn(AWSMessagingGatewayConnection con return topicResponse.TopicArn; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); ((IAmAMessageConsumerSync)_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_by_convention_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_by_convention_async.cs index 0a53861b7b..7b64e9c47b 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_by_convention_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_infrastructure_exists_can_verify_by_convention_async.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -public class AwsValidateInfrastructureByConventionTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +public class AwsValidateInfrastructureByConventionTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerAsync _consumer; @@ -69,7 +68,7 @@ public AwsValidateInfrastructureByConventionTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify_async() { await _messageProducer.SendAsync(_message); @@ -79,18 +78,19 @@ public async Task When_infrastructure_exists_can_verify_async() var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); ((IAmAMessageConsumerSync)_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs index 8afe1f5546..f179c6445a 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerSendAsyncTests : IAsyncDisposable, IDisposable +[Category("AWS")] +public class SqsMessageProducerSendAsyncTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -64,9 +63,9 @@ public SqsMessageProducerSendAsyncTests() }); } - [Theory] - [InlineData(true)] - [InlineData(false)] + [Test] + [Arguments(true)] + [Arguments(false)] public async Task When_posting_a_message_via_the_producer_async(bool fairQueue) { // arrange @@ -82,30 +81,31 @@ public async Task When_posting_a_message_via_the_producer_async(bool fairQueue) await _channel.AcknowledgeAsync(message); // should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_topicName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_topicName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); // allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); // {"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_queues_missing_assume_throws_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_queues_missing_assume_throws_async.cs index e77f7b46f2..7af74aaa6c 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_queues_missing_assume_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_queues_missing_assume_throws_async.cs @@ -4,19 +4,19 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -public class AwsAssumeQueuesTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +public class AwsAssumeQueuesTestsAsync : IAsyncDisposable { - private readonly ChannelFactory _channelFactory; - private readonly IAmAMessageConsumerAsync _consumer; + private ChannelFactory _channelFactory; + private IAmAMessageConsumerAsync _consumer; - public AwsAssumeQueuesTestsAsync() + [Before(Test)] + public async Task Setup() { var channelName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); string topicName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); @@ -42,16 +42,16 @@ public AwsAssumeQueuesTestsAsync() MakeChannels = OnMissingChannel.Create }); - producer.ConfirmTopicExistsAsync(topicName).Wait(); + await producer.ConfirmTopicExistsAsync(topicName); _channelFactory = new ChannelFactory(awsConnection); - var channel = _channelFactory.CreateAsyncChannel(subscription); + var channel = await _channelFactory.CreateAsyncChannelAsync(subscription); //We need to create the topic at least, to check the queues _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_queues_missing_assume_throws_async() { //we will try to get the queue url, and fail because it does not exist @@ -59,9 +59,10 @@ await Assert.ThrowsAsync(async () => await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_queues_missing_verify_throws_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_queues_missing_verify_throws_async.cs index 8392b094f9..052ddedbcf 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_queues_missing_verify_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_queues_missing_verify_throws_async.cs @@ -4,20 +4,20 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AwsValidateQueuesTestsAsync : IAsyncDisposable { - private readonly AWSMessagingGatewayConnection _awsConnection; - private readonly SqsSubscription _subscription; + private AWSMessagingGatewayConnection _awsConnection; + private SqsSubscription _subscription; private ChannelFactory? _channelFactory; - public AwsValidateQueuesTestsAsync() + [Before(Test)] + public async Task Setup() { var channelName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); string topicName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); @@ -41,10 +41,10 @@ public AwsValidateQueuesTestsAsync() { MakeChannels = OnMissingChannel.Create }); - producer.ConfirmTopicExistsAsync(topicName).Wait(); + await producer.ConfirmTopicExistsAsync(topicName); } - [Fact] + [Test] public async Task When_queues_missing_verify_throws_async() { // We have no queues so we should throw diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_raw_message_delivery_disabled_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_raw_message_delivery_disabled_async.cs index ce9dd23838..e67480b69d 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_raw_message_delivery_disabled_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_raw_message_delivery_disabled_async.cs @@ -5,13 +5,12 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -public class SqsRawMessageDeliveryTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +public class SqsRawMessageDeliveryTestsAsync : IAsyncDisposable { private readonly SnsMessageProducer _messageProducer; private readonly ChannelFactory _channelFactory; @@ -49,7 +48,7 @@ public SqsRawMessageDeliveryTestsAsync() }); } - [Fact] + [Test] public async Task When_raw_message_delivery_disabled_async() { // Arrange @@ -74,21 +73,22 @@ public async Task When_raw_message_delivery_disabled_async() await _channel.AcknowledgeAsync(messageReceived); // Assert - Assert.Equal(messageToSend.Id, messageReceived.Id); - Assert.Equal(messageToSend.Header.Topic, messageReceived.Header.Topic); - Assert.Equal(messageToSend.Header.MessageType, messageReceived.Header.MessageType); - Assert.Equal(messageToSend.Header.CorrelationId, messageReceived.Header.CorrelationId); - Assert.Equal(messageToSend.Header.ReplyTo, messageReceived.Header.ReplyTo); - Assert.Equal(messageToSend.Header.ContentType, messageReceived.Header.ContentType); - Assert.Contains(customHeaderItem.Key, messageReceived.Header.Bag); - Assert.Equal(customHeaderItem.Value, messageReceived.Header.Bag[customHeaderItem.Key]); - Assert.Equal(messageToSend.Body.Value, messageReceived.Body.Value); + await Assert.That(messageReceived.Id).IsEqualTo(messageToSend.Id); + await Assert.That(messageReceived.Header.Topic).IsEqualTo(messageToSend.Header.Topic); + await Assert.That(messageReceived.Header.MessageType).IsEqualTo(messageToSend.Header.MessageType); + await Assert.That(messageReceived.Header.CorrelationId).IsEqualTo(messageToSend.Header.CorrelationId); + await Assert.That(messageReceived.Header.ReplyTo).IsEqualTo(messageToSend.Header.ReplyTo); + await Assert.That(messageReceived.Header.ContentType).IsEqualTo(messageToSend.Header.ContentType); + await Assert.That(messageReceived.Header.Bag).ContainsKey(customHeaderItem.Key); + await Assert.That(messageReceived.Header.Bag[customHeaderItem.Key]).IsEqualTo(customHeaderItem.Value); + await Assert.That(messageReceived.Body.Value).IsEqualTo(messageToSend.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs index d44c76ad1e..9ca973844d 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs @@ -6,15 +6,14 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerRejectTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerRejectTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -56,7 +55,7 @@ public SqsMessageConsumerRejectTestsAsync() _messageProducer = new SnsMessageProducer(awsConnection, new SnsPublication { MakeChannels = OnMissingChannel.Create }); } - [Fact] + [Test] public async Task When_rejecting_a_message_should_delete_from_queue_async() { //Arrange @@ -69,13 +68,14 @@ public async Task When_rejecting_a_message_should_delete_from_queue_async() //Assert - message should be deleted, not requeued message = await _channel.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_requeueing_a_message_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_requeueing_a_message_async.cs index cd725633d1..50ba450df7 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_requeueing_a_message_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_requeueing_a_message_async.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerRequeueTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerRequeueTestsAsync : IAsyncDisposable { private readonly IAmAMessageProducerAsync _sender; private Message? _requeuedMessage; @@ -59,7 +58,7 @@ public SqsMessageProducerRequeueTestsAsync() _channel = _channelFactory.CreateAsyncChannel(subscription); } - [Fact] + [Test] public async Task When_requeueing_a_message_async() { await _sender.SendAsync(_message); @@ -70,13 +69,14 @@ public async Task When_requeueing_a_message_async() await _channel.AcknowledgeAsync(_requeuedMessage); - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_requeueing_redrives_to_the_dlq_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_requeueing_redrives_to_the_dlq_async.cs index 6c812d0829..9a5d12e76b 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_requeueing_redrives_to_the_dlq_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_requeueing_redrives_to_the_dlq_async.cs @@ -10,23 +10,23 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageProducerDlqTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageProducerDlqTestsAsync : IAsyncDisposable { - private readonly SnsMessageProducer _sender; - private readonly IAmAChannelAsync _channel; - private readonly ChannelFactory _channelFactory; - private readonly Message _message; - private readonly AWSMessagingGatewayConnection _awsConnection; - private readonly ChannelName _deadLetterChannel; - - public SqsMessageProducerDlqTestsAsync() + private SnsMessageProducer _sender; + private IAmAChannelAsync _channel; + private ChannelFactory _channelFactory; + private Message _message; + private AWSMessagingGatewayConnection _awsConnection; + private ChannelName _deadLetterChannel; + + [Before(Test)] + public async Task Setup() { MyCommand myCommand = new MyCommand { Value = "Test" }; string correlationId = Guid.NewGuid().ToString(); @@ -61,13 +61,13 @@ public SqsMessageProducerDlqTestsAsync() _sender = new SnsMessageProducer(_awsConnection, new SnsPublication { Topic = routingKey, MakeChannels = OnMissingChannel.Create }); - _sender.ConfirmTopicExistsAsync(topicName).Wait(); + await _sender.ConfirmTopicExistsAsync(topicName); _channelFactory = new ChannelFactory(_awsConnection); - _channel = _channelFactory.CreateAsyncChannel(subscription); + _channel = await _channelFactory.CreateAsyncChannelAsync(subscription); } - [Fact] + [Test] public async Task When_requeueing_redrives_to_the_queue_async() { await _sender.SendAsync(_message); @@ -83,7 +83,7 @@ public async Task When_requeueing_redrives_to_the_queue_async() await Task.Delay(5000); int dlqCount = await GetDLQCountAsync(); - Assert.Equal(1, dlqCount); + await Assert.That(dlqCount).IsEqualTo(1); } private async Task GetDLQCountAsync() @@ -106,10 +106,11 @@ private async Task GetDLQCountAsync() return response.Messages.Count; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_throwing_defer_action_respect_redrive_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_throwing_defer_action_respect_redrive_async.cs index 99d10d0a15..cfec9ca08a 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_throwing_defer_action_respect_redrive_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_throwing_defer_action_respect_redrive_async.cs @@ -13,13 +13,12 @@ using Paramore.Brighter.MessagingGateway.AWSSQS.V4; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SnsReDrivePolicySDlqTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SnsReDrivePolicySDlqTestsAsync : IAsyncDisposable { private readonly IAmAMessagePump _messagePump; private readonly Message _message; @@ -126,7 +125,7 @@ public async Task GetDLQCountAsync(string queueName) return response.Messages.Count; } - [Fact(Skip = "Failing async tests caused by task scheduler issues")] + [Test, Skip("Failing async tests caused by task scheduler issues")] public async Task When_throwing_defer_action_respect_redrive_async() { await _sender.SendAsync(_message); @@ -142,13 +141,14 @@ public async Task When_throwing_defer_action_respect_redrive_async() await Task.Delay(5000); int dlqCount = await GetDLQCountAsync(_dlqChannelName); - Assert.Equal(1, dlqCount); + await Assert.That(dlqCount).IsEqualTo(1); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_topic_missing_verify_throws_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_topic_missing_verify_throws_async.cs index 468fb32603..2828bbea93 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_topic_missing_verify_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Proactor/When_topic_missing_verify_throws_async.cs @@ -1,12 +1,11 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Proactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AwsValidateMissingTopicTestsAsync { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -22,7 +21,7 @@ public AwsValidateMissingTopicTestsAsync() // Because we don't use channel factory to create the infrastructure - it won't exist } - [Fact] + [Test] public async Task When_topic_missing_verify_throws_async() { // arrange diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_a_message_consumer_reads_multiple_messages.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_a_message_consumer_reads_multiple_messages.cs index d30f9bc6bb..f39b33e971 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_a_message_consumer_reads_multiple_messages.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_a_message_consumer_reads_multiple_messages.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsBufferedConsumerTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsBufferedConsumerTests : IAsyncDisposable { private readonly SnsMessageProducer _messageProducer; private readonly SqsMessageConsumer _consumer; @@ -55,9 +54,9 @@ public SqsBufferedConsumerTests() }); } - [Theory] - [InlineData(true)] - [InlineData(false)] + [Test] + [Arguments(true)] + [Arguments(false)] public async Task When_a_message_consumer_reads_multiple_messages(bool fairQueue) { var partitionOne = fairQueue ? new PartitionKey(Uuid.NewAsString()) : PartitionKey.Empty; @@ -90,10 +89,10 @@ public async Task When_a_message_consumer_reads_multiple_messages(bool fairQueue ); //send MESSAGE_COUNT messages - _messageProducer.Send(messageOne); - _messageProducer.Send(messageTwo); - _messageProducer.Send(messageThree); - _messageProducer.Send(messageFour); + await _messageProducer.SendAsync(messageOne); + await _messageProducer.SendAsync(messageTwo); + await _messageProducer.SendAsync(messageThree); + await _messageProducer.SendAsync(messageFour); int iteration = 0; @@ -105,18 +104,18 @@ public async Task When_a_message_consumer_reads_multiple_messages(bool fairQueue var outstandingMessageCount = MessageCount - messagesReceivedCount; //retrieve messages - var messages = _consumer.Receive(TimeSpan.FromMilliseconds(10000)); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.True(messages.Length <= outstandingMessageCount); + await Assert.That(messages.Length <= outstandingMessageCount).IsTrue(); //should not receive more than buffer in one hit - Assert.True(messages.Length <= BufferSize); + await Assert.That(messages.Length <= BufferSize).IsTrue(); var moreMessages = messages.Where(m => m.Header.MessageType == MessageType.MT_COMMAND); foreach (var message in moreMessages) { messagesReceived.Add(message); - _consumer.Acknowledge(message); + await _consumer.AcknowledgeAsync(message); } messagesReceivedCount = messagesReceived.Count; @@ -126,16 +125,17 @@ public async Task When_a_message_consumer_reads_multiple_messages(bool fairQueue } while ((iteration <= 5) && (messagesReceivedCount < MessageCount)); - Assert.Equal(4, messagesReceivedCount); + await Assert.That(messagesReceivedCount).IsEqualTo(4); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_customising_aws_client_config.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_customising_aws_client_config.cs index ea2a7116a2..92649e8cd1 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_customising_aws_client_config.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_customising_aws_client_config.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -public class CustomisingAwsClientConfigTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class CustomisingAwsClientConfigTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -63,11 +62,11 @@ public CustomisingAwsClientConfigTests() MakeChannels = OnMissingChannel.Create }); } - [Fact] + [Test] public async Task When_customising_aws_client_config() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -77,18 +76,19 @@ public async Task When_customising_aws_client_config() _channel.Acknowledge(message); //publish_and_subscribe_should_use_custom_http_client_factory - Assert.Contains("sync_sub", InterceptingDelegatingHandler.RequestCount); - Assert.True((InterceptingDelegatingHandler.RequestCount["sync_sub"]) > (0)); + await Assert.That(InterceptingDelegatingHandler.RequestCount).ContainsKey("sync_sub"); + await Assert.That((InterceptingDelegatingHandler.RequestCount["sync_sub"]) > (0)).IsTrue(); - Assert.Contains("sync_pub", InterceptingDelegatingHandler.RequestCount); - Assert.True((InterceptingDelegatingHandler.RequestCount["sync_pub"]) > (0)); + await Assert.That(InterceptingDelegatingHandler.RequestCount).ContainsKey("sync_pub"); + await Assert.That((InterceptingDelegatingHandler.RequestCount["sync_pub"]) > (0)).IsTrue(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_assume.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_assume.cs index a2c44ac4e7..3064584ceb 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_assume.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_assume.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -public class AwsAssumeInfrastructureTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsAssumeInfrastructureTests : IAsyncDisposable { private readonly Message _message; private readonly SqsMessageConsumer _consumer; @@ -65,27 +64,28 @@ public AwsAssumeInfrastructureTests() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName()); } - [Fact] - public void When_infastructure_exists_can_assume() + [Test] + public async Task When_infastructure_exists_can_assume() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); - var messages = _consumer.Receive(TimeSpan.FromMilliseconds(5000)); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue - _consumer.Acknowledge(message); + await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify.cs index 3d78c8c794..73764c28b0 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -public class AwsValidateInfrastructureTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsValidateInfrastructureTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerSync _consumer; @@ -71,11 +70,11 @@ public AwsValidateInfrastructureTests() _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -83,19 +82,20 @@ public async Task When_infrastructure_exists_can_verify() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue _consumer.Acknowledge(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); _consumer.Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify_by_arn.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify_by_arn.cs index e5246ed530..5c6653bedd 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify_by_arn.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify_by_arn.cs @@ -9,22 +9,22 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -public class AwsValidateInfrastructureByArnTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsValidateInfrastructureByArnTests : IAsyncDisposable { - private readonly Message _message; - private readonly IAmAMessageConsumerAsync _consumer; - private readonly SnsMessageProducer _messageProducer; - private readonly ChannelFactory _channelFactory; - private readonly MyCommand _myCommand; - - public AwsValidateInfrastructureByArnTests() + private Message _message; + private IAmAMessageConsumerAsync _consumer; + private SnsMessageProducer _messageProducer; + private ChannelFactory _channelFactory; + private MyCommand _myCommand; + + [Before(Test)] + public async Task Setup() { _myCommand = new MyCommand { Value = "Test" }; string correlationId = Guid.NewGuid().ToString(); @@ -56,9 +56,9 @@ public AwsValidateInfrastructureByArnTests() //This doesn't look that different from our create tests - this is because we create using the channel factory in //our AWS transport, not the consumer (as it's a more likely to use infrastructure declared elsewhere) _channelFactory = new ChannelFactory(awsConnection); - var channel = _channelFactory.CreateAsyncChannel(subscription); + var channel = await _channelFactory.CreateAsyncChannelAsync(subscription); - var topicArn = FindTopicArn(awsConnection, routingKey.Value); + var topicArn = await FindTopicArn(awsConnection, routingKey.Value); var routingKeyArn = new RoutingKey(topicArn); //Now change the subscription to validate, just check what we made @@ -79,7 +79,7 @@ public AwsValidateInfrastructureByArnTests() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify() { //arrange @@ -91,20 +91,21 @@ public async Task When_infrastructure_exists_can_verify() //Assert var message = messages.First(); - Assert.NotEqual(MessageType.MT_NONE, message.Header.MessageType); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); ((IAmAMessageConsumerSync)_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() @@ -115,10 +116,10 @@ public async ValueTask DisposeAsync() await _messageProducer.DisposeAsync(); } - private static string FindTopicArn(AWSMessagingGatewayConnection connection, string topicName) + private static async Task FindTopicArn(AWSMessagingGatewayConnection connection, string topicName) { using var snsClient = new AWSClientFactory(connection).CreateSnsClient(); - var topicResponse = snsClient.FindTopicAsync(topicName).GetAwaiter().GetResult(); + var topicResponse = await snsClient.FindTopicAsync(topicName); return topicResponse.TopicArn; } } diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify_by_convention.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify_by_convention.cs index ab5e3cc3b8..a5bec4c961 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify_by_convention.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_infastructure_exists_can_verify_by_convention.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -public class AwsValidateInfrastructureByConventionTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsValidateInfrastructureByConventionTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerSync _consumer; @@ -69,11 +68,11 @@ public AwsValidateInfrastructureByConventionTests() _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -81,19 +80,20 @@ public async Task When_infrastructure_exists_can_verify() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue _consumer.Acknowledge(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); _consumer.Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_posting_a_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_posting_a_message_via_the_messaging_gateway.cs index 7907c03f3a..29045b3c4c 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_posting_a_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_posting_a_message_via_the_messaging_gateway.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerSendTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerSendTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -62,15 +61,15 @@ public SqsMessageProducerSendTests() new SnsPublication{Topic = new RoutingKey(_topicName), MakeChannels = OnMissingChannel.Create}); } - [Theory] - [InlineData(true)] - [InlineData(false)] + [Test] + [Arguments(true)] + [Arguments(false)] public async Task When_posting_a_message_via_the_producer(bool fairQueue) { //arrange _message.Header.Subject = "test subject"; _message.Header.PartitionKey = fairQueue ? new PartitionKey(Uuid.NewAsString()) : PartitionKey.Empty; - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -80,30 +79,31 @@ public async Task When_posting_a_message_via_the_producer(bool fairQueue) _channel.Acknowledge(message); //should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_topicName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_topicName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); //allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); //{"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_queues_missing_assume_throws.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_queues_missing_assume_throws.cs index 6efdc8a68c..488544fa83 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_queues_missing_assume_throws.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_queues_missing_assume_throws.cs @@ -4,19 +4,19 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -public class AwsAssumeQueuesTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsAssumeQueuesTests : IAsyncDisposable { - private readonly ChannelFactory _channelFactory; - private readonly SqsMessageConsumer _consumer; + private ChannelFactory _channelFactory; + private SqsMessageConsumer _consumer; - public AwsAssumeQueuesTests() + [Before(Test)] + public async Task Setup() { var channelName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); string topicName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); @@ -42,7 +42,7 @@ public AwsAssumeQueuesTests() MakeChannels = OnMissingChannel.Create }); - producer.ConfirmTopicExistsAsync(topicName).Wait(); + await producer.ConfirmTopicExistsAsync(topicName); _channelFactory = new ChannelFactory(awsConnection); var channel = _channelFactory.CreateSyncChannel(subscription); @@ -51,16 +51,17 @@ public AwsAssumeQueuesTests() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName()); } - [Fact] - public void When_queues_missing_assume_throws() + [Test] + public async Task When_queues_missing_assume_throws() { //we will try to get the queue url, and fail because it does not exist - Assert.Throws(() => _consumer.Receive(TimeSpan.FromMilliseconds(1000))); + await Assert.That(() => _consumer.Receive(TimeSpan.FromMilliseconds(1000))).ThrowsExactly(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_queues_missing_verify_throws.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_queues_missing_verify_throws.cs index 07ee0c8f51..74f4f65853 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_queues_missing_verify_throws.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_queues_missing_verify_throws.cs @@ -4,20 +4,20 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -public class AwsValidateQueuesTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AwsValidateQueuesTests : IAsyncDisposable { - private readonly AWSMessagingGatewayConnection _awsConnection; - private readonly SqsSubscription _subscription; + private AWSMessagingGatewayConnection _awsConnection; + private SqsSubscription _subscription; private ChannelFactory? _channelFactory; - public AwsValidateQueuesTests() + [Before(Test)] + public async Task Setup() { var channelName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); string topicName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); @@ -41,23 +41,24 @@ public AwsValidateQueuesTests() { MakeChannels = OnMissingChannel.Create }); - producer.ConfirmTopicExistsAsync(topicName).Wait(); + await producer.ConfirmTopicExistsAsync(topicName); } - [Fact] - public void When_queues_missing_verify_throws() + [Test] + public async Task When_queues_missing_verify_throws() { //We have no queues so we should throw //We need to do this manually in a test - will create the channel from subscriber parameters _channelFactory = new ChannelFactory(_awsConnection); - Assert.Throws(() => _channelFactory.CreateSyncChannel(_subscription)); + await Assert.That(() => _channelFactory.CreateSyncChannel(_subscription)).ThrowsExactly(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { if (_channelFactory != null) - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_raw_message_delivery_disabled.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_raw_message_delivery_disabled.cs index 0e7968e4a0..7c07a796f4 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_raw_message_delivery_disabled.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_raw_message_delivery_disabled.cs @@ -5,13 +5,12 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -public class SqsRawMessageDeliveryTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsRawMessageDeliveryTests : IAsyncDisposable { private readonly SnsMessageProducer _messageProducer; private readonly ChannelFactory _channelFactory; @@ -48,8 +47,8 @@ public SqsRawMessageDeliveryTests() }); } - [Fact] - public void When_raw_message_delivery_disabled() + [Test] + public async Task When_raw_message_delivery_disabled() { //arrange var messageHeader = new MessageHeader( @@ -66,28 +65,29 @@ public void When_raw_message_delivery_disabled() var messageToSent = new Message(messageHeader, new MessageBody("test content one")); //act - _messageProducer.Send(messageToSent); + await _messageProducer.SendAsync(messageToSent); var messageReceived = _channel.Receive(TimeSpan.FromMilliseconds(10000)); _channel.Acknowledge(messageReceived); //assert - Assert.Equal(messageToSent.Id, messageReceived.Id); - Assert.Equal(messageToSent.Header.Topic, messageReceived.Header.Topic); - Assert.Equal(messageToSent.Header.MessageType, messageReceived.Header.MessageType); - Assert.Equal(messageToSent.Header.CorrelationId, messageReceived.Header.CorrelationId); - Assert.Equal(messageToSent.Header.ReplyTo, messageReceived.Header.ReplyTo); - Assert.Equal(messageToSent.Header.ContentType, messageReceived.Header.ContentType); - Assert.Contains(customHeaderItem.Key, messageReceived.Header.Bag); - Assert.Equal(customHeaderItem.Value, messageReceived.Header.Bag[customHeaderItem.Key]); - Assert.Equal(messageToSent.Body.Value, messageReceived.Body.Value); + await Assert.That(messageReceived.Id).IsEqualTo(messageToSent.Id); + await Assert.That(messageReceived.Header.Topic).IsEqualTo(messageToSent.Header.Topic); + await Assert.That(messageReceived.Header.MessageType).IsEqualTo(messageToSent.Header.MessageType); + await Assert.That(messageReceived.Header.CorrelationId).IsEqualTo(messageToSent.Header.CorrelationId); + await Assert.That(messageReceived.Header.ReplyTo).IsEqualTo(messageToSent.Header.ReplyTo); + await Assert.That(messageReceived.Header.ContentType).IsEqualTo(messageToSent.Header.ContentType); + await Assert.That(messageReceived.Header.Bag).ContainsKey(customHeaderItem.Key); + await Assert.That(messageReceived.Header.Bag[customHeaderItem.Key]).IsEqualTo(customHeaderItem.Value); + await Assert.That(messageReceived.Body.Value).IsEqualTo(messageToSent.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_rejecting_a_message_should_delete_from_queue.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_rejecting_a_message_should_delete_from_queue.cs index 9cba148e44..8337e9cde6 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_rejecting_a_message_should_delete_from_queue.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_rejecting_a_message_should_delete_from_queue.cs @@ -6,15 +6,14 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerRejectTests : IDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerRejectTests { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -58,11 +57,11 @@ public SqsMessageConsumerRejectTests() _messageProducer = new SnsMessageProducer(awsConnection, new SnsPublication{MakeChannels = OnMissingChannel.Create}); } - [Fact] - public void When_rejecting_a_message_should_delete_from_queue() + [Test] + public async Task When_rejecting_a_message_should_delete_from_queue() { //Arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); //Act @@ -71,13 +70,14 @@ public void When_rejecting_a_message_should_delete_from_queue() //Assert - message should be deleted, not requeued message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_requeueing_a_message.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_requeueing_a_message.cs index 9d464b82fd..43e3f3f276 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_requeueing_a_message.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_requeueing_a_message.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerRequeueTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerRequeueTests : IAsyncDisposable { private readonly IAmAMessageProducerSync _sender; private Message? _requeuedMessage; @@ -61,8 +60,8 @@ public SqsMessageProducerRequeueTests() _channel = _channelFactory.CreateSyncChannel(subscription); } - [Fact] - public void When_requeueing_a_message() + [Test] + public async Task When_requeueing_a_message() { _sender.Send(_message); _receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); @@ -73,13 +72,14 @@ public void When_requeueing_a_message() //clear the queue _channel.Acknowledge(_requeuedMessage ); - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_requeueing_redrives_to_the_dlq.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_requeueing_redrives_to_the_dlq.cs index 4dd8b6ebd7..283aa14d52 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_requeueing_redrives_to_the_dlq.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_requeueing_redrives_to_the_dlq.cs @@ -10,23 +10,23 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using Amazon.SimpleNotificationService.Model; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageProducerDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageProducerDlqTests : IAsyncDisposable { - private readonly SnsMessageProducer _sender; - private readonly IAmAChannelSync _channel; - private readonly ChannelFactory _channelFactory; - private readonly Message _message; - private readonly AWSMessagingGatewayConnection _awsConnection; - private readonly string _dlqChannelName; - - public SqsMessageProducerDlqTests() + private SnsMessageProducer _sender; + private IAmAChannelSync _channel; + private ChannelFactory _channelFactory; + private Message _message; + private AWSMessagingGatewayConnection _awsConnection; + private string _dlqChannelName; + + [Before(Test)] + public async Task Setup() { MyCommand myCommand = new MyCommand { Value = "Test" }; string correlationId = Guid.NewGuid().ToString(); @@ -60,17 +60,17 @@ public SqsMessageProducerDlqTests() _sender = new SnsMessageProducer(_awsConnection, new SnsPublication { MakeChannels = OnMissingChannel.Create }); - _sender.ConfirmTopicExistsAsync(topicName).Wait(); + await _sender.ConfirmTopicExistsAsync(topicName); //We need to do this manually in a test - will create the channel from subscriber parameters _channelFactory = new ChannelFactory(_awsConnection); _channel = _channelFactory.CreateSyncChannel(subscription); } - [Fact] - public void When_requeueing_redrives_to_the_queue() + [Test] + public async Task When_requeueing_redrives_to_the_queue() { - _sender.Send(_message); + await _sender.SendAsync(_message); var receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); _channel.Requeue(receivedMessage); @@ -84,19 +84,19 @@ public void When_requeueing_redrives_to_the_queue() Task.Delay(5000); //inspect the dlq - Assert.Equal(1, GetDLQCount(_dlqChannelName)); + await Assert.That(await GetDLQCount(_dlqChannelName)).IsEqualTo(1); } - private int GetDLQCount(string queueName) + private async Task GetDLQCount(string queueName) { using var sqsClient = new AWSClientFactory(_awsConnection).CreateSqsClient(); - var queueUrlResponse = sqsClient.GetQueueUrlAsync(queueName).GetAwaiter().GetResult(); - var response = sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest + var queueUrlResponse = await sqsClient.GetQueueUrlAsync(queueName); + var response = await sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest { QueueUrl = queueUrlResponse.QueueUrl, WaitTimeSeconds = 5, MessageAttributeNames = new List { "All", "ApproximateReceiveCount" } - }).GetAwaiter().GetResult(); + }); if (response.HttpStatusCode != HttpStatusCode.OK) { @@ -107,10 +107,11 @@ private int GetDLQCount(string queueName) return response.Messages.Count; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_throwing_defer_action_respect_redrive.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_throwing_defer_action_respect_redrive.cs index cc93182c26..8aa6910a59 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_throwing_defer_action_respect_redrive.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_throwing_defer_action_respect_redrive.cs @@ -13,13 +13,12 @@ using Paramore.Brighter.MessagingGateway.AWSSQS.V4; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SnsReDrivePolicySDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SnsReDrivePolicySDlqTests : IAsyncDisposable { private readonly IAmAMessagePump _messagePump; private readonly Message _message; @@ -117,17 +116,17 @@ public SnsReDrivePolicySDlqTests() }; } - private int GetDLQCount(string queueName) + private async Task GetDLQCount(string queueName) { - using var sqsClient = new AWSClientFactory(_awsConnection).CreateSqsClient(); - var queueUrlResponse = sqsClient.GetQueueUrlAsync(queueName).GetAwaiter().GetResult(); - var response = sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest + using var sqsClient = new AWSClientFactory(_awsConnection).CreateSqsClient(); + var queueUrlResponse = await sqsClient.GetQueueUrlAsync(queueName); + var response = await sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest { QueueUrl = queueUrlResponse.QueueUrl, WaitTimeSeconds = 5, MessageSystemAttributeNames = ["ApproximateReceiveCount"], MessageAttributeNames = new List { "All" } - }).GetAwaiter().GetResult(); + }); if (response.HttpStatusCode != HttpStatusCode.OK) { @@ -139,11 +138,11 @@ private int GetDLQCount(string queueName) } - [Fact] + [Test] public async Task When_throwing_defer_action_respect_redrive() { //put something on an SNS topic, which will be delivered to our SQS queue - _sender.Send(_message); + await _sender.SendAsync(_message); //start a message pump, let it process messages var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); @@ -159,13 +158,14 @@ public async Task When_throwing_defer_action_respect_redrive() await Task.Delay(5000); //inspect the dlq - Assert.Equal(1, GetDLQCount(_dlqChannelName)); + await Assert.That(await GetDLQCount(_dlqChannelName)).IsEqualTo(1); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_topic_missing_verify_throws.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_topic_missing_verify_throws.cs index c335ee196f..59da641e24 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_topic_missing_verify_throws.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sns/Standard/Reactor/When_topic_missing_verify_throws.cs @@ -1,11 +1,10 @@ -using System; +using System; using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sns.Standard.Reactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AwsValidateMissingTopicTests { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -21,8 +20,8 @@ public AwsValidateMissingTopicTests() //Because we don't use channel factory to create the infrastructure -it won't exist } - [Fact] - public void When_topic_missing_verify_throws() + [Test] + public async Task When_topic_missing_verify_throws() { //arrange var producer = new SnsMessageProducer(_awsConnection, @@ -32,8 +31,11 @@ public void When_topic_missing_verify_throws() }); //act && assert - Assert.Throws(() => producer.Send(new Message( - new MessageHeader("", _routingKey, MessageType.MT_EVENT, type: new CloudEventsType("plain/text")), - new MessageBody("Test")))); + Assert.ThrowsExactly(() => + { + producer.Send(new Message( + new MessageHeader("", _routingKey, MessageType.MT_EVENT, type: new CloudEventsType("plain/text")), + new MessageBody("Test"))); + }); } } diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs index a3577234eb..c12d1588f7 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs @@ -6,23 +6,23 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsBufferedConsumerTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsBufferedConsumerTestsAsync : IAsyncDisposable { - private readonly SqsMessageProducer _messageProducer; - private readonly SqsMessageConsumer _consumer; - private readonly string _queueName; - private readonly ChannelFactory _channelFactory; + private SqsMessageProducer _messageProducer; + private SqsMessageConsumer _consumer; + private string _queueName; + private ChannelFactory _channelFactory; private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; private const int MessageCount = 4; - public SqsBufferedConsumerTestsAsync() + [Before(Test)] + public async Task Setup() { var awsConnection = GatewayFactory.CreateFactory(); @@ -39,7 +39,7 @@ public SqsBufferedConsumerTestsAsync() fifoThroughputLimit: FifoThroughputLimit.PerMessageGroupId, tags: new Dictionary { { "Environment", "Test" } }); - var channel = _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( + var channel = await _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( subscriptionName: new SubscriptionName(_queueName), channelName: channelName, channelType: ChannelType.PointToPoint, @@ -47,8 +47,7 @@ public SqsBufferedConsumerTestsAsync() bufferSize: BufferSize, queueAttributes: queueAttributes, messagePumpType: MessagePumpType.Proactor, - makeChannels: OnMissingChannel.Create)) - .GetAwaiter().GetResult(); + makeChannels: OnMissingChannel.Create)); //we want to access via a consumer, to receive multiple messages - we don't want to expose on channel //just for the tests, so create a new consumer from the properties @@ -58,7 +57,7 @@ public SqsBufferedConsumerTestsAsync() new SqsPublication(channelName: channelName, queueAttributes: queueAttributes, makeChannels: OnMissingChannel.Create)); } - [Fact] + [Test] public async Task When_a_message_consumer_reads_multiple_messages_async() { var routingKey = new RoutingKey(_queueName); @@ -120,10 +119,10 @@ public async Task When_a_message_consumer_reads_multiple_messages_async() //retrieve messages var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.True(messages.Length <= outstandingMessageCount); + await Assert.That(messages.Length <= outstandingMessageCount).IsTrue(); //should not receive more than buffer in one hit - Assert.True(messages.Length <= BufferSize); + await Assert.That(messages.Length <= BufferSize).IsTrue(); var moreMessages = messages.Where(m => m.Header.MessageType == MessageType.MT_COMMAND); foreach (var message in moreMessages) @@ -137,7 +136,7 @@ public async Task When_a_message_consumer_reads_multiple_messages_async() await Task.Delay(1000); } while ((iteration <= 5) && (messagesReceivedCount < MessageCount)); - Assert.Equal(4, messagesReceivedCount); + await Assert.That(messagesReceivedCount).IsEqualTo(4); } public async ValueTask DisposeAsync() @@ -147,10 +146,11 @@ public async ValueTask DisposeAsync() await _messageProducer.DisposeAsync(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().GetAwaiter().GetResult(); - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _messageProducer.DisposeAsync().GetAwaiter().GetResult(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } } diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infastructure_exists_can_assume_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infastructure_exists_can_assume_async.cs index c3ec9d90c9..b9912eac2c 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infastructure_exists_can_assume_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infastructure_exists_can_assume_async.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AwsAssumeInfrastructureTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AwsAssumeInfrastructureTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly SqsMessageConsumer _consumer; @@ -71,7 +70,7 @@ public AwsAssumeInfrastructureTestsAsync() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName(true)); } - [Fact] + [Test] public async Task When_infastructure_exists_can_assume() { //arrange @@ -81,17 +80,18 @@ public async Task When_infastructure_exists_can_assume() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infrastructure_exists_can_verify_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infrastructure_exists_can_verify_async.cs index 558ec33d1a..02b692bbba 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infrastructure_exists_can_verify_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infrastructure_exists_can_verify_async.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AwsValidateInfrastructureTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AwsValidateInfrastructureTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerAsync _consumer; @@ -67,7 +66,7 @@ public AwsValidateInfrastructureTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify_async() { await _messageProducer.SendAsync(_message); @@ -77,18 +76,19 @@ public async Task When_infrastructure_exists_can_verify_async() var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); ((IAmAMessageConsumerSync)_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infrastructure_exists_can_verify_by_url_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infrastructure_exists_can_verify_by_url_async.cs index f2f07493f0..d9c5402a1f 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infrastructure_exists_can_verify_by_url_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_infrastructure_exists_can_verify_by_url_async.cs @@ -7,22 +7,22 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AwsValidateInfrastructureByUrlTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AwsValidateInfrastructureByUrlTestsAsync : IAsyncDisposable { - private readonly Message _message; - private readonly IAmAMessageConsumerAsync _consumer; - private readonly SqsMessageProducer _messageProducer; - private readonly ChannelFactory _channelFactory; - private readonly MyCommand _myCommand; - - public AwsValidateInfrastructureByUrlTestsAsync() + private Message _message; + private IAmAMessageConsumerAsync _consumer; + private SqsMessageProducer _messageProducer; + private ChannelFactory _channelFactory; + private MyCommand _myCommand; + + [Before(Test)] + public async Task Setup() { _myCommand = new MyCommand { Value = "Test" }; const string replyTo = "http:\\queueUrl"; @@ -53,9 +53,9 @@ public AwsValidateInfrastructureByUrlTestsAsync() var awsConnection = GatewayFactory.CreateFactory(); _channelFactory = new ChannelFactory(awsConnection); - var channel = _channelFactory.CreateAsyncChannel(subscription); + var channel = await _channelFactory.CreateAsyncChannelAsync(subscription); - var queueUrl = FindQueueUrl(awsConnection, routingKey.ToValidSQSQueueName(true)).Result; + var queueUrl = await FindQueueUrl(awsConnection, routingKey.ToValidSQSQueueName(true)); subscription.MakeChannels = OnMissingChannel.Validate; @@ -72,7 +72,7 @@ public AwsValidateInfrastructureByUrlTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify_async() { await _messageProducer.SendAsync(_message); @@ -82,7 +82,7 @@ public async Task When_infrastructure_exists_can_verify_async() var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); await _consumer.AcknowledgeAsync(message); } @@ -94,13 +94,14 @@ private static async Task FindQueueUrl(AWSMessagingGatewayConnection con return topicResponse.QueueUrl; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); ((IAmAMessageConsumerSync)_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs index 71d103c919..67c5127f91 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerSendAsyncTests : IAsyncDisposable, IDisposable +[Category("AWS")] +public class SqsMessageProducerSendAsyncTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -72,7 +71,7 @@ public SqsMessageProducerSendAsyncTests() new SqsPublication(channelName: channelName, queueAttributes: queueAttributes, makeChannels: OnMissingChannel.Create)); } - [Fact] + [Test] public async Task When_posting_a_message_via_the_producer_async() { // arrange @@ -87,34 +86,35 @@ public async Task When_posting_a_message_via_the_producer_async() await _channel.AcknowledgeAsync(message); // should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_queueName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_queueName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); // allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); // {"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); - Assert.Equal(_messageGroupId, message.Header.PartitionKey); - Assert.Contains(HeaderNames.DeduplicationId, message.Header.Bag); - Assert.Equal(_deduplicationId, message.Header.Bag[HeaderNames.DeduplicationId]); + await Assert.That(message.Header.PartitionKey).IsEqualTo(_messageGroupId); + await Assert.That(message.Header.Bag).ContainsKey(HeaderNames.DeduplicationId); + await Assert.That(message.Header.Bag[HeaderNames.DeduplicationId]).IsEqualTo(_deduplicationId); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_queues_missing_assume_throws_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_queues_missing_assume_throws_async.cs index 05edc30b8b..0475b08335 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_queues_missing_assume_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_queues_missing_assume_throws_async.cs @@ -4,13 +4,12 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -public class AwsAssumeQueuesTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +public class AwsAssumeQueuesTestsAsync : IAsyncDisposable { private readonly ChannelFactory _channelFactory; private readonly IAmAMessageConsumerAsync _consumer; @@ -39,7 +38,7 @@ public AwsAssumeQueuesTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_queues_missing_assume_throws_async() { //we will try to get the queue url, and fail because it does not exist @@ -47,9 +46,10 @@ await Assert.ThrowsAsync(async () => await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_queues_missing_verify_throws_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_queues_missing_verify_throws_async.cs index 896f659942..1fe06434a2 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_queues_missing_verify_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_queues_missing_verify_throws_async.cs @@ -4,12 +4,11 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AwsValidateQueuesTestsAsync : IAsyncDisposable { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -34,7 +33,7 @@ public AwsValidateQueuesTestsAsync() _awsConnection = GatewayFactory.CreateFactory(); } - [Fact] + [Test] public async Task When_queues_missing_verify_throws_async() { // We have no queues so we should throw diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_raw_message_delivery_disabled_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_raw_message_delivery_disabled_async.cs index 63c0746405..2241093fc2 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_raw_message_delivery_disabled_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_raw_message_delivery_disabled_async.cs @@ -5,13 +5,12 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsRawMessageDeliveryTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsRawMessageDeliveryTestsAsync : IAsyncDisposable { private readonly SqsMessageProducer _messageProducer; private readonly ChannelFactory _channelFactory; @@ -55,7 +54,7 @@ public SqsRawMessageDeliveryTestsAsync() ); } - [Fact] + [Test] public async Task When_raw_message_delivery_disabled_async() { // Arrange @@ -83,24 +82,25 @@ public async Task When_raw_message_delivery_disabled_async() await _channel.AcknowledgeAsync(messageReceived); // Assert - Assert.Equal(messageToSend.Id, messageReceived.Id); - Assert.Equal(messageToSend.Header.Topic.ToValidSNSTopicName(true), messageReceived.Header.Topic); - Assert.Equal(messageToSend.Header.MessageType, messageReceived.Header.MessageType); - Assert.Equal(messageToSend.Header.CorrelationId, messageReceived.Header.CorrelationId); - Assert.Equal(messageToSend.Header.ReplyTo, messageReceived.Header.ReplyTo); - Assert.StartsWith(messageToSend.Header.ContentType?.ToString(), messageReceived.Header.ContentType?.ToString()); - Assert.Contains(customHeaderItem.Key, messageReceived.Header.Bag); - Assert.Equal(customHeaderItem.Value, messageReceived.Header.Bag[customHeaderItem.Key]); - Assert.Equal(messageToSend.Body.Value, messageReceived.Body.Value); - Assert.Equal(messageGroupId, messageReceived.Header.PartitionKey); - Assert.Contains(HeaderNames.DeduplicationId, messageReceived.Header.Bag); - Assert.Equal(deduplicationId, messageReceived.Header.Bag[HeaderNames.DeduplicationId]); + await Assert.That(messageReceived.Id).IsEqualTo(messageToSend.Id); + await Assert.That(messageReceived.Header.Topic).IsEqualTo(messageToSend.Header.Topic.ToValidSNSTopicName(true)); + await Assert.That(messageReceived.Header.MessageType).IsEqualTo(messageToSend.Header.MessageType); + await Assert.That(messageReceived.Header.CorrelationId).IsEqualTo(messageToSend.Header.CorrelationId); + await Assert.That(messageReceived.Header.ReplyTo).IsEqualTo(messageToSend.Header.ReplyTo); + await Assert.That(messageReceived.Header.ContentType?.ToString()).StartsWith(messageToSend.Header.ContentType?.ToString()); + await Assert.That(messageReceived.Header.Bag).ContainsKey(customHeaderItem.Key); + await Assert.That(messageReceived.Header.Bag[customHeaderItem.Key]).IsEqualTo(customHeaderItem.Value); + await Assert.That(messageReceived.Body.Value).IsEqualTo(messageToSend.Body.Value); + await Assert.That(messageReceived.Header.PartitionKey).IsEqualTo(messageGroupId); + await Assert.That(messageReceived.Header.Bag).ContainsKey(HeaderNames.DeduplicationId); + await Assert.That(messageReceived.Header.Bag[HeaderNames.DeduplicationId]).IsEqualTo(deduplicationId); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs index 496737f7d9..e88e2cfad3 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerRejectTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerRejectTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -63,7 +62,7 @@ public SqsMessageConsumerRejectTestsAsync() ); } - [Fact] + [Test] public async Task When_rejecting_a_message_should_delete_from_queue_async() { //Arrange @@ -76,13 +75,14 @@ public async Task When_rejecting_a_message_should_delete_from_queue_async() //Assert - message should be deleted, not requeued message = await _channel.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq_async.cs index 58c030984a..3e0d471917 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq_async.cs @@ -30,13 +30,12 @@ THE SOFTWARE. */ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerFifoDeliveryErrorDlqTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerFifoDeliveryErrorDlqTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -107,7 +106,7 @@ public SqsMessageConsumerFifoDeliveryErrorDlqTestsAsync() _dlqChannel = _dlqChannelFactory.CreateAsyncChannel(dlqSubscription); } - [Fact] + [Test] public async Task When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq_async() { //Arrange @@ -121,32 +120,33 @@ public async Task When_rejecting_fifo_message_with_delivery_error_should_send_to //Assert - message should appear on DLQ var dlqMessage = await _dlqChannel.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); //verify FIFO attributes are preserved on DLQ message - Assert.Equal(_messageGroupId, dlqMessage.Header.PartitionKey); + await Assert.That(dlqMessage.Header.PartitionKey).IsEqualTo(_messageGroupId); //verify rejection metadata was added - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(originalTopic, dlqMessage.Header.Bag["originalTopic"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.DeliveryError.ToString(), dlqMessage.Header.Bag["rejectionReason"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal(MessageType.MT_COMMAND.ToString(), dlqMessage.Header.Bag["originalMessageType"].ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalTopic"].ToString()).IsEqualTo(originalTopic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.DeliveryError.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalMessageType"].ToString()).IsEqualTo(MessageType.MT_COMMAND.ToString()); //verify original message is deleted from source queue var sourceMessage = await _channel.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, sourceMessage.Header.MessageType); + await Assert.That(sourceMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _dlqChannelFactory.DeleteTopicAsync().Wait(); - _dlqChannelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _dlqChannelFactory.DeleteTopicAsync(); + await _dlqChannelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_requeueing_a_message_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_requeueing_a_message_async.cs index 937eabbf68..730061c46e 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_requeueing_a_message_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_requeueing_a_message_async.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerRequeueTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerRequeueTestsAsync : IAsyncDisposable { private readonly IAmAMessageProducerAsync _sender; private Message? _requeuedMessage; @@ -61,7 +60,7 @@ public SqsMessageProducerRequeueTestsAsync() _channel = _channelFactory.CreateAsyncChannel(subscription); } - [Fact] + [Test] public async Task When_requeueing_a_message_async() { await _sender.SendAsync(_message); @@ -72,13 +71,14 @@ public async Task When_requeueing_a_message_async() await _channel.AcknowledgeAsync(_requeuedMessage); - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_requeueing_redrives_to_the_dlq_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_requeueing_redrives_to_the_dlq_async.cs index f77e7f86bb..fd216a327a 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_requeueing_redrives_to_the_dlq_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_requeueing_redrives_to_the_dlq_async.cs @@ -9,14 +9,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageProducerDlqTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageProducerDlqTestsAsync : IAsyncDisposable { private readonly SqsMessageProducer _sender; private readonly IAmAChannelAsync _channel; @@ -69,7 +68,7 @@ public SqsMessageProducerDlqTestsAsync() _channel = _channelFactory.CreateAsyncChannel(subscription); } - [Fact] + [Test] public async Task When_requeueing_redrives_to_the_queue_async() { await _sender.SendAsync(_message); @@ -85,7 +84,7 @@ public async Task When_requeueing_redrives_to_the_queue_async() await Task.Delay(5000); int dlqCount = await GetDLQCountAsync(_dlqChannelName.ToValidSQSQueueName(true)); - Assert.Equal(1, dlqCount); + await Assert.That(dlqCount).IsEqualTo(1); } private async Task GetDLQCountAsync(string queueName) @@ -108,10 +107,11 @@ private async Task GetDLQCountAsync(string queueName) return response.Messages.Count; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_throwing_defer_action_respect_redrive_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_throwing_defer_action_respect_redrive_async.cs index a7a379bb3c..97e896e0cc 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_throwing_defer_action_respect_redrive_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_throwing_defer_action_respect_redrive_async.cs @@ -12,13 +12,12 @@ using Paramore.Brighter.MessagingGateway.AWSSQS.V4; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SnsReDrivePolicySDlqTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SnsReDrivePolicySDlqTestsAsync : IAsyncDisposable { private readonly IAmAMessagePump _messagePump; private readonly Message _message; @@ -127,7 +126,7 @@ public async Task GetDLQCountAsync(string queueName) return response.Messages.Count; } - [Fact(Skip = "This test is skipped because running tests of the DLQ is unreliable in the CI environment")] + [Test, Skip("This test is skipped because running tests of the DLQ is unreliable in the CI environment")] public async Task When_throwing_defer_action_respect_redrive_async() { await _sender.SendAsync(_message); @@ -143,13 +142,14 @@ public async Task When_throwing_defer_action_respect_redrive_async() await Task.Delay(5000); var dlqCount = await GetDLQCountAsync(_dlqChannelName + ".fifo"); - Assert.Equal(1, dlqCount); + await Assert.That(dlqCount).IsEqualTo(1); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_topic_missing_verify_throws_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_topic_missing_verify_throws_async.cs index af8f1bc651..d3601c4fef 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_topic_missing_verify_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Proactor/When_topic_missing_verify_throws_async.cs @@ -3,12 +3,11 @@ using Amazon.SQS.Model; using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Proactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AwsValidateMissingTopicTestsAsync { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -25,7 +24,7 @@ public AwsValidateMissingTopicTestsAsync() // Because we don't use channel factory to create the infrastructure - it won't exist } - [Fact] + [Test] public async Task When_queue_missing_verify_throws_async() { // arrange diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_a_message_consumer_reads_multiple_messages.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_a_message_consumer_reads_multiple_messages.cs index a2b2d75e7a..132010be46 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_a_message_consumer_reads_multiple_messages.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_a_message_consumer_reads_multiple_messages.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsBufferedConsumerTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsBufferedConsumerTests : IAsyncDisposable { private readonly SqsMessageProducer _messageProducer; private readonly SqsMessageConsumer _consumer; @@ -62,7 +61,7 @@ public SqsBufferedConsumerTests() )); } - [Fact] + [Test] public async Task When_a_message_consumer_reads_multiple_messages() { var routingKey = new RoutingKey(_queueName); @@ -109,11 +108,11 @@ public async Task When_a_message_consumer_reads_multiple_messages() ); //send MESSAGE_COUNT messages - _messageProducer.Send(messageOne); - _messageProducer.Send(messageTwo); - _messageProducer.Send(messageThree); - _messageProducer.Send(messageFour); - _messageProducer.Send(messageFive); + await _messageProducer.SendAsync(messageOne); + await _messageProducer.SendAsync(messageTwo); + await _messageProducer.SendAsync(messageThree); + await _messageProducer.SendAsync(messageFour); + await _messageProducer.SendAsync(messageFive); int iteration = 0; @@ -125,18 +124,18 @@ public async Task When_a_message_consumer_reads_multiple_messages() var outstandingMessageCount = MessageCount - messagesReceivedCount; //retrieve messages - var messages = _consumer.Receive(TimeSpan.FromMilliseconds(10000)); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.True(messages.Length <= outstandingMessageCount); + await Assert.That(messages.Length <= outstandingMessageCount).IsTrue(); //should not receive more than buffer in one hit - Assert.True(messages.Length <= BufferSize); + await Assert.That(messages.Length <= BufferSize).IsTrue(); var moreMessages = messages.Where(m => m.Header.MessageType == MessageType.MT_COMMAND); foreach (var message in moreMessages) { messagesReceived.Add(message); - _consumer.Acknowledge(message); + await _consumer.AcknowledgeAsync(message); } messagesReceivedCount = messagesReceived.Count; @@ -145,15 +144,16 @@ public async Task When_a_message_consumer_reads_multiple_messages() } while ((iteration <= 5) && (messagesReceivedCount < MessageCount)); - Assert.Equal(4, messagesReceivedCount); + await Assert.That(messagesReceivedCount).IsEqualTo(4); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_assume.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_assume.cs index fba6083b07..1f1d2c0dc2 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_assume.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_assume.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AwsAssumeInfrastructureTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AwsAssumeInfrastructureTests : IAsyncDisposable { private readonly Message _message; private readonly SqsMessageConsumer _consumer; @@ -69,27 +68,28 @@ public AwsAssumeInfrastructureTests() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName(true)); } - [Fact] - public void When_infastructure_exists_can_assume() + [Test] + public async Task When_infastructure_exists_can_assume() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); - var messages = _consumer.Receive(TimeSpan.FromMilliseconds(5000)); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue - _consumer.Acknowledge(message); + await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_verify.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_verify.cs index c4fceef03e..850f32735e 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_verify.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_verify.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AwsValidateInfrastructureTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AwsValidateInfrastructureTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerSync _consumer; @@ -74,11 +73,11 @@ public AwsValidateInfrastructureTests() _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -86,19 +85,20 @@ public async Task When_infrastructure_exists_can_verify() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue _consumer.Acknowledge(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); _consumer.Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_verify_by_url.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_verify_by_url.cs index ffd875ec4c..4432bd9901 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_verify_by_url.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_infastructure_exists_can_verify_by_url.cs @@ -7,22 +7,22 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AwsValidateInfrastructureByUrlTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AwsValidateInfrastructureByUrlTests : IAsyncDisposable { - private readonly Message _message; - private readonly IAmAMessageConsumerSync _consumer; - private readonly SqsMessageProducer _messageProducer; - private readonly ChannelFactory _channelFactory; - private readonly MyCommand _myCommand; - - public AwsValidateInfrastructureByUrlTests () + private Message _message; + private IAmAMessageConsumerSync _consumer; + private SqsMessageProducer _messageProducer; + private ChannelFactory _channelFactory; + private MyCommand _myCommand; + + [Before(Test)] + public async Task Setup() { var replyTo = new RoutingKey("http:\\queueUrl"); var contentType = new ContentType(MediaTypeNames.Text.Plain); @@ -62,7 +62,7 @@ public AwsValidateInfrastructureByUrlTests () _channelFactory = new ChannelFactory(awsConnection); var channel = _channelFactory.CreateSyncChannel(subscription); - var queueUrl = FindQueueUrl(awsConnection, routingKey.ToValidSQSQueueName(true)); + var queueUrl = await FindQueueUrl(awsConnection, routingKey.ToValidSQSQueueName(true)); //Now change the subscription to validate, just check what we made subscription.MakeChannels = OnMissingChannel.Validate; @@ -81,11 +81,11 @@ public AwsValidateInfrastructureByUrlTests () _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -93,19 +93,20 @@ public async Task When_infrastructure_exists_can_verify() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue _consumer.Acknowledge(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); _consumer.Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() @@ -116,10 +117,10 @@ public async ValueTask DisposeAsync() await _messageProducer.DisposeAsync(); } - private static string FindQueueUrl(AWSMessagingGatewayConnection connection, string queueName) + private static async Task FindQueueUrl(AWSMessagingGatewayConnection connection, string queueName) { - using var snsClient = new AWSClientFactory(connection).CreateSqsClient(); - var topicResponse = snsClient.GetQueueUrlAsync(queueName).GetAwaiter().GetResult(); + using var snsClient = new AWSClientFactory(connection).CreateSqsClient(); + var topicResponse = await snsClient.GetQueueUrlAsync(queueName); return topicResponse.QueueUrl; } } diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_posting_a_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_posting_a_message_via_the_messaging_gateway.cs index f9469c5737..9914759500 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_posting_a_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_posting_a_message_via_the_messaging_gateway.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerSendAsyncTests : IAsyncDisposable, IDisposable +[Category("AWS")] +public class SqsMessageProducerSendAsyncTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -71,14 +70,14 @@ public SqsMessageProducerSendAsyncTests() ); } - [Fact] - public void When_posting_a_message_via_the_producer() + [Test] + public async Task When_posting_a_message_via_the_producer() { // arrange _message.Header.Subject = "test subject"; - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); - Task.Delay(1000).GetAwaiter().GetResult(); + await Task.Delay(1000); var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); @@ -86,34 +85,35 @@ public void When_posting_a_message_via_the_producer() _channel.Acknowledge(message); // should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_queueName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_queueName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); // allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); // {"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); - Assert.Equal(_messageGroupId, message.Header.PartitionKey); - Assert.Contains(HeaderNames.DeduplicationId, message.Header.Bag); - Assert.Equal(_deduplicationId, message.Header.Bag[HeaderNames.DeduplicationId]); + await Assert.That(message.Header.PartitionKey).IsEqualTo(_messageGroupId); + await Assert.That(message.Header.Bag).ContainsKey(HeaderNames.DeduplicationId); + await Assert.That(message.Header.Bag[HeaderNames.DeduplicationId]).IsEqualTo(_deduplicationId); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_queues_missing_assume_throws.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_queues_missing_assume_throws.cs index 167f3d222e..9d41074cdc 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_queues_missing_assume_throws.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_queues_missing_assume_throws.cs @@ -4,13 +4,12 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -public class AWSAssumeQueuesTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AWSAssumeQueuesTests : IAsyncDisposable { private readonly ChannelFactory _channelFactory; private readonly SqsMessageConsumer _consumer; @@ -40,16 +39,17 @@ public AWSAssumeQueuesTests() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName()); } - [Fact] - public void When_queues_missing_assume_throws() + [Test] + public async Task When_queues_missing_assume_throws() { //we will try to get the queue url, and fail because it does not exist - Assert.Throws(() => _consumer.Receive(TimeSpan.FromMilliseconds(1000))); + await Assert.That(() => _consumer.Receive(TimeSpan.FromMilliseconds(1000))).ThrowsExactly(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_queues_missing_verify_throws.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_queues_missing_verify_throws.cs index 237ddb3c49..75c24a0f85 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_queues_missing_verify_throws.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_queues_missing_verify_throws.cs @@ -4,12 +4,11 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AWSValidateQueuesTests : IAsyncDisposable { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -37,13 +36,13 @@ public AWSValidateQueuesTests() _awsConnection = GatewayFactory.CreateFactory(); } - [Fact] - public void When_queues_missing_verify_throws() + [Test] + public async Task When_queues_missing_verify_throws() { // We have no queues so we should throw // We need to do this manually in a test - will create the channel from subscriber parameters _channelFactory = new ChannelFactory(_awsConnection); - Assert.Throws(() => _channelFactory.CreateAsyncChannel(_subscription)); + await Assert.That(() => _channelFactory.CreateAsyncChannel(_subscription)).ThrowsExactly(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_rejecting_a_message_should_delete_from_queue.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_rejecting_a_message_should_delete_from_queue.cs index f94ad7ffc4..6cbfa68dae 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_rejecting_a_message_should_delete_from_queue.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_rejecting_a_message_should_delete_from_queue.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerRejectTests : IDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerRejectTests { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -59,11 +58,11 @@ public SqsMessageConsumerRejectTests() ); } - [Fact] - public void When_rejecting_a_message_should_delete_from_queue() + [Test] + public async Task When_rejecting_a_message_should_delete_from_queue() { //Arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); //Act @@ -72,13 +71,14 @@ public void When_rejecting_a_message_should_delete_from_queue() //Assert - message should be deleted, not requeued message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq.cs index 9eeabd9fda..d7fa3cbf69 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq.cs @@ -30,13 +30,12 @@ THE SOFTWARE. */ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerFifoDeliveryErrorDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerFifoDeliveryErrorDlqTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -107,11 +106,11 @@ public SqsMessageConsumerFifoDeliveryErrorDlqTests() _dlqChannel = _dlqChannelFactory.CreateSyncChannel(dlqSubscription); } - [Fact] - public void When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq() + [Test] + public async Task When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq() { //Arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); //Act @@ -121,32 +120,33 @@ public void When_rejecting_fifo_message_with_delivery_error_should_send_to_dlq() //Assert - message should appear on DLQ var dlqMessage = _dlqChannel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); //verify FIFO attributes are preserved on DLQ message - Assert.Equal(_messageGroupId, dlqMessage.Header.PartitionKey); + await Assert.That(dlqMessage.Header.PartitionKey).IsEqualTo(_messageGroupId); //verify rejection metadata was added - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(originalTopic, dlqMessage.Header.Bag["originalTopic"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.DeliveryError.ToString(), dlqMessage.Header.Bag["rejectionReason"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal(MessageType.MT_COMMAND.ToString(), dlqMessage.Header.Bag["originalMessageType"].ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalTopic"].ToString()).IsEqualTo(originalTopic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.DeliveryError.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalMessageType"].ToString()).IsEqualTo(MessageType.MT_COMMAND.ToString()); //verify original message is deleted from source queue var sourceMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, sourceMessage.Header.MessageType); + await Assert.That(sourceMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _dlqChannelFactory.DeleteTopicAsync().Wait(); - _dlqChannelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _dlqChannelFactory.DeleteTopicAsync(); + await _dlqChannelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_requeueing_a_message.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_requeueing_a_message.cs index 12db4ac318..75501a086d 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_requeueing_a_message.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_requeueing_a_message.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerRequeueTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerRequeueTests : IAsyncDisposable { private readonly IAmAMessageProducerSync _sender; private Message _requeuedMessage; @@ -63,8 +62,8 @@ public SqsMessageProducerRequeueTests() _channel = _channelFactory.CreateSyncChannel(subscription); } - [Fact] - public void When_requeueing_a_message() + [Test] + public async Task When_requeueing_a_message() { _sender.Send(_message); _receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); @@ -74,13 +73,14 @@ public void When_requeueing_a_message() _channel.Acknowledge(_requeuedMessage); - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_requeueing_redrives_to_the_dlq.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_requeueing_redrives_to_the_dlq.cs index 2a510c80b8..559cc1f047 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_requeueing_redrives_to_the_dlq.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_requeueing_redrives_to_the_dlq.cs @@ -9,14 +9,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageProducerDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageProducerDlqTests : IAsyncDisposable { private readonly SqsMessageProducer _sender; private readonly IAmAChannelSync _channel; @@ -71,10 +70,10 @@ public SqsMessageProducerDlqTests() _channel = _channelFactory.CreateSyncChannel(subscription); } - [Fact] - public void When_requeueing_redrives_to_the_queue() + [Test] + public async Task When_requeueing_redrives_to_the_queue() { - _sender.Send(_message); + await _sender.SendAsync(_message); var receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); _channel.Requeue(receivedMessage); @@ -88,19 +87,19 @@ public void When_requeueing_redrives_to_the_queue() Task.Delay(5000); //inspect the dlq - Assert.Equal(1, GetDLQCount(_dlqChannelName + ".fifo")); + await Assert.That(await GetDLQCount(_dlqChannelName + ".fifo")).IsEqualTo(1); } - private int GetDLQCount(string queueName) + private async Task GetDLQCount(string queueName) { using var sqsClient = new AWSClientFactory(_awsConnection).CreateSqsClient(); - var queueUrlResponse = sqsClient.GetQueueUrlAsync(queueName).GetAwaiter().GetResult(); - var response = sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest + var queueUrlResponse = await sqsClient.GetQueueUrlAsync(queueName); + var response = await sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest { QueueUrl = queueUrlResponse.QueueUrl, WaitTimeSeconds = 5, MessageAttributeNames = ["All", "ApproximateReceiveCount"] - }).GetAwaiter().GetResult(); + }); if (response.HttpStatusCode != HttpStatusCode.OK) { @@ -111,10 +110,11 @@ private int GetDLQCount(string queueName) return response.Messages.Count; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_throwing_defer_action_respect_redrive.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_throwing_defer_action_respect_redrive.cs index 6bdd628b13..6bbf08e675 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_throwing_defer_action_respect_redrive.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_throwing_defer_action_respect_redrive.cs @@ -12,13 +12,12 @@ using Paramore.Brighter.MessagingGateway.AWSSQS.V4; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SnsReDrivePolicySDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SnsReDrivePolicySDlqTests : IAsyncDisposable { private readonly IAmAMessagePump _messagePump; private readonly Message _message; @@ -105,17 +104,17 @@ public SnsReDrivePolicySDlqTests() }; } - public int GetDLQCountAsync(string queueName) + public async Task GetDLQCountAsync(string queueName) { using var sqsClient = new AWSClientFactory(_awsConnection).CreateSqsClient(); - var queueUrlResponse = sqsClient.GetQueueUrlAsync(queueName.ToValidSQSQueueName(true)).GetAwaiter().GetResult(); - var response = sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest + var queueUrlResponse = await sqsClient.GetQueueUrlAsync(queueName.ToValidSQSQueueName(true)); + var response = await sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest { QueueUrl = queueUrlResponse.QueueUrl, WaitTimeSeconds = 5, MessageSystemAttributeNames = ["ApproximateReceiveCount"], MessageAttributeNames = new List { "All" } - }).GetAwaiter().GetResult(); + }); if (response.HttpStatusCode != HttpStatusCode.OK) { @@ -126,29 +125,30 @@ public int GetDLQCountAsync(string queueName) return response.Messages.Count; } - [Fact(Skip = "This test is skipped because running tests of the DLQ is unreliable in the CI environment")] - public void When_throwing_defer_action_respect_redrive_async() + [Test, Skip("This test is skipped because running tests of the DLQ is unreliable in the CI environment")] + public async Task When_throwing_defer_action_respect_redrive_async() { - _sender.Send(_message); + await _sender.SendAsync(_message); var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); - Task.Delay(5000).GetAwaiter().GetResult(); + await Task.Delay(5000); var quitMessage = MessageFactory.CreateQuitMessage(_subscription.RoutingKey); _channel.Enqueue(quitMessage); - Task.WaitAll(task); + await task; - Task.Delay(5000).GetAwaiter().GetResult(); + await Task.Delay(5000); - var dlqCount = GetDLQCountAsync(_dlqChannelName); - Assert.Equal(1, dlqCount); + var dlqCount = await GetDLQCountAsync(_dlqChannelName); + await Assert.That(dlqCount).IsEqualTo(1); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_topic_missing_verify_throws.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_topic_missing_verify_throws.cs index 22e4bcf28e..7aa40eafc2 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_topic_missing_verify_throws.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Fifo/Reactor/When_topic_missing_verify_throws.cs @@ -1,13 +1,12 @@ -using System; +using System; using System.Collections.Generic; using Amazon.SQS.Model; using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Fifo.Reactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AWSValidateMissingTopicTests { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -23,8 +22,8 @@ public AWSValidateMissingTopicTests() // Because we don't use channel factory to create the infrastructure - it won't exist } - [Fact] - public void When_channel_missing_verify_throws() + [Test] + public async Task When_channel_missing_verify_throws() { // arrange var producer = new SqsMessageProducer( @@ -39,10 +38,12 @@ public void When_channel_missing_verify_throws() var messageGroupId = $"MessageGroup{Guid.NewGuid():N}"; // act & assert - Assert.Throws(() => + Assert.ThrowsExactly(() => + { producer.Send(new Message( new MessageHeader("", _routingKey, MessageType.MT_EVENT, type: new CloudEventsType("plain/text"), partitionKey: messageGroupId), - new MessageBody("Test")))); + new MessageBody("Test"))); + }); } } diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs index 2e2112592c..bb60cd46bc 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs @@ -6,23 +6,23 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SQSBufferedConsumerTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SQSBufferedConsumerTestsAsync : IAsyncDisposable { - private readonly SqsMessageProducer _messageProducer; - private readonly SqsMessageConsumer _consumer; - private readonly string _queueName; - private readonly ChannelFactory _channelFactory; + private SqsMessageProducer _messageProducer; + private SqsMessageConsumer _consumer; + private string _queueName; + private ChannelFactory _channelFactory; private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; private const int MessageCount = 4; - public SQSBufferedConsumerTestsAsync() + [Before(Test)] + public async Task Setup() { var awsConnection = GatewayFactory.CreateFactory(); @@ -34,15 +34,14 @@ public SQSBufferedConsumerTestsAsync() var routingKey = new RoutingKey(_queueName); var channelName = new ChannelName(_queueName); - var channel = _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( + var channel = await _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( subscriptionName: new SubscriptionName(subscriptionName), channelName: channelName, - channelType: ChannelType.PointToPoint, - routingKey: routingKey, - bufferSize: BufferSize, + channelType: ChannelType.PointToPoint, + routingKey: routingKey, + bufferSize: BufferSize, makeChannels: OnMissingChannel.Create, - queueAttributes: new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }))) - .GetAwaiter().GetResult(); + queueAttributes: new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }))); //we want to access via a consumer, to receive multiple messages - we don't want to expose on channel //just for the tests, so create a new consumer from the properties @@ -53,9 +52,9 @@ public SQSBufferedConsumerTestsAsync() ); } - [Theory] - [InlineData(true)] - [InlineData(false)] + [Test] + [Arguments(true)] + [Arguments(false)] public async Task When_a_message_consumer_reads_multiple_messages_async(bool fairQueue) { var partitionOne = fairQueue ? new PartitionKey(Uuid.NewAsString()) : PartitionKey.Empty; @@ -104,10 +103,10 @@ public async Task When_a_message_consumer_reads_multiple_messages_async(bool fai //retrieve messages var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.True(messages.Length <= outstandingMessageCount); + await Assert.That(messages.Length <= outstandingMessageCount).IsTrue(); //should not receive more than buffer in one hit - Assert.True(messages.Length <= BufferSize); + await Assert.That(messages.Length <= BufferSize).IsTrue(); var moreMessages = messages.Where(m => m.Header.MessageType == MessageType.MT_COMMAND); foreach (var message in moreMessages) @@ -122,7 +121,7 @@ public async Task When_a_message_consumer_reads_multiple_messages_async(bool fai } while ((iteration <= 5) && (messagesReceivedCount < MessageCount)); - Assert.Equal(4, messagesReceivedCount); + await Assert.That(messagesReceivedCount).IsEqualTo(4); } public async ValueTask DisposeAsync() @@ -132,10 +131,11 @@ public async ValueTask DisposeAsync() await _messageProducer.DisposeAsync(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().GetAwaiter().GetResult(); - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _messageProducer.DisposeAsync().GetAwaiter().GetResult(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } } diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_customising_aws_client_config_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_customising_aws_client_config_async.cs index 56a030fe07..b65bdd1319 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_customising_aws_client_config_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_customising_aws_client_config_async.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -public class CustomisingAwsClientConfigTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +public class CustomisingAwsClientConfigTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -65,7 +64,7 @@ public CustomisingAwsClientConfigTestsAsync() ); } - [Fact] + [Test] public async Task When_customising_aws_client_config() { //arrange @@ -79,18 +78,19 @@ public async Task When_customising_aws_client_config() await _channel.AcknowledgeAsync(message); //publish_and_subscribe_should_use_custom_http_client_factory - Assert.Contains("sqs_async_sub", InterceptingDelegatingHandler.RequestCount); - Assert.True((InterceptingDelegatingHandler.RequestCount["sqs_async_sub"]) > (0)); + await Assert.That(InterceptingDelegatingHandler.RequestCount).ContainsKey("sqs_async_sub"); + await Assert.That((InterceptingDelegatingHandler.RequestCount["sqs_async_sub"]) > (0)).IsTrue(); - Assert.Contains("sqs_async_pub", InterceptingDelegatingHandler.RequestCount); - Assert.True((InterceptingDelegatingHandler.RequestCount["sqs_async_pub"]) > (0)); + await Assert.That(InterceptingDelegatingHandler.RequestCount).ContainsKey("sqs_async_pub"); + await Assert.That((InterceptingDelegatingHandler.RequestCount["sqs_async_pub"]) > (0)).IsTrue(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infastructure_exists_can_assume_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infastructure_exists_can_assume_async.cs index baa9de9ed3..9fc1267115 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infastructure_exists_can_assume_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infastructure_exists_can_assume_async.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AWSAssumeInfrastructureTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AWSAssumeInfrastructureTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly SqsMessageConsumer _consumer; @@ -67,7 +66,7 @@ public AWSAssumeInfrastructureTestsAsync() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName()); } - [Fact] + [Test] public async Task When_infastructure_exists_can_assume() { //arrange @@ -77,17 +76,18 @@ public async Task When_infastructure_exists_can_assume() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infastructure_exists_can_verify_by_url.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infastructure_exists_can_verify_by_url.cs index 7a571bf893..1d51de4a03 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infastructure_exists_can_verify_by_url.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infastructure_exists_can_verify_by_url.cs @@ -7,22 +7,22 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AWSValidateInfrastructureByUrlTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AWSValidateInfrastructureByUrlTests : IAsyncDisposable { - private readonly Message _message; - private readonly IAmAMessageConsumerSync _consumer; - private readonly SqsMessageProducer _messageProducer; - private readonly ChannelFactory _channelFactory; - private readonly MyCommand _myCommand; - - public AWSValidateInfrastructureByUrlTests() + private Message _message; + private IAmAMessageConsumerSync _consumer; + private SqsMessageProducer _messageProducer; + private ChannelFactory _channelFactory; + private MyCommand _myCommand; + + [Before(Test)] + public async Task Setup() { _myCommand = new MyCommand { Value = "Test" }; var replyTo = new RoutingKey("http:\\queueUrl"); @@ -51,7 +51,7 @@ public AWSValidateInfrastructureByUrlTests() _channelFactory = new ChannelFactory(awsConnection); var channel = _channelFactory.CreateSyncChannel(subscription); - var queueUrl = FindQueueUrl(awsConnection, routingKey.Value); + var queueUrl = await FindQueueUrl(awsConnection, routingKey.Value); //Now change the subscription to validate, just check what we made subscription = new SqsSubscription( @@ -76,11 +76,11 @@ public AWSValidateInfrastructureByUrlTests() _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -88,19 +88,20 @@ public async Task When_infrastructure_exists_can_verify() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue _consumer.Acknowledge(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); _consumer.Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() @@ -111,10 +112,10 @@ public async ValueTask DisposeAsync() await _messageProducer.DisposeAsync(); } - private static string FindQueueUrl(AWSMessagingGatewayConnection connection, string queueName) + private static async Task FindQueueUrl(AWSMessagingGatewayConnection connection, string queueName) { using var snsClient = new AWSClientFactory(connection).CreateSqsClient(); - var topicResponse = snsClient.GetQueueUrlAsync(queueName).GetAwaiter().GetResult(); + var topicResponse = await snsClient.GetQueueUrlAsync(queueName); return topicResponse.QueueUrl; } } diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_verify_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_verify_async.cs index c1b4df8dc8..0745c111a7 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_verify_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_verify_async.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Proactor { - [Trait("Category", "AWS")] - [Trait("Fragile", "CI")] - public class AwsValidateInfrastructureTestsAsync : IDisposable, IAsyncDisposable + [Category("AWS")] + [Property("Fragile", "CI")] + public class AwsValidateInfrastructureTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerAsync _consumer; @@ -64,7 +63,7 @@ public AwsValidateInfrastructureTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify_async() { await _messageProducer.SendAsync(_message); @@ -74,18 +73,19 @@ public async Task When_infrastructure_exists_can_verify_async() var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); ((IAmAMessageConsumerSync)_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_verify_by_url_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_verify_by_url_async.cs index 6af0996a58..da590bee0a 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_verify_by_url_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_infrastructure_exists_can_verify_by_url_async.cs @@ -7,22 +7,22 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AwsValidateInfrastructureByUrlTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AwsValidateInfrastructureByUrlTestsAsync : IAsyncDisposable { - private readonly Message _message; - private readonly IAmAMessageConsumerAsync _consumer; - private readonly SqsMessageProducer _messageProducer; - private readonly ChannelFactory _channelFactory; - private readonly MyCommand _myCommand; - - public AwsValidateInfrastructureByUrlTestsAsync() + private Message _message; + private IAmAMessageConsumerAsync _consumer; + private SqsMessageProducer _messageProducer; + private ChannelFactory _channelFactory; + private MyCommand _myCommand; + + [Before(Test)] + public async Task Setup() { _myCommand = new MyCommand { Value = "Test" }; const string replyTo = "http:\\queueUrl"; @@ -52,9 +52,9 @@ public AwsValidateInfrastructureByUrlTestsAsync() var awsConnection = GatewayFactory.CreateFactory(); _channelFactory = new ChannelFactory(awsConnection); - var channel = _channelFactory.CreateAsyncChannel(subscription); + var channel = await _channelFactory.CreateAsyncChannelAsync(subscription); - var queueUrl = FindQueueUrl(awsConnection, routingKey.Value).Result; + var queueUrl = await FindQueueUrl(awsConnection, routingKey.Value); subscription = new( subscriptionName: new SubscriptionName(subscriptionName), @@ -77,7 +77,7 @@ public AwsValidateInfrastructureByUrlTestsAsync() _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify_async() { await _messageProducer.SendAsync(_message); @@ -87,7 +87,7 @@ public async Task When_infrastructure_exists_can_verify_async() var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); await _consumer.AcknowledgeAsync(message); } @@ -99,13 +99,14 @@ private static async Task FindQueueUrl(AWSMessagingGatewayConnection con return response.QueueUrl; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); ((IAmAMessageConsumerSync)_consumer).Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs index 2697e7647e..1f40682fc3 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs @@ -8,13 +8,12 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerSendAsyncTests : IAsyncDisposable, IDisposable +[Category("AWS")] +public class SqsMessageProducerSendAsyncTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -63,9 +62,9 @@ public SqsMessageProducerSendAsyncTests() }); } - [Theory] - [InlineData(true)] - [InlineData(false)] + [Test] + [Arguments(true)] + [Arguments(false)] public async Task When_posting_a_message_via_the_producer_async(bool fairQueue) { // arrange @@ -81,30 +80,31 @@ public async Task When_posting_a_message_via_the_producer_async(bool fairQueue) await _channel.AcknowledgeAsync(message); // should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_queueName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_queueName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); // allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); // {"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_queues_missing_assume_throws_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_queues_missing_assume_throws_async.cs index 9fb749f6bc..874c303fc6 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_queues_missing_assume_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_queues_missing_assume_throws_async.cs @@ -4,18 +4,18 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -public class AWSAssumeQueuesTestsAsync : IAsyncDisposable, IDisposable +[Category("AWS")] +public class AWSAssumeQueuesTestsAsync : IAsyncDisposable { - private readonly ChannelFactory _channelFactory; - private readonly IAmAMessageConsumerAsync _consumer; + private ChannelFactory _channelFactory; + private IAmAMessageConsumerAsync _consumer; - public AWSAssumeQueuesTestsAsync() + [Before(Test)] + public async Task Setup() { var channelName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); var queueName = $"Producer-Send-Tests-{Guid.NewGuid().ToString()}".Truncate(45); @@ -37,25 +37,26 @@ public AWSAssumeQueuesTestsAsync() MakeChannels = OnMissingChannel.Create }); - producer.ConfirmTopicExistsAsync(queueName).Wait(); + await producer.ConfirmTopicExistsAsync(queueName); _channelFactory = new ChannelFactory(awsConnection); - var channel = _channelFactory.CreateAsyncChannel(subscription); + var channel = await _channelFactory.CreateAsyncChannelAsync(subscription); //We need to create the topic at least, to check the queues _consumer = new SqsMessageConsumerFactory(awsConnection).CreateAsync(subscription); } - [Fact] + [Test] public async Task When_queues_missing_assume_throws_async() { //we will try to get the queue url, and fail because it does not exist - await Assert.ThrowsAsync(() => _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))); + await Assert.That(() => _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))).ThrowsExactly(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_queues_missing_verify_throws_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_queues_missing_verify_throws_async.cs index ea815e65fb..75f62bf832 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_queues_missing_verify_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_queues_missing_verify_throws_async.cs @@ -4,12 +4,11 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AWSValidateQueuesTestsAsync : IAsyncDisposable { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -31,13 +30,13 @@ public AWSValidateQueuesTestsAsync() _awsConnection = GatewayFactory.CreateFactory(); } - [Fact] + [Test] public async Task When_queues_missing_verify_throws_async() { // We have no queues so we should throw // We need to do this manually in a test - will create the channel from subscriber parameters _channelFactory = new ChannelFactory(_awsConnection); - await Assert.ThrowsAsync(() => _channelFactory.CreateAsyncChannelAsync(_subscription)); + await Assert.That(() => _channelFactory.CreateAsyncChannelAsync(_subscription)).ThrowsExactly(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs index 17b2e92023..47e2df1d1a 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_rejecting_a_message_should_delete_from_queue_async.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerRejectTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerRejectTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -60,7 +59,7 @@ public SqsMessageConsumerRejectTestsAsync() ); } - [Fact] + [Test] public async Task When_rejecting_a_message_should_delete_from_queue_async() { //Arrange @@ -73,13 +72,14 @@ public async Task When_rejecting_a_message_should_delete_from_queue_async() //Assert - message should be deleted, not requeued message = await _channel.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs index 1ae69744ee..82aa079d72 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs @@ -30,13 +30,12 @@ THE SOFTWARE. */ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerDeliveryErrorDlqTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerDeliveryErrorDlqTestsAsync : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelAsync _channel; @@ -96,7 +95,7 @@ public SqsMessageConsumerDeliveryErrorDlqTestsAsync() _dlqChannel = _dlqChannelFactory.CreateAsyncChannel(dlqSubscription); } - [Fact] + [Test] public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq_async() { //Arrange @@ -110,29 +109,30 @@ public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq_ //Assert - message should appear on DLQ var dlqMessage = await _dlqChannel.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); //verify rejection metadata was added (keys are camelCase due to JSON serialization policy) - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(originalTopic, dlqMessage.Header.Bag["originalTopic"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.DeliveryError.ToString(), dlqMessage.Header.Bag["rejectionReason"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal(MessageType.MT_COMMAND.ToString(), dlqMessage.Header.Bag["originalMessageType"].ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalTopic"].ToString()).IsEqualTo(originalTopic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.DeliveryError.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalMessageType"].ToString()).IsEqualTo(MessageType.MT_COMMAND.ToString()); //verify original message is deleted from source queue var sourceMessage = await _channel.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, sourceMessage.Header.MessageType); + await Assert.That(sourceMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _dlqChannelFactory.DeleteTopicAsync().Wait(); - _dlqChannelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _dlqChannelFactory.DeleteTopicAsync(); + await _dlqChannelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_requeueing_a_message_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_requeueing_a_message_async.cs index c8f1906d13..34678597c9 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_requeueing_a_message_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_requeueing_a_message_async.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerRequeueTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerRequeueTestsAsync : IAsyncDisposable { private readonly IAmAMessageProducerAsync _sender; private Message _requeuedMessage; @@ -54,7 +53,7 @@ public SqsMessageProducerRequeueTestsAsync() _channel = _channelFactory.CreateAsyncChannel(subscription); } - [Fact] + [Test] public async Task When_requeueing_a_message_async() { await _sender.SendAsync(_message); @@ -65,13 +64,14 @@ public async Task When_requeueing_a_message_async() await _channel.AcknowledgeAsync(_requeuedMessage); - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_requeueing_redrives_to_the_dlq_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_requeueing_redrives_to_the_dlq_async.cs index 6e5b4cd023..a4c13617a5 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_requeueing_redrives_to_the_dlq_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_requeueing_redrives_to_the_dlq_async.cs @@ -9,14 +9,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageProducerDlqTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageProducerDlqTestsAsync : IAsyncDisposable { private readonly SqsMessageProducer _sender; private readonly IAmAChannelAsync _channel; @@ -65,7 +64,7 @@ public SqsMessageProducerDlqTestsAsync() _channel = _channelFactory.CreateAsyncChannel(subscription); } - [Fact] + [Test] public async Task When_requeueing_redrives_to_the_queue_async() { await _sender.SendAsync(_message); @@ -81,7 +80,7 @@ public async Task When_requeueing_redrives_to_the_queue_async() await Task.Delay(5000); int dlqCount = await GetDLQCountAsync(_dlqChannelName); - Assert.Equal(1, dlqCount); + await Assert.That(dlqCount).IsEqualTo(1); } private async Task GetDLQCountAsync(string queueName) @@ -104,10 +103,11 @@ private async Task GetDLQCountAsync(string queueName) return response.Messages.Count; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_throwing_defer_action_respect_redrive_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_throwing_defer_action_respect_redrive_async.cs index 124456b8f6..740d6b0a46 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_throwing_defer_action_respect_redrive_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_throwing_defer_action_respect_redrive_async.cs @@ -12,13 +12,12 @@ using Paramore.Brighter.MessagingGateway.AWSSQS.V4; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SnsReDrivePolicySDlqTestsAsync : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SnsReDrivePolicySDlqTestsAsync : IAsyncDisposable { private readonly IAmAMessagePump _messagePump; private readonly Message _message; @@ -125,7 +124,7 @@ private async Task GetDLQCountAsync(string queueName) return response.Messages.Count; } - [Fact(Skip = "DLQ is fragile on async tests")] + [Test, Skip("DLQ is fragile on async tests")] public async Task When_throwing_defer_action_respect_redrive_async() { await _sender.SendAsync(_message); @@ -141,13 +140,14 @@ public async Task When_throwing_defer_action_respect_redrive_async() await Task.Delay(5000); int dlqCount = await GetDLQCountAsync(_dlqQueueName); - Assert.Equal(1, dlqCount); + await Assert.That(dlqCount).IsEqualTo(1); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_topic_missing_verify_throws_async.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_topic_missing_verify_throws_async.cs index 282915de96..c644c803fb 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_topic_missing_verify_throws_async.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Proactor/When_topic_missing_verify_throws_async.cs @@ -1,13 +1,12 @@ -using System; +using System; using System.Threading.Tasks; using Amazon.SQS.Model; using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Proactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AWSValidateMissingTopicTestsAsync { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -24,7 +23,7 @@ public AWSValidateMissingTopicTestsAsync() // Because we don't use channel factory to create the infrastructure - it won't exist } - [Fact] + [Test] public async Task When_topic_missing_verify_throws_async() { // arrange diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_a_message_consumer_reads_multiple_messages.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_a_message_consumer_reads_multiple_messages.cs index 3d956c3a57..f433a51347 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_a_message_consumer_reads_multiple_messages.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_a_message_consumer_reads_multiple_messages.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SQSBufferedConsumerTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SQSBufferedConsumerTests : IAsyncDisposable { private readonly SqsMessageProducer _messageProducer; private readonly SqsMessageConsumer _consumer; @@ -53,9 +52,9 @@ public SQSBufferedConsumerTests() new SqsPublication(channelName: channelName, makeChannels: OnMissingChannel.Create)); } - [Theory] - [InlineData(true)] - [InlineData(false)] + [Test] + [Arguments(true)] + [Arguments(false)] public async Task When_a_message_consumer_reads_multiple_messages(bool fairQueue) { var partitionOne = fairQueue ? new PartitionKey(Uuid.NewAsString()) : PartitionKey.Empty; @@ -88,10 +87,10 @@ public async Task When_a_message_consumer_reads_multiple_messages(bool fairQueue ); //send MESSAGE_COUNT messages - _messageProducer.Send(messageOne); - _messageProducer.Send(messageTwo); - _messageProducer.Send(messageThree); - _messageProducer.Send(messageFour); + await _messageProducer.SendAsync(messageOne); + await _messageProducer.SendAsync(messageTwo); + await _messageProducer.SendAsync(messageThree); + await _messageProducer.SendAsync(messageFour); int iteration = 0; @@ -103,18 +102,18 @@ public async Task When_a_message_consumer_reads_multiple_messages(bool fairQueue var outstandingMessageCount = MessageCount - messagesReceivedCount; //retrieve messages - var messages = _consumer.Receive(TimeSpan.FromMilliseconds(10000)); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.True(messages.Length <= outstandingMessageCount); + await Assert.That(messages.Length <= outstandingMessageCount).IsTrue(); //should not receive more than buffer in one hit - Assert.True(messages.Length <= BufferSize); + await Assert.That(messages.Length <= BufferSize).IsTrue(); var moreMessages = messages.Where(m => m.Header.MessageType == MessageType.MT_COMMAND); foreach (var message in moreMessages) { messagesReceived.Add(message); - _consumer.Acknowledge(message); + await _consumer.AcknowledgeAsync(message); } messagesReceivedCount = messagesReceived.Count; @@ -124,16 +123,17 @@ public async Task When_a_message_consumer_reads_multiple_messages(bool fairQueue } while ((iteration <= 5) && (messagesReceivedCount < MessageCount)); - Assert.Equal(4, messagesReceivedCount); + await Assert.That(messagesReceivedCount).IsEqualTo(4); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_customising_aws_client_config.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_customising_aws_client_config.cs index c614a3a799..f0a847d018 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_customising_aws_client_config.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_customising_aws_client_config.cs @@ -6,13 +6,12 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -public class CustomisingAwsClientConfigTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class CustomisingAwsClientConfigTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -60,11 +59,11 @@ public CustomisingAwsClientConfigTests() new SqsPublication { ChannelName = channelName, MakeChannels = OnMissingChannel.Create }); } - [Fact] + [Test] public async Task When_customising_aws_client_config() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -74,18 +73,19 @@ public async Task When_customising_aws_client_config() _channel.Acknowledge(message); //publish_and_subscribe_should_use_custom_http_client_factory - Assert.Contains("sqs_sync_sub", InterceptingDelegatingHandler.RequestCount); - Assert.True((InterceptingDelegatingHandler.RequestCount["sqs_sync_sub"]) > (0)); + await Assert.That(InterceptingDelegatingHandler.RequestCount).ContainsKey("sqs_sync_sub"); + await Assert.That((InterceptingDelegatingHandler.RequestCount["sqs_sync_sub"]) > (0)).IsTrue(); - Assert.Contains("sqs_sync_pub", InterceptingDelegatingHandler.RequestCount); - Assert.True((InterceptingDelegatingHandler.RequestCount["sqs_sync_pub"]) > (0)); + await Assert.That(InterceptingDelegatingHandler.RequestCount).ContainsKey("sqs_sync_pub"); + await Assert.That((InterceptingDelegatingHandler.RequestCount["sqs_sync_pub"]) > (0)).IsTrue(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_infastructure_exists_can_assume.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_infastructure_exists_can_assume.cs index e6be965265..41c3f1851b 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_infastructure_exists_can_assume.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_infastructure_exists_can_assume.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AWSAssumeInfrastructureTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AWSAssumeInfrastructureTests : IAsyncDisposable { private readonly Message _message; private readonly SqsMessageConsumer _consumer; @@ -68,27 +67,28 @@ public AWSAssumeInfrastructureTests() _consumer = new SqsMessageConsumer(awsConnection, channel.Name); } - [Fact] - public void When_infastructure_exists_can_assume() + [Test] + public async Task When_infastructure_exists_can_assume() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); - var messages = _consumer.Receive(TimeSpan.FromMilliseconds(5000)); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue - _consumer.Acknowledge(message); + await _consumer.AcknowledgeAsync(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_infastructure_exists_can_verify.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_infastructure_exists_can_verify.cs index 2eb9f6961d..431f9f2c6c 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_infastructure_exists_can_verify.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_infastructure_exists_can_verify.cs @@ -7,14 +7,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class AWSValidateInfrastructureTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class AWSValidateInfrastructureTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAMessageConsumerSync _consumer; @@ -73,11 +72,11 @@ public AWSValidateInfrastructureTests() _consumer = new SqsMessageConsumerFactory(awsConnection).Create(subscription); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_verify() { //arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -85,19 +84,20 @@ public async Task When_infrastructure_exists_can_verify() //Assert var message = messages.First(); - Assert.Equal(_myCommand.Id, message.Id); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); //clear the queue _consumer.Acknowledge(message); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); _consumer.Dispose(); - _messageProducer.Dispose(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_posting_a_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_posting_a_message_via_the_messaging_gateway.cs index 632a1c47b3..4fc1f35545 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_posting_a_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_posting_a_message_via_the_messaging_gateway.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerSendTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerSendTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -63,15 +62,15 @@ public SqsMessageProducerSendTests() ); } - [Theory] - [InlineData(true)] - [InlineData(false)] + [Test] + [Arguments(true)] + [Arguments(false)] public async Task When_posting_a_message_via_the_producer(bool fairQueue) { //arrange _message.Header.Subject = "test subject"; _message.Header.PartitionKey = fairQueue ? new PartitionKey(Uuid.NewAsString()) : PartitionKey.Empty; - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(1000); @@ -81,30 +80,31 @@ public async Task When_posting_a_message_via_the_producer(bool fairQueue) _channel.Acknowledge(message); //should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_queueName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_queueName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); //allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); //{"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { //Clean up resources that we have created - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _messageProducer.Dispose(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queue_missing_verify_throws.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queue_missing_verify_throws.cs index 5df29621c4..9a614efaea 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queue_missing_verify_throws.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queue_missing_verify_throws.cs @@ -1,12 +1,11 @@ -using System; +using System; using Amazon.SQS.Model; using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] +[Category("AWS")] public class AwsValidateMissingTopicTests { private readonly AWSMessagingGatewayConnection _awsConnection; @@ -22,8 +21,8 @@ public AwsValidateMissingTopicTests() //Because we don't use channel factory to create the infrastructure -it won't exist } - [Fact] - public void When_queue_missing_verify_throws() + [Test] + public async Task When_queue_missing_verify_throws() { //arrange var producer = new SqsMessageProducer( @@ -31,8 +30,11 @@ public void When_queue_missing_verify_throws() new SqsPublication(channelName: new ChannelName(_routingKey), makeChannels: OnMissingChannel.Validate)); //act && assert - Assert.Throws(() => producer.Send(new Message( - new MessageHeader("", _routingKey, MessageType.MT_EVENT, type: new CloudEventsType("plain/text")), - new MessageBody("Test")))); + Assert.ThrowsExactly(() => + { + producer.Send(new Message( + new MessageHeader("", _routingKey, MessageType.MT_EVENT, type: new CloudEventsType("plain/text")), + new MessageBody("Test"))); + }); } } diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queues_missing_assume_throws.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queues_missing_assume_throws.cs index c557dd8831..e72e78ea3d 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queues_missing_assume_throws.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queues_missing_assume_throws.cs @@ -4,13 +4,12 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -public class AWSAssumeQueuesTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AWSAssumeQueuesTests : IAsyncDisposable { private readonly ChannelFactory _channelFactory; private readonly SqsMessageConsumer _consumer; @@ -36,16 +35,17 @@ public AWSAssumeQueuesTests() _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName()); } - [Fact] - public void When_queues_missing_assume_throws() + [Test] + public async Task When_queues_missing_assume_throws() { //we will try to get the queue url, and fail because it does not exist - Assert.Throws(() => _consumer.Receive(TimeSpan.FromMilliseconds(1000))); + await Assert.That(() => _consumer.Receive(TimeSpan.FromMilliseconds(1000))).ThrowsExactly(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queues_missing_verify_throws.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queues_missing_verify_throws.cs index 6162047318..c6ca7207a0 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queues_missing_verify_throws.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_queues_missing_verify_throws.cs @@ -4,13 +4,12 @@ using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -public class AWSValidateQueuesTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class AWSValidateQueuesTests : IAsyncDisposable { private readonly AWSMessagingGatewayConnection _awsConnection; private readonly SqsSubscription _subscription; @@ -31,18 +30,19 @@ public AWSValidateQueuesTests() _awsConnection = GatewayFactory.CreateFactory(); } - [Fact] - public void When_queues_missing_verify_throws() + [Test] + public async Task When_queues_missing_verify_throws() { //We have no queues so we should throw //We need to do this manually in a test - will create the channel from subscriber parameters _channelFactory = new ChannelFactory(_awsConnection); - Assert.Throws(() => _channelFactory.CreateSyncChannel(_subscription)); + await Assert.That(() => _channelFactory.CreateSyncChannel(_subscription)).ThrowsExactly(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_a_message_should_delete_from_queue.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_a_message_should_delete_from_queue.cs index c3ee95d320..b2dab565cc 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_a_message_should_delete_from_queue.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_a_message_should_delete_from_queue.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerRejectTests : IDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerRejectTests { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -61,11 +60,11 @@ public SqsMessageConsumerRejectTests() ); } - [Fact] - public void When_rejecting_a_message_should_delete_from_queue() + [Test] + public async Task When_rejecting_a_message_should_delete_from_queue() { //Arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); //Act @@ -74,13 +73,14 @@ public void When_rejecting_a_message_should_delete_from_queue() //Assert - message should be deleted, not requeued message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs index 05f0a15730..7cefeb4cef 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs @@ -30,13 +30,12 @@ THE SOFTWARE. */ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerDeliveryErrorDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerDeliveryErrorDlqTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -96,11 +95,11 @@ public SqsMessageConsumerDeliveryErrorDlqTests() _dlqChannel = _dlqChannelFactory.CreateSyncChannel(dlqSubscription); } - [Fact] - public void When_rejecting_message_with_delivery_error_should_send_to_dlq() + [Test] + public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq() { //Arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); //Act @@ -110,29 +109,30 @@ public void When_rejecting_message_with_delivery_error_should_send_to_dlq() //Assert - message should appear on DLQ var dlqMessage = _dlqChannel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); //verify rejection metadata was added (keys are camelCase due to JSON serialization policy) - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(originalTopic, dlqMessage.Header.Bag["originalTopic"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.DeliveryError.ToString(), dlqMessage.Header.Bag["rejectionReason"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal(MessageType.MT_COMMAND.ToString(), dlqMessage.Header.Bag["originalMessageType"].ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalTopic"].ToString()).IsEqualTo(originalTopic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.DeliveryError.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalMessageType"].ToString()).IsEqualTo(MessageType.MT_COMMAND.ToString()); //verify original message is deleted from source queue var sourceMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, sourceMessage.Header.MessageType); + await Assert.That(sourceMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _dlqChannelFactory.DeleteTopicAsync().Wait(); - _dlqChannelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _dlqChannelFactory.DeleteTopicAsync(); + await _dlqChannelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log.cs index b54350d2cc..0ddf537842 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log.cs @@ -30,13 +30,12 @@ THE SOFTWARE. */ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerNoChannelsRejectTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerNoChannelsRejectTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -79,11 +78,11 @@ public SqsMessageConsumerNoChannelsRejectTests() new SqsPublication(channelName: channelName, makeChannels: OnMissingChannel.Create)); } - [Fact] - public void When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log() + [Test] + public async Task When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log() { //Arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); //Act - reject with a DeliveryError reason but no DLQ configured @@ -91,13 +90,14 @@ public void When_rejecting_message_with_no_channels_configured_should_acknowledg //Assert - original message should be deleted (acknowledged) since there is no DLQ var sourceMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, sourceMessage.Header.MessageType); + await Assert.That(sourceMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs index 182b0367b6..237e2eda86 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs @@ -30,13 +30,12 @@ THE SOFTWARE. */ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerUnacceptableFallbackToDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerUnacceptableFallbackToDlqTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -97,11 +96,11 @@ public SqsMessageConsumerUnacceptableFallbackToDlqTests() _dlqChannel = _dlqChannelFactory.CreateSyncChannel(dlqSubscription); } - [Fact] - public void When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq() + [Test] + public async Task When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq() { //Arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); //Act @@ -111,29 +110,30 @@ public void When_rejecting_message_with_unacceptable_and_no_invalid_channel_shou //Assert - message should fall back to the DLQ since no invalid message queue is configured var dlqMessage = _dlqChannel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); //verify rejection metadata was added (keys are camelCase due to JSON serialization policy) - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(originalTopic, dlqMessage.Header.Bag["originalTopic"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.Unacceptable.ToString(), dlqMessage.Header.Bag["rejectionReason"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal(MessageType.MT_COMMAND.ToString(), dlqMessage.Header.Bag["originalMessageType"].ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalTopic"].ToString()).IsEqualTo(originalTopic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.Unacceptable.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalMessageType"].ToString()).IsEqualTo(MessageType.MT_COMMAND.ToString()); //verify original message is deleted from source queue var sourceMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, sourceMessage.Header.MessageType); + await Assert.That(sourceMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _dlqChannelFactory.DeleteTopicAsync().Wait(); - _dlqChannelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _dlqChannelFactory.DeleteTopicAsync(); + await _dlqChannelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs index 93e0d01f58..9417dd5eb5 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs @@ -30,13 +30,12 @@ THE SOFTWARE. */ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageConsumerUnacceptableInvalidChannelTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageConsumerUnacceptableInvalidChannelTests : IAsyncDisposable { private readonly Message _message; private readonly IAmAChannelSync _channel; @@ -114,11 +113,11 @@ public SqsMessageConsumerUnacceptableInvalidChannelTests() _dlqChannel = _dlqChannelFactory.CreateSyncChannel(dlqSubscription); } - [Fact] - public void When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel() + [Test] + public async Task When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel() { //Arrange - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); //Act @@ -128,35 +127,36 @@ public void When_rejecting_message_with_unacceptable_reason_should_send_to_inval //Assert - message should appear on the invalid message queue var invalidMessage = _invalidChannel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.NotEqual(MessageType.MT_NONE, invalidMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, invalidMessage.Body.Value); + await Assert.That(invalidMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(invalidMessage.Body.Value).IsEqualTo(_message.Body.Value); //verify rejection metadata was added (keys are camelCase due to JSON serialization policy) - Assert.True(invalidMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(originalTopic, invalidMessage.Header.Bag["originalTopic"].ToString()); - Assert.True(invalidMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.Unacceptable.ToString(), invalidMessage.Header.Bag["rejectionReason"].ToString()); - Assert.True(invalidMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.True(invalidMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal(MessageType.MT_COMMAND.ToString(), invalidMessage.Header.Bag["originalMessageType"].ToString()); + await Assert.That(invalidMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(invalidMessage.Header.Bag["originalTopic"].ToString()).IsEqualTo(originalTopic); + await Assert.That(invalidMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(invalidMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.Unacceptable.ToString()); + await Assert.That(invalidMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(invalidMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(invalidMessage.Header.Bag["originalMessageType"].ToString()).IsEqualTo(MessageType.MT_COMMAND.ToString()); //verify message did NOT go to the DLQ var dlqMessage = _dlqChannel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, dlqMessage.Header.MessageType); + await Assert.That(dlqMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); //verify original message is deleted from source queue var sourceMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, sourceMessage.Header.MessageType); + await Assert.That(sourceMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); - _invalidChannelFactory.DeleteTopicAsync().Wait(); - _invalidChannelFactory.DeleteQueueAsync().Wait(); - _dlqChannelFactory.DeleteTopicAsync().Wait(); - _dlqChannelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); + await _invalidChannelFactory.DeleteTopicAsync(); + await _invalidChannelFactory.DeleteQueueAsync(); + await _dlqChannelFactory.DeleteTopicAsync(); + await _dlqChannelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_requeueing_a_message.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_requeueing_a_message.cs index a26152adca..c59853ffab 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_requeueing_a_message.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_requeueing_a_message.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; using System.Collections.Generic; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -public class SqsMessageProducerRequeueTests : IDisposable, IAsyncDisposable +[Category("AWS")] +public class SqsMessageProducerRequeueTests : IAsyncDisposable { private readonly IAmAMessageProducerSync _sender; private Message _requeuedMessage; @@ -63,8 +62,8 @@ public SqsMessageProducerRequeueTests() _channel = _channelFactory.CreateSyncChannel(subscription); } - [Fact] - public void When_requeueing_a_message() + [Test] + public async Task When_requeueing_a_message() { _sender.Send(_message); _receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); @@ -75,13 +74,14 @@ public void When_requeueing_a_message() //clear the queue _channel.Acknowledge(_requeuedMessage); - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_requeueing_redrives_to_the_dlq.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_requeueing_redrives_to_the_dlq.cs index ba3fca52d5..32ec50beb4 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_requeueing_redrives_to_the_dlq.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_requeueing_redrives_to_the_dlq.cs @@ -10,13 +10,12 @@ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SqsMessageProducerDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SqsMessageProducerDlqTests : IAsyncDisposable { private readonly SqsMessageProducer _sender; private readonly IAmAChannelSync _channel; @@ -69,10 +68,10 @@ public SqsMessageProducerDlqTests() _channel = _channelFactory.CreateSyncChannel(subscription); } - [Fact] - public void When_requeueing_redrives_to_the_queue() + [Test] + public async Task When_requeueing_redrives_to_the_queue() { - _sender.Send(_message); + await _sender.SendAsync(_message); var receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); _channel.Requeue(receivedMessage); @@ -86,19 +85,19 @@ public void When_requeueing_redrives_to_the_queue() Task.Delay(5000); //inspect the dlq - Assert.Equal(1, GetDLQCount(_dlqChannelName)); + await Assert.That(await GetDLQCount(_dlqChannelName)).IsEqualTo(1); } - private int GetDLQCount(string queueName) + private async Task GetDLQCount(string queueName) { using var sqsClient = new AWSClientFactory(_awsConnection).CreateSqsClient(); - var queueUrlResponse = sqsClient.GetQueueUrlAsync(queueName).GetAwaiter().GetResult(); - var response = sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest + var queueUrlResponse = await sqsClient.GetQueueUrlAsync(queueName); + var response = await sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest { QueueUrl = queueUrlResponse.QueueUrl, WaitTimeSeconds = 5, MessageAttributeNames = new List { "All", "ApproximateReceiveCount" } - }).GetAwaiter().GetResult(); + }); if (response.HttpStatusCode != HttpStatusCode.OK) { @@ -109,10 +108,11 @@ private int GetDLQCount(string queueName) return response.Messages.Count; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_throwing_defer_action_respect_redrive.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_throwing_defer_action_respect_redrive.cs index b0c72a8df7..4e02bf7e3c 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_throwing_defer_action_respect_redrive.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/Standard/Reactor/When_throwing_defer_action_respect_redrive.cs @@ -12,13 +12,12 @@ using Paramore.Brighter.MessagingGateway.AWSSQS.V4; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs.Standard.Reactor; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] -public class SnsReDrivePolicySDlqTests : IDisposable, IAsyncDisposable +[Category("AWS")] +[Property("Fragile", "CI")] +public class SnsReDrivePolicySDlqTests : IAsyncDisposable { private readonly IAmAMessagePump _messagePump; private readonly Message _message; @@ -117,17 +116,17 @@ public SnsReDrivePolicySDlqTests() }; } - private int GetDLQCount(string queueName) + private async Task GetDLQCount(string queueName) { - using var sqsClient = new AWSClientFactory(_awsConnection).CreateSqsClient(); - var queueUrlResponse = sqsClient.GetQueueUrlAsync(queueName).GetAwaiter().GetResult(); - var response = sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest + using var sqsClient = new AWSClientFactory(_awsConnection).CreateSqsClient(); + var queueUrlResponse = await sqsClient.GetQueueUrlAsync(queueName); + var response = await sqsClient.ReceiveMessageAsync(new ReceiveMessageRequest { QueueUrl = queueUrlResponse.QueueUrl, WaitTimeSeconds = 5, MessageSystemAttributeNames = ["ApproximateReceiveCount"], MessageAttributeNames = new List { "All" } - }).GetAwaiter().GetResult(); + }); if (response.HttpStatusCode != HttpStatusCode.OK) { @@ -139,11 +138,11 @@ private int GetDLQCount(string queueName) } - [Fact] + [Test] public async Task When_throwing_defer_action_respect_redrive() { //put something on an SNS topic, which will be delivered to our SQS queue - _sender.Send(_message); + await _sender.SendAsync(_message); //start a message pump, let it process messages var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); @@ -159,13 +158,14 @@ public async Task When_throwing_defer_action_respect_redrive() await Task.Delay(5000); //inspect the dlq - Assert.Equal(1, GetDLQCount(_dlqChannelName)); + await Assert.That(await GetDLQCount(_dlqChannelName)).IsEqualTo(1); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteTopicAsync().Wait(); - _channelFactory.DeleteQueueAsync().Wait(); + await _channelFactory.DeleteTopicAsync(); + await _channelFactory.DeleteQueueAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/When_creating_sqs_consumer_with_dlq_subscription_should_pass_routing_keys.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/When_creating_sqs_consumer_with_dlq_subscription_should_pass_routing_keys.cs index 87079d8c4b..acc9088095 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/When_creating_sqs_consumer_with_dlq_subscription_should_pass_routing_keys.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/When_creating_sqs_consumer_with_dlq_subscription_should_pass_routing_keys.cs @@ -27,7 +27,6 @@ THE SOFTWARE. */ using Amazon.Runtime; using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs; @@ -45,8 +44,8 @@ public SqsMessageConsumerFactoryDlqTests() _factory = new SqsMessageConsumerFactory(connection); } - [Fact] - public void When_creating_sqs_consumer_with_dlq_subscription_should_pass_routing_keys() + [Test] + public async Task When_creating_sqs_consumer_with_dlq_subscription_should_pass_routing_keys() { //Arrange var dlqRoutingKey = new RoutingKey("orders-dlq"); @@ -64,7 +63,7 @@ public void When_creating_sqs_consumer_with_dlq_subscription_should_pass_routing _consumer = _factory.Create(subscription); //Assert - verify the factory passed routing keys to the consumer - Assert.NotNull(_consumer); + await Assert.That(_consumer).IsNotNull(); var consumerType = _consumer.GetType(); var dlqField = consumerType.GetField("_deadLetterRoutingKey", @@ -72,17 +71,17 @@ public void When_creating_sqs_consumer_with_dlq_subscription_should_pass_routing var invalidField = consumerType.GetField("_invalidMessageRoutingKey", BindingFlags.NonPublic | BindingFlags.Instance); - Assert.NotNull(dlqField); - Assert.NotNull(invalidField); + await Assert.That(dlqField).IsNotNull(); + await Assert.That(invalidField).IsNotNull(); var actualDlq = dlqField.GetValue(_consumer) as RoutingKey; var actualInvalid = invalidField.GetValue(_consumer) as RoutingKey; - Assert.NotNull(actualDlq); - Assert.Equal("orders-dlq", actualDlq.Value); + await Assert.That(actualDlq).IsNotNull(); + await Assert.That(actualDlq.Value).IsEqualTo("orders-dlq"); - Assert.NotNull(actualInvalid); - Assert.Equal("orders-invalid", actualInvalid.Value); + await Assert.That(actualInvalid).IsNotNull(); + await Assert.That(actualInvalid.Value).IsEqualTo("orders-invalid"); } public void Dispose() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/When_creating_sqs_subscription_with_dlq_routing_keys_should_expose_properties.cs b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/When_creating_sqs_subscription_with_dlq_routing_keys_should_expose_properties.cs index 2b91123af3..1053d2b564 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/When_creating_sqs_subscription_with_dlq_routing_keys_should_expose_properties.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/MessagingGateway/Sqs/When_creating_sqs_subscription_with_dlq_routing_keys_should_expose_properties.cs @@ -23,14 +23,13 @@ THE SOFTWARE. */ using Paramore.Brighter.AWS.V4.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AWSSQS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.MessagingGateway.Sqs; public class SqsSubscriptionDlqRoutingKeyTests { - [Fact] - public void When_creating_sqs_subscription_with_dlq_routing_keys_should_expose_properties() + [Test] + public async Task When_creating_sqs_subscription_with_dlq_routing_keys_should_expose_properties() { //Arrange var deadLetterRoutingKey = new RoutingKey("orders-dlq"); @@ -46,17 +45,17 @@ public void When_creating_sqs_subscription_with_dlq_routing_keys_should_expose_p ); //Assert - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var dlqSupport = (IUseBrighterDeadLetterSupport)subscription; - Assert.Equal(deadLetterRoutingKey, dlqSupport.DeadLetterRoutingKey); + await Assert.That(dlqSupport.DeadLetterRoutingKey).IsEqualTo(deadLetterRoutingKey); - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var invalidSupport = (IUseBrighterInvalidMessageSupport)subscription; - Assert.Equal(invalidMessageRoutingKey, invalidSupport.InvalidMessageRoutingKey); + await Assert.That(invalidSupport.InvalidMessageRoutingKey).IsEqualTo(invalidMessageRoutingKey); } - [Fact] - public void When_creating_sqs_subscription_without_dlq_routing_keys_should_default_to_null() + [Test] + public async Task When_creating_sqs_subscription_without_dlq_routing_keys_should_default_to_null() { //Arrange & Act var subscription = new SqsSubscription( @@ -66,12 +65,12 @@ public void When_creating_sqs_subscription_without_dlq_routing_keys_should_defau ); //Assert - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var dlqSupport = (IUseBrighterDeadLetterSupport)subscription; - Assert.Null(dlqSupport.DeadLetterRoutingKey); + await Assert.That(dlqSupport.DeadLetterRoutingKey).IsNull(); - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var invalidSupport = (IUseBrighterInvalidMessageSupport)subscription; - Assert.Null(invalidSupport.InvalidMessageRoutingKey); + await Assert.That(invalidSupport.InvalidMessageRoutingKey).IsNull(); } } diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/Paramore.Brighter.AWS.V4.Tests.csproj b/tests/Paramore.Brighter.AWS.V4.Tests/Paramore.Brighter.AWS.V4.Tests.csproj index 155c8838b3..d93610401c 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/Paramore.Brighter.AWS.V4.Tests.csproj +++ b/tests/Paramore.Brighter.AWS.V4.Tests/Paramore.Brighter.AWS.V4.Tests.csproj @@ -1,29 +1,14 @@ - $(BrighterTestTargetFrameworks) false + Exe - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - + - @@ -31,5 +16,4 @@ - - + \ No newline at end of file diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/Transformers/When_creating_luggagestore_missing_parameters.cs b/tests/Paramore.Brighter.AWS.V4.Tests/Transformers/When_creating_luggagestore_missing_parameters.cs index 149beff93a..d59bf3e7ff 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/Transformers/When_creating_luggagestore_missing_parameters.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/Transformers/When_creating_luggagestore_missing_parameters.cs @@ -1,10 +1,9 @@ -using System; +using System; using System.Net.Http; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.AWS.V4.Tests.Helpers; using Paramore.Brighter.Transformers.AWS.V4; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.Transformers; @@ -23,39 +22,39 @@ public S3LuggageUploadMissingParametersTests() _bucketName = $"brightertestbucket-{Guid.NewGuid()}"; } - [Fact] - public void When_creating_luggagestore_missing_client() + [Test] + public async Task When_creating_luggagestore_missing_client() { //arrange var exception = Catch.Exception(() => new S3LuggageStore(new S3LuggageOptions(null!, null!))); - Assert.NotNull(exception); - Assert.IsType(exception); + await Assert.That(exception).IsNotNull(); + await Assert.That(exception).IsTypeOf(); } - [Theory] - [InlineData("")] - [InlineData(null)] - public void When_creating_luggagestore_missing_bucketName(string? bucketName) + [Test] + [Arguments("")] + [Arguments(null)] + public async Task When_creating_luggagestore_missing_bucketName(string? bucketName) { //arrange var exception = Catch.Exception(() => new S3LuggageStore(new S3LuggageOptions(GatewayFactory.CreateS3Connection(), bucketName!))); - Assert.NotNull(exception); - Assert.IsType(exception); + await Assert.That(exception).IsNotNull(); + await Assert.That(exception).IsTypeOf(); } - [Fact] + [Test] public async Task When_creating_luggagestore_bad_bucketName() { //arrange var exception = Catch.Exception(() => new S3LuggageStore(new S3LuggageOptions(GatewayFactory.CreateS3Connection(), "A" ))); - Assert.NotNull(exception); - Assert.IsType(exception); + await Assert.That(exception).IsNotNull(); + await Assert.That(exception).IsTypeOf(); } - [Fact] + [Test] public async Task When_creating_luggagestore_missing_httpClient() { //arrange @@ -65,11 +64,11 @@ public async Task When_creating_luggagestore_missing_httpClient() await store.EnsureStoreExistsAsync(); }); - Assert.NotNull(exception); - Assert.IsType(exception); + await Assert.That(exception).IsNotNull(); + await Assert.That(exception).IsTypeOf(); } - [Fact] + [Test] public async Task When_creating_luggagestore_missing_ACL() { //arrange @@ -83,7 +82,7 @@ public async Task When_creating_luggagestore_missing_ACL() await store.EnsureStoreExistsAsync(); }); - Assert.NotNull(exception); - Assert.IsType(exception); + await Assert.That(exception).IsNotNull(); + await Assert.That(exception).IsTypeOf(); } } diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/Transformers/When_unwrapping_a_large_message.cs b/tests/Paramore.Brighter.AWS.V4.Tests/Transformers/When_unwrapping_a_large_message.cs index feddf1c569..381b16a62e 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/Transformers/When_unwrapping_a_large_message.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/Transformers/When_unwrapping_a_large_message.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Net.Http; using System.Text.Json; @@ -11,12 +11,11 @@ using Paramore.Brighter.Observability; using Paramore.Brighter.Transformers.AWS.V4; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.Transformers; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] +[Category("AWS")] +[Property("Fragile", "CI")] public class LargeMessagePaylodUnwrapTests : IAsyncDisposable { private readonly TransformPipelineBuilderAsync _pipelineBuilder; @@ -27,7 +26,6 @@ public class LargeMessagePaylodUnwrapTests : IAsyncDisposable public LargeMessagePaylodUnwrapTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); var mapperRegistry = new MessageMapperRegistry( null, @@ -59,7 +57,7 @@ public LargeMessagePaylodUnwrapTests() _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.None); } - [Fact] + [Test] public async Task When_unwrapping_a_large_message() { //arrange @@ -98,8 +96,8 @@ public async Task When_unwrapping_a_large_message() //assert //contents should be from storage - Assert.Equal(contents, transformedMessage.Value); - Assert.False((await _luggageStore.HasClaimAsync(id))); + await Assert.That(transformedMessage.Value).IsEqualTo(contents); + await Assert.That((await _luggageStore.HasClaimAsync(id))).IsFalse(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/Transformers/When_uploading_luggage_to_S3.cs b/tests/Paramore.Brighter.AWS.V4.Tests/Transformers/When_uploading_luggage_to_S3.cs index cf86058b56..a358a03a10 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/Transformers/When_uploading_luggage_to_S3.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/Transformers/When_uploading_luggage_to_S3.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Net; using System.Net.Http; @@ -11,7 +11,6 @@ using Polly; using Polly.Contrib.WaitAndRetry; using Polly.Retry; -using Xunit; using Policy = Polly.Policy; namespace Paramore.Brighter.AWS.V4.Tests.Transformers; @@ -30,7 +29,7 @@ public S3LuggageUploadTests() _bucketName = $"brightertestbucket-{Guid.NewGuid()}"; } - [Fact] + [Test] public async Task When_uploading_luggage_to_S3() { //arrange @@ -58,12 +57,12 @@ public async Task When_uploading_luggage_to_S3() //assert //do we have a claim? - Assert.True((await luggageStore.HasClaimAsync(claim))); + await Assert.That((await luggageStore.HasClaimAsync(claim))).IsTrue(); //check for the contents indicated by the claim id on S3 var result = await luggageStore.RetrieveAsync(claim); var resultAsString = await new StreamReader(result).ReadToEndAsync(); - Assert.Equal(testContent, resultAsString); + await Assert.That(resultAsString).IsEqualTo(testContent); await luggageStore.DeleteAsync(claim); diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/Transformers/When_validating_a_luggage_store_exists.cs b/tests/Paramore.Brighter.AWS.V4.Tests/Transformers/When_validating_a_luggage_store_exists.cs index c426c42947..0ec3ffa08d 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/Transformers/When_validating_a_luggage_store_exists.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/Transformers/When_validating_a_luggage_store_exists.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Http; using System.Threading.Tasks; using Amazon.S3; @@ -8,12 +8,11 @@ using Paramore.Brighter.MessagingGateway.AWSSQS.V4; using Paramore.Brighter.Transformers.AWS.V4; using Paramore.Brighter.Transforms.Storage; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.Transformers; -[Trait("Category", "AWS")] -[Trait("Fragile", "CI")] +[Category("AWS")] +[Property("Fragile", "CI")] public class S3LuggageStoreExistsTests { private readonly IHttpClientFactory _httpClientFactory; @@ -27,7 +26,7 @@ public S3LuggageStoreExistsTests() _httpClientFactory = provider.GetRequiredService(); } - [Fact] + [Test] public async Task When_checking_store_that_exists() { var bucketName = $"brightertestbucket-{Guid.NewGuid()}"; @@ -55,7 +54,7 @@ public async Task When_checking_store_that_exists() Tags = [new Tag { Key = "BrighterTests", Value = "S3LuggageUploadTests" }], }); - Assert.NotNull(luggageStore); + await Assert.That(luggageStore).IsNotNull(); //teardown var factory = new AWSClientFactory(GatewayFactory.CreateFactory()); @@ -63,7 +62,7 @@ public async Task When_checking_store_that_exists() await client.DeleteBucketAsync(bucketName); } - [Fact] + [Test] public async Task When_checking_store_that_does_not_exist() { //act @@ -82,7 +81,7 @@ public async Task When_checking_store_that_does_not_exist() await luggageStore.EnsureStoreExistsAsync(); }); - Assert.NotNull(doesNotExist); - Assert.True(doesNotExist is InvalidOperationException); + await Assert.That(doesNotExist).IsNotNull(); + await Assert.That(doesNotExist is InvalidOperationException).IsTrue(); } } diff --git a/tests/Paramore.Brighter.AWS.V4.Tests/Transformers/When_wrapping_a_large_message.cs b/tests/Paramore.Brighter.AWS.V4.Tests/Transformers/When_wrapping_a_large_message.cs index f005a63492..ba7f9da82d 100644 --- a/tests/Paramore.Brighter.AWS.V4.Tests/Transformers/When_wrapping_a_large_message.cs +++ b/tests/Paramore.Brighter.AWS.V4.Tests/Transformers/When_wrapping_a_large_message.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Http; using System.Threading.Tasks; using Amazon.S3; @@ -10,7 +10,6 @@ using Paramore.Brighter.Observability; using Paramore.Brighter.Transformers.AWS.V4; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.AWS.V4.Tests.Transformers; @@ -29,7 +28,6 @@ public class LargeMessagePayloadWrapTests : IAsyncDisposable public LargeMessagePayloadWrapTests() { //arrange - TransformPipelineBuilderAsync.ClearPipelineCache(); var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync( @@ -67,7 +65,7 @@ public LargeMessagePayloadWrapTests() _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, transformerFactoryAsync, InstrumentationOptions.None); } - [Fact] + [Test] public async Task When_wrapping_a_large_message() { //act @@ -75,12 +73,12 @@ public async Task When_wrapping_a_large_message() var message = await _transformPipeline.WrapAsync(_myCommand, new RequestContext(), _publication); //assert - Assert.True(message.Header.Bag.ContainsKey(ClaimCheckTransformer.CLAIM_CHECK)); - Assert.NotNull(message.Header.DataRef); + await Assert.That(message.Header.Bag.ContainsKey(ClaimCheckTransformer.CLAIM_CHECK)).IsTrue(); + await Assert.That(message.Header.DataRef).IsNotNull(); _id = (string)message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK]; - Assert.Equal($"Claim Check {_id}", message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo($"Claim Check {_id}"); - Assert.True(await _luggageStore.HasClaimAsync(_id)); + await Assert.That(await _luggageStore.HasClaimAsync(_id)).IsTrue(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.AWSScheduler.Tests/Paramore.Brighter.AWSScheduler.Tests.csproj b/tests/Paramore.Brighter.AWSScheduler.Tests/Paramore.Brighter.AWSScheduler.Tests.csproj index a42f2a1461..ed287ffafc 100644 --- a/tests/Paramore.Brighter.AWSScheduler.Tests/Paramore.Brighter.AWSScheduler.Tests.csproj +++ b/tests/Paramore.Brighter.AWSScheduler.Tests/Paramore.Brighter.AWSScheduler.Tests.csproj @@ -1,31 +1,16 @@ - - + $(BrighterTestTargetFrameworks) enable false + Exe - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - + + - \ No newline at end of file diff --git a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message.cs b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message.cs index f5682ae6a7..93120a2ed0 100644 --- a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message.cs +++ b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using Paramore.Brighter.AWSScheduler.Tests.Helpers; using Paramore.Brighter.AWSScheduler.Tests.TestDoubles; using Paramore.Brighter.MessageScheduler.AWS; @@ -7,9 +7,8 @@ namespace Paramore.Brighter.AWSScheduler.Tests.Scheduler.Messages.Sns; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SNS")] -public class SnsSchedulingMessageTest : IDisposable +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) +public class SnsSchedulingMessageTest { private readonly ContentType _contentType = new ContentType(MediaTypeNames.Text.Plain); private const int BufferSize = 3; @@ -53,14 +52,14 @@ public SnsSchedulingMessageTest() _consumer.Purge(); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = true, MakeRole = OnMissingRole.Create }; } - [Fact] - public void When_Scheduling_A_Sns_Message() + [Test] + public async Task When_Scheduling_A_Sns_Message() { var routingKey = new RoutingKey(_topicName); var message = new Message( @@ -77,15 +76,15 @@ public void When_Scheduling_A_Sns_Message() var stopAt = DateTimeOffset.UtcNow.AddMinutes(2); while (stopAt > DateTimeOffset.UtcNow) { - var messages = _consumer.Receive(); - Assert.Single(messages); + var messages = await _consumer.ReceiveAsync(); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(message.Header.MessageType, messages[0].Header.MessageType); - Assert.Equal((string?)message.Body.Value, (string?)messages[0].Body.Value); - Assert.Equivalent(message.Header, messages[0].Header); - _consumer.Acknowledge(messages[0]); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That((string?)messages[0].Body.Value).IsEqualTo((string?)message.Body.Value); + await Assert.That(messages[0].Header).IsEquivalentTo(message.Header); + await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -95,11 +94,14 @@ public void When_Scheduling_A_Sns_Message() Assert.Fail("The message wasn't fired"); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _channelFactory.DeleteTopicAsync().GetAwaiter().GetResult(); - _messageProducer.Dispose(); - _consumer.Dispose(); + await _channelFactory.DeleteQueueAsync(); + await _channelFactory.DeleteTopicAsync(); + await _messageProducer.DisposeAsync(); + await _consumer.DisposeAsync(); } } + + diff --git a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Async.cs b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Async.cs index 0d463d96e7..06574ddef4 100644 --- a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Async.cs +++ b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Async.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using Paramore.Brighter.AWSScheduler.Tests.Helpers; using Paramore.Brighter.AWSScheduler.Tests.TestDoubles; using Paramore.Brighter.MessageScheduler.AWS; @@ -7,60 +7,65 @@ namespace Paramore.Brighter.AWSScheduler.Tests.Scheduler.Messages.Sns; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 minutes per test) -[Collection("Scheduler SNS")] +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 minutes per test) public class SnsSchedulingAsyncMessageTest : IAsyncDisposable { private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; - private readonly SnsMessageProducer _messageProducer; - private readonly SqsMessageConsumer _consumer; + private SnsMessageProducer _messageProducer; + private SqsMessageConsumer _consumer; private readonly string _topicName; private readonly ChannelFactory _channelFactory; - private readonly IAmAMessageSchedulerFactory _factory; + private IAmAMessageSchedulerFactory _factory; + private readonly AWSMessagingGatewayConnection _awsConnection; public SnsSchedulingAsyncMessageTest() { - var awsConnection = GatewayFactory.CreateFactory(); + _awsConnection = GatewayFactory.CreateFactory(); - _channelFactory = new ChannelFactory(awsConnection); - //we need the channel to create the queues and notifications + _channelFactory = new ChannelFactory(_awsConnection); _topicName = $"Producer-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); + } + + [Before(Test)] + public async Task Setup() + { + //we need the channel to create the queues and notifications var channelName = $"Producer-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); var routingKey = new RoutingKey(_topicName); - var channel = _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( + var channel = await _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( subscriptionName: new SubscriptionName(channelName), channelName: new ChannelName(channelName), routingKey: routingKey, bufferSize: BufferSize, makeChannels: OnMissingChannel.Create, queueAttributes: new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }) - )).GetAwaiter().GetResult(); + )); //we want to access via a consumer, to receive multiple messages - we don't want to expose on channel //just for the tests, so create a new consumer from the properties - _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName(), BufferSize); - _messageProducer = new SnsMessageProducer(awsConnection, + _consumer = new SqsMessageConsumer(_awsConnection, channel.Name.ToValidSQSQueueName(), BufferSize); + _messageProducer = new SnsMessageProducer(_awsConnection, new SnsPublication { MakeChannels = OnMissingChannel.Create, TopicAttributes = new SnsAttributes(tags: [new Tag { Key = "Environment", Value = "Test" }]) }); // Enforce topic to be created - _messageProducer.SendAsync(new Message( + await _messageProducer.SendAsync(new Message( new MessageHeader(Guid.NewGuid().ToString(), routingKey, MessageType.MT_COMMAND, correlationId: Guid.NewGuid().ToString(), contentType: _contentType), new MessageBody("test content one") - )).GetAwaiter().GetResult(); + )); - _consumer.Purge(); + await _consumer.PurgeAsync(); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(_awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = true, MakeRole = OnMissingRole.Create }; } - [Fact] + [Test] public async Task When_Scheduling_A_Sns_Message_Async() { var routingKey = new RoutingKey(_topicName); @@ -77,12 +82,12 @@ public async Task When_Scheduling_A_Sns_Message_Async() while (stopAt > DateTimeOffset.UtcNow) { var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal((string?)message.Body.Value, (string?)messages[0].Body.Value); - Assert.Equivalent(message.Header, messages[0].Header); + await Assert.That((string?)messages[0].Body.Value).IsEqualTo((string?)message.Body.Value); + await Assert.That(messages[0].Header).IsEquivalentTo(message.Header); await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -101,3 +106,5 @@ public async ValueTask DisposeAsync() await _consumer.DisposeAsync(); } } + + diff --git a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Via_FireScheduler.cs b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Via_FireScheduler.cs index 701784ab69..b56e7e4afa 100644 --- a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Via_FireScheduler.cs +++ b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Via_FireScheduler.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using System.Text.Json; using Paramore.Brighter.AWSScheduler.Tests.Helpers; using Paramore.Brighter.JsonConverters; @@ -9,9 +9,8 @@ namespace Paramore.Brighter.AWSScheduler.Tests.Scheduler.Messages.Sns; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SNS")] -public class SnsSchedulingMessageViaFireSchedulerTest : IDisposable +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) +public class SnsSchedulingMessageViaFireSchedulerTest { private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; @@ -54,14 +53,14 @@ public SnsSchedulingMessageViaFireSchedulerTest() )); _consumer.Purge(); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = false, MakeRole = OnMissingRole.Create, SchedulerTopicOrQueue = routingKey }; } - [Fact] - public void When_Scheduling_A_Sns_Message_With_Delay_Via_FireScheduler() + [Test] + public async Task When_Scheduling_A_Sns_Message_With_Delay_Via_FireScheduler() { var routingKey = new RoutingKey(_topicName); var message = new Message( @@ -78,19 +77,19 @@ public void When_Scheduling_A_Sns_Message_With_Delay_Via_FireScheduler() var stopAt = DateTimeOffset.UtcNow.AddMinutes(2); while (stopAt > DateTimeOffset.UtcNow) { - var messages = _consumer.Receive(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True(Enumerable.Any(messages[0].Body.Value)); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(Enumerable.Any(messages[0].Body.Value)).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equivalent(message, m.Message); - Assert.False((bool)m.Async); - _consumer.Acknowledge(messages[0]); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.Message).IsEquivalentTo(message); + await Assert.That((bool)m.Async).IsFalse(); + await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -100,11 +99,14 @@ public void When_Scheduling_A_Sns_Message_With_Delay_Via_FireScheduler() Assert.Fail("The message wasn't fired"); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _channelFactory.DeleteTopicAsync().GetAwaiter().GetResult(); - _messageProducer.Dispose(); - _consumer.Dispose(); + await _channelFactory.DeleteQueueAsync(); + await _channelFactory.DeleteTopicAsync(); + await _messageProducer.DisposeAsync(); + await _consumer.DisposeAsync(); } } + + diff --git a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Via_FireScheduler_Async.cs b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Via_FireScheduler_Async.cs index b897a9ac3c..d8ede0e36d 100644 --- a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Via_FireScheduler_Async.cs +++ b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Via_FireScheduler_Async.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using System.Text.Json; using Paramore.Brighter.AWSScheduler.Tests.Helpers; using Paramore.Brighter.JsonConverters; @@ -9,9 +9,8 @@ namespace Paramore.Brighter.AWSScheduler.Tests.Scheduler.Messages.Sns; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SNS")] -public class SnsSchedulingMessageViaFireSchedulerAsyncTest : IDisposable +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) +public class SnsSchedulingMessageViaFireSchedulerAsyncTest { private readonly ContentType _contentType = new( MediaTypeNames.Text.Plain); private const int BufferSize = 3; @@ -54,13 +53,13 @@ public SnsSchedulingMessageViaFireSchedulerAsyncTest() )); _consumer.Purge(); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = false, MakeRole = OnMissingRole.Create, SchedulerTopicOrQueue = routingKey }; } - [Fact] + [Test] public async Task When_Scheduling_A_Sns_Message_Async() { var routingKey = new RoutingKey(_topicName); @@ -79,17 +78,17 @@ public async Task When_Scheduling_A_Sns_Message_Async() while (stopAt > DateTimeOffset.UtcNow) { var messages = await _consumer.ReceiveAsync(); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True(Enumerable.Any(messages[0].Body.Value)); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(Enumerable.Any(messages[0].Body.Value)).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equivalent(message, m.Message); - Assert.True((bool)m.Async); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.Message).IsEquivalentTo(message); + await Assert.That((bool)m.Async).IsTrue(); await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -100,11 +99,14 @@ public async Task When_Scheduling_A_Sns_Message_Async() Assert.Fail("The message wasn't fired"); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _channelFactory.DeleteTopicAsync().GetAwaiter().GetResult(); - _messageProducer.Dispose(); - _consumer.Dispose(); + await _channelFactory.DeleteQueueAsync(); + await _channelFactory.DeleteTopicAsync(); + await _messageProducer.DisposeAsync(); + await _consumer.DisposeAsync(); } } + + diff --git a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message.cs b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message.cs index fd82304378..4f44f4a11f 100644 --- a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message.cs +++ b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using Paramore.Brighter.AWSScheduler.Tests.Helpers; using Paramore.Brighter.AWSScheduler.Tests.TestDoubles; using Paramore.Brighter.MessageScheduler.AWS; @@ -6,9 +6,8 @@ namespace Paramore.Brighter.AWSScheduler.Tests.Scheduler.Messages.Sqs; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SQS")] -public class SqsSchedulingMessageTest : IDisposable +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) +public class SqsSchedulingMessageTest { private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; @@ -41,15 +40,15 @@ public SqsSchedulingMessageTest() _messageProducer = new SqsMessageProducer(awsConnection, new SqsPublication { MakeChannels = OnMissingChannel.Create, QueueAttributes = new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }) }); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = true, MakeRole = OnMissingRole.Create }; } - [Fact] - public void When_Scheduling_A_Sqs_Message() + [Test] + public async Task When_Scheduling_A_Sqs_Message() { var routingKey = new RoutingKey(_queueName); var message = new Message( @@ -66,14 +65,14 @@ public void When_Scheduling_A_Sqs_Message() var stopAt = DateTimeOffset.UtcNow.AddMinutes(2); while (stopAt > DateTimeOffset.UtcNow) { - var messages = _consumer.Receive(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal((string?)message.Body.Value, (string?)messages[0].Body.Value); - Assert.Equivalent(message.Header, messages[0].Header); - _consumer.Acknowledge(messages[0]); + await Assert.That((string?)messages[0].Body.Value).IsEqualTo((string?)message.Body.Value); + await Assert.That(messages[0].Header).IsEquivalentTo(message.Header); + await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -83,10 +82,13 @@ public void When_Scheduling_A_Sqs_Message() Assert.Fail("The message wasn't fired"); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _messageProducer.Dispose(); - _consumer.Dispose(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); + await _consumer.DisposeAsync(); } } + + diff --git a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Async.cs b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Async.cs index bbbcf3a85e..cd08e0f0d6 100644 --- a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Async.cs +++ b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Async.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using Paramore.Brighter.AWSScheduler.Tests.Helpers; using Paramore.Brighter.AWSScheduler.Tests.TestDoubles; using Paramore.Brighter.MessageScheduler.AWS; @@ -6,48 +6,53 @@ namespace Paramore.Brighter.AWSScheduler.Tests.Scheduler.Messages.Sqs; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SQS")] +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) public class SqsSchedulingAsyncMessageTest : IAsyncDisposable { private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; - private readonly SqsMessageProducer _messageProducer; - private readonly SqsMessageConsumer _consumer; + private SqsMessageProducer _messageProducer; + private SqsMessageConsumer _consumer; private readonly string _queueName; private readonly ChannelFactory _channelFactory; - private readonly IAmAMessageSchedulerFactory _factory; + private IAmAMessageSchedulerFactory _factory; + private readonly AWSMessagingGatewayConnection _awsConnection; public SqsSchedulingAsyncMessageTest() { - var awsConnection = GatewayFactory.CreateFactory(); + _awsConnection = GatewayFactory.CreateFactory(); - _channelFactory = new ChannelFactory(awsConnection); - var subscriptionName = $"Buffered-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); + _channelFactory = new ChannelFactory(_awsConnection); _queueName = $"Buffered-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); + } + + [Before(Test)] + public async Task Setup() + { + var subscriptionName = $"Buffered-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); //we need the channel to create the queues and notifications var routingKey = new RoutingKey(_queueName); - var channel = _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( + var channel = await _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( subscriptionName: new SubscriptionName(subscriptionName), channelName: new ChannelName(_queueName), channelType: ChannelType.PointToPoint, routingKey: routingKey, bufferSize: BufferSize, makeChannels: OnMissingChannel.Create, - queueAttributes: new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }))).GetAwaiter().GetResult(); + queueAttributes: new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }))); //we want to access via a consumer, to receive multiple messages - we don't want to expose on channel //just for the tests, so create a new consumer from the properties - _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName(), BufferSize); - _messageProducer = new SqsMessageProducer(awsConnection, + _consumer = new SqsMessageConsumer(_awsConnection, channel.Name.ToValidSQSQueueName(), BufferSize); + _messageProducer = new SqsMessageProducer(_awsConnection, new SqsPublication { MakeChannels = OnMissingChannel.Create, QueueAttributes = new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }) }); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(_awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = true }; } - [Fact] + [Test] public async Task When_Scheduling_A_Sqs_Message_Async() { var routingKey = new RoutingKey(_queueName); @@ -66,12 +71,12 @@ public async Task When_Scheduling_A_Sqs_Message_Async() while (stopAt > DateTimeOffset.UtcNow) { var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal((string?)message.Body.Value, (string?)messages[0].Body.Value); - Assert.Equivalent(message.Header, messages[0].Header); + await Assert.That((string?)messages[0].Body.Value).IsEqualTo((string?)message.Body.Value); + await Assert.That(messages[0].Header).IsEquivalentTo(message.Header); await _consumer.AcknowledgeAsync(messages[0]); return; } diff --git a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Via_FireScheduler.cs b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Via_FireScheduler.cs index fea42f40b3..697c197c4c 100644 --- a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Via_FireScheduler.cs +++ b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Via_FireScheduler.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using System.Text.Json; using Paramore.Brighter.AWSScheduler.Tests.Helpers; using Paramore.Brighter.AWSScheduler.Tests.TestDoubles; @@ -8,9 +8,8 @@ namespace Paramore.Brighter.AWSScheduler.Tests.Scheduler.Messages.Sqs; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SQS")] -public class SqsSchedulingMessageViaFireSchedulerTest : IDisposable +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) +public class SqsSchedulingMessageViaFireSchedulerTest { private readonly ContentType _contentType = new (MediaTypeNames.Text.Plain); private const int BufferSize = 3; @@ -43,7 +42,7 @@ public SqsSchedulingMessageViaFireSchedulerTest() _messageProducer = new SqsMessageProducer(awsConnection, new SqsPublication { MakeChannels = OnMissingChannel.Create, QueueAttributes = new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }) }); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = false, MakeRole = OnMissingRole.Create, @@ -51,8 +50,8 @@ public SqsSchedulingMessageViaFireSchedulerTest() }; } - [Fact] - public void When_Scheduling_A_Sqs_Message_Via_FireScheduler() + [Test] + public async Task When_Scheduling_A_Sqs_Message_Via_FireScheduler() { var routingKey = new RoutingKey(_queueName); var message = new Message( @@ -69,19 +68,19 @@ public void When_Scheduling_A_Sqs_Message_Via_FireScheduler() var stopAt = DateTimeOffset.UtcNow.AddMinutes(2); while (stopAt > DateTimeOffset.UtcNow) { - var messages = _consumer.Receive(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True(Enumerable.Any(messages[0].Body.Value)); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(Enumerable.Any(messages[0].Body.Value)).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equivalent(message, m.Message); - Assert.False((bool)m.Async); - _consumer.Acknowledge(messages[0]); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.Message).IsEquivalentTo(message); + await Assert.That((bool)m.Async).IsFalse(); + await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -91,10 +90,13 @@ public void When_Scheduling_A_Sqs_Message_Via_FireScheduler() Assert.Fail("The message wasn't fired"); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _messageProducer.Dispose(); - _consumer.Dispose(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); + await _consumer.DisposeAsync(); } } + + diff --git a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Via_FireScheduler_Async.cs b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Via_FireScheduler_Async.cs index 47242b271e..2ab4a10180 100644 --- a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Via_FireScheduler_Async.cs +++ b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Via_FireScheduler_Async.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using System.Text.Json; using Paramore.Brighter.AWSScheduler.Tests.Helpers; using Paramore.Brighter.AWSScheduler.Tests.TestDoubles; @@ -8,50 +8,55 @@ namespace Paramore.Brighter.AWSScheduler.Tests.Scheduler.Messages.Sqs; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SQS")] +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) public class SqsSchedulingAsyncMessageViaFireSchedulerTest : IAsyncDisposable { private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; - private readonly SqsMessageProducer _messageProducer; - private readonly SqsMessageConsumer _consumer; + private SqsMessageProducer _messageProducer; + private SqsMessageConsumer _consumer; private readonly string _queueName; private readonly ChannelFactory _channelFactory; - private readonly IAmAMessageSchedulerFactory _factory; + private IAmAMessageSchedulerFactory _factory; + private readonly AWSMessagingGatewayConnection _awsConnection; public SqsSchedulingAsyncMessageViaFireSchedulerTest() { - var awsConnection = GatewayFactory.CreateFactory(); + _awsConnection = GatewayFactory.CreateFactory(); - _channelFactory = new ChannelFactory(awsConnection); - var subscriptionName = $"Buffered-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); + _channelFactory = new ChannelFactory(_awsConnection); _queueName = $"Buffered-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); + } + + [Before(Test)] + public async Task Setup() + { + var subscriptionName = $"Buffered-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); //we need the channel to create the queues and notifications var routingKey = new RoutingKey(_queueName); - var channel = _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( + var channel = await _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( subscriptionName: new SubscriptionName(subscriptionName), channelName: new ChannelName(_queueName), channelType: ChannelType.PointToPoint, routingKey: routingKey, bufferSize: BufferSize, makeChannels: OnMissingChannel.Create, - queueAttributes: new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }))).GetAwaiter().GetResult(); + queueAttributes: new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }))); //we want to access via a consumer, to receive multiple messages - we don't want to expose on channel //just for the tests, so create a new consumer from the properties - _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName(), BufferSize); - _messageProducer = new SqsMessageProducer(awsConnection, + _consumer = new SqsMessageConsumer(_awsConnection, channel.Name.ToValidSQSQueueName(), BufferSize); + _messageProducer = new SqsMessageProducer(_awsConnection, new SqsPublication { MakeChannels = OnMissingChannel.Create, QueueAttributes = new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }) }); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(_awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = false, - MakeRole = OnMissingRole.Create, + MakeRole = OnMissingRole.Create, SchedulerTopicOrQueue = routingKey }; } - [Fact] + [Test] public async Task When_Scheduling_A_Sqs_Message_Via_FireScheduler_Async() { var routingKey = new RoutingKey(_queueName); @@ -70,17 +75,17 @@ public async Task When_Scheduling_A_Sqs_Message_Via_FireScheduler_Async() while (stopAt > DateTimeOffset.UtcNow) { var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True(Enumerable.Any(messages[0].Body.Value)); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(Enumerable.Any(messages[0].Body.Value)).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equivalent(message, m.Message); - Assert.True((bool)m.Async); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.Message).IsEquivalentTo(message); + await Assert.That((bool)m.Async).IsTrue(); await _consumer.AcknowledgeAsync(messages[0]); return; } diff --git a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Requests/Sns/When_Scheduling_A_Sns_Request.cs b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Requests/Sns/When_Scheduling_A_Sns_Request.cs index 100dbc67c1..97f48f540e 100644 --- a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Requests/Sns/When_Scheduling_A_Sns_Request.cs +++ b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Requests/Sns/When_Scheduling_A_Sns_Request.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using System.Text.Json; using Amazon.Scheduler; using Amazon.Scheduler.Model; @@ -12,9 +12,8 @@ namespace Paramore.Brighter.AWSScheduler.Tests.Scheduler.Requests.Sns; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SNS")] -public class SnsSchedulingMessageViaFireSchedulerRequestTest : IDisposable +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) +public class SnsSchedulingMessageViaFireSchedulerRequestTest { private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; @@ -59,46 +58,46 @@ public SnsSchedulingMessageViaFireSchedulerRequestTest() _scheduler = new AWSClientFactory(awsConnection).CreateSchedulerClient(); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = false, MakeRole = OnMissingRole.Create, SchedulerTopicOrQueue = routingKey }; } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Scheduling_A_Sns_Request_With_Delay(RequestSchedulerType schedulerType) { var command = new MyCommand(); var scheduler = _factory.CreateSync(null!); var id = scheduler.Schedule(command, schedulerType, TimeSpan.FromMinutes(1)); - Assert.True(Enumerable.Any(id)); + await Assert.That(Enumerable.Any(id)).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); await Task.Delay(TimeSpan.FromMinutes(1)); var stopAt = DateTimeOffset.UtcNow.AddMinutes(2); while (stopAt > DateTimeOffset.UtcNow) { - var messages = _consumer.Receive(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True((bool?)(messages[0].Body.Value)?.Any()); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That((bool?)(messages[0].Body.Value)?.Any()).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equal(schedulerType, m.SchedulerType); - Assert.Equal(typeof(MyCommand).FullName, (string?)m.RequestType); - Assert.False((bool)m.Async); - _consumer.Acknowledge(messages[0]); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.SchedulerType).IsEqualTo(schedulerType); + await Assert.That((string?)m.RequestType).IsEqualTo(typeof(MyCommand).FullName); + await Assert.That((bool)m.Async).IsFalse(); + await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -108,10 +107,10 @@ public async Task When_Scheduling_A_Sns_Request_With_Delay(RequestSchedulerType Assert.Fail("The message wasn't fired"); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Scheduling_A_Sns_Request_With_SpecificDateTime(RequestSchedulerType schedulerType) { var command = new MyCommand(); @@ -120,26 +119,26 @@ public async Task When_Scheduling_A_Sns_Request_With_SpecificDateTime(RequestSch var id = scheduler.Schedule(command, schedulerType, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(1))); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); var stopAt = DateTimeOffset.UtcNow.AddMinutes(2); while (stopAt > DateTimeOffset.UtcNow) { - var messages = _consumer.Receive(TimeSpan.FromMinutes(1)); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True((bool?)(messages[0].Body.Value)?.Any()); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That((bool?)(messages[0].Body.Value)?.Any()).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equal(schedulerType, m.SchedulerType); - Assert.Equal(typeof(MyCommand).FullName, (string?)m.RequestType); - Assert.False((bool)m.Async); - _consumer.Acknowledge(messages[0]); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.SchedulerType).IsEqualTo(schedulerType); + await Assert.That((string?)m.RequestType).IsEqualTo(typeof(MyCommand).FullName); + await Assert.That((bool)m.Async).IsFalse(); + await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -149,93 +148,96 @@ public async Task When_Scheduling_A_Sns_Request_With_SpecificDateTime(RequestSch Assert.Fail("The message wasn't fired"); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Rescheduling_A_Sns_Request_With_Delay(RequestSchedulerType schedulerType) { var command = new MyCommand(); var scheduler = _factory.CreateSync(null!); var id = scheduler.Schedule(command, schedulerType, TimeSpan.FromMinutes(1)); - Assert.True((bool?)(id)?.Any()); + await Assert.That((bool?)(id)?.Any()).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); - Assert.True((bool)scheduler.ReScheduler(id, TimeSpan.FromMinutes(2))); + await Assert.That((bool)scheduler.ReScheduler(id, TimeSpan.FromMinutes(2))).IsTrue(); var awsReScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsReScheduler); - Assert.NotEqual(awsScheduler.ScheduleExpression, awsReScheduler.ScheduleExpression); + await Assert.That(awsReScheduler).IsNotNull(); + await Assert.That(awsReScheduler.ScheduleExpression).IsNotEqualTo(awsScheduler.ScheduleExpression); await _scheduler.DeleteScheduleAsync(new DeleteScheduleRequest { Name = id }); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Rescheduling_A_Sns_Request_With_SpecificDateTimeOffset(RequestSchedulerType schedulerType) { var command = new MyCommand(); var scheduler = _factory.CreateSync(null!); var id = scheduler.Schedule(command, schedulerType, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(1))); - Assert.True((bool?)(id)?.Any()); + await Assert.That((bool?)(id)?.Any()).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); - Assert.True((bool)scheduler.ReScheduler(id, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(2)))); + await Assert.That((bool)scheduler.ReScheduler(id, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(2)))).IsTrue(); var awsReScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsReScheduler); - Assert.NotEqual(awsScheduler.ScheduleExpression, awsReScheduler.ScheduleExpression); + await Assert.That(awsReScheduler).IsNotNull(); + await Assert.That(awsReScheduler.ScheduleExpression).IsNotEqualTo(awsScheduler.ScheduleExpression); await _scheduler.DeleteScheduleAsync(new DeleteScheduleRequest { Name = id }); } - [Fact] - public void When_Rescheduling_A_Sns_Request_That_Not_Exists() + [Test] + public async Task When_Rescheduling_A_Sns_Request_That_Not_Exists() { var scheduler = _factory.CreateSync(null!); - Assert.False((bool)scheduler.ReScheduler(Guid.NewGuid().ToString("N"), DateTimeOffset.UtcNow.AddHours(1))); + await Assert.That((bool)scheduler.ReScheduler(Guid.NewGuid().ToString("N"), DateTimeOffset.UtcNow.AddHours(1))).IsFalse(); - Assert.False((bool)scheduler.ReScheduler(Guid.NewGuid().ToString("N"), TimeSpan.FromMinutes(1))); + await Assert.That((bool)scheduler.ReScheduler(Guid.NewGuid().ToString("N"), TimeSpan.FromMinutes(1))).IsFalse(); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Cancel_A_Sns_Request(RequestSchedulerType schedulerType) { var command = new MyCommand(); var scheduler = _factory.CreateSync(null!); var id = scheduler.Schedule(command, schedulerType, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(1))); - Assert.True((bool?)(id)?.Any()); + await Assert.That((bool?)(id)?.Any()).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); scheduler.Cancel(id); var ex = await Catch.ExceptionAsync(async () => await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id })); - Assert.NotNull(ex); - Assert.True((ex) is ResourceNotFoundException); + await Assert.That(ex).IsNotNull(); + await Assert.That((ex) is ResourceNotFoundException).IsTrue(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _channelFactory.DeleteTopicAsync().GetAwaiter().GetResult(); - _messageProducer.Dispose(); - _consumer.Dispose(); + await _channelFactory.DeleteQueueAsync(); + await _channelFactory.DeleteTopicAsync(); + await _messageProducer.DisposeAsync(); + await _consumer.DisposeAsync(); _scheduler.Dispose(); } } + + diff --git a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Requests/Sns/When_Scheduling_A_Sns_Request_Async.cs b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Requests/Sns/When_Scheduling_A_Sns_Request_Async.cs index 4e4530a0ee..77486e9194 100644 --- a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Requests/Sns/When_Scheduling_A_Sns_Request_Async.cs +++ b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Requests/Sns/When_Scheduling_A_Sns_Request_Async.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using System.Text.Json; using Amazon.Scheduler; using Amazon.Scheduler.Model; @@ -12,9 +12,8 @@ namespace Paramore.Brighter.AWSScheduler.Tests.Scheduler.Requests.Sns; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SNS")] -public class SnsSchedulingRequestAsyncTest : IDisposable +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) +public class SnsSchedulingRequestAsyncTest { private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; @@ -59,26 +58,26 @@ public SnsSchedulingRequestAsyncTest() _scheduler = new AWSClientFactory(awsConnection).CreateSchedulerClient(); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = false, MakeRole = OnMissingRole.Create, SchedulerTopicOrQueue = routingKey }; } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Scheduling_A_Sns_Request_With_Delay_Async(RequestSchedulerType schedulerType) { var command = new MyCommand(); var scheduler = _factory.CreateAsync(null!); var id = await scheduler.ScheduleAsync(command, schedulerType, TimeSpan.FromMinutes(1)); - Assert.True(Enumerable.Any(id)); + await Assert.That(Enumerable.Any(id)).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); await Task.Delay(TimeSpan.FromMinutes(1)); @@ -86,18 +85,18 @@ public async Task When_Scheduling_A_Sns_Request_With_Delay_Async(RequestSchedule while (stopAt > DateTimeOffset.UtcNow) { var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True((bool?)(messages[0].Body.Value)?.Any()); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That((bool?)(messages[0].Body.Value)?.Any()).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equal(schedulerType, m.SchedulerType); - Assert.Equal(typeof(MyCommand).FullName, (string?)m.RequestType); - Assert.True((bool)m.Async); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.SchedulerType).IsEqualTo(schedulerType); + await Assert.That((string?)m.RequestType).IsEqualTo(typeof(MyCommand).FullName); + await Assert.That((bool)m.Async).IsTrue(); await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -108,10 +107,10 @@ public async Task When_Scheduling_A_Sns_Request_With_Delay_Async(RequestSchedule Assert.Fail("The message wasn't fired"); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Scheduling_A_Sns_Request_With_SpecificDateTimeOffset_Async( RequestSchedulerType schedulerType) { @@ -122,24 +121,24 @@ public async Task When_Scheduling_A_Sns_Request_With_SpecificDateTimeOffset_Asyn DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(1))); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); var stopAt = DateTimeOffset.UtcNow.AddMinutes(2); while (stopAt > DateTimeOffset.UtcNow) { var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True((bool?)(messages[0].Body.Value)?.Any()); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That((bool?)(messages[0].Body.Value)?.Any()).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equal(schedulerType, m.SchedulerType); - Assert.Equal(typeof(MyCommand).FullName, (string?)m.RequestType); - Assert.True((bool)m.Async); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.SchedulerType).IsEqualTo(schedulerType); + await Assert.That((string?)m.RequestType).IsEqualTo(typeof(MyCommand).FullName); + await Assert.That((bool)m.Async).IsTrue(); await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -150,34 +149,34 @@ public async Task When_Scheduling_A_Sns_Request_With_SpecificDateTimeOffset_Asyn Assert.Fail("The message wasn't fired"); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Rescheduling_A_Sns_Request_With_Delay_Async(RequestSchedulerType schedulerType) { var command = new MyCommand(); var scheduler = _factory.CreateAsync(null!); var id = await scheduler.ScheduleAsync(command, schedulerType, TimeSpan.FromMinutes(1)); - Assert.True(Enumerable.Any(id)); + await Assert.That(Enumerable.Any(id)).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); - Assert.True((bool)(await scheduler.ReSchedulerAsync(id, TimeSpan.FromMinutes(2)))); + await Assert.That((bool)(await scheduler.ReSchedulerAsync(id, TimeSpan.FromMinutes(2)))).IsTrue(); var awsReScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsReScheduler); - Assert.NotEqual(awsScheduler.ScheduleExpression, awsReScheduler.ScheduleExpression); + await Assert.That(awsReScheduler).IsNotNull(); + await Assert.That(awsReScheduler.ScheduleExpression).IsNotEqualTo(awsScheduler.ScheduleExpression); await _scheduler.DeleteScheduleAsync(new DeleteScheduleRequest { Name = id }); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Rescheduling_A_Sns_Request_With_SpecificDateTimeOffset_Async( RequestSchedulerType schedulerType) { @@ -186,33 +185,33 @@ public async Task When_Rescheduling_A_Sns_Request_With_SpecificDateTimeOffset_As var scheduler = _factory.CreateAsync(null!); var id = await scheduler.ScheduleAsync(command, schedulerType, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(1))); - Assert.True((bool?)(id)?.Any()); + await Assert.That((bool?)(id)?.Any()).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); - Assert.True((bool)(await scheduler.ReSchedulerAsync(id, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(2))))); + await Assert.That((bool)(await scheduler.ReSchedulerAsync(id, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(2))))).IsTrue(); var awsReScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsReScheduler); - Assert.NotEqual(awsScheduler.ScheduleExpression, awsReScheduler.ScheduleExpression); + await Assert.That(awsReScheduler).IsNotNull(); + await Assert.That(awsReScheduler.ScheduleExpression).IsNotEqualTo(awsScheduler.ScheduleExpression); await _scheduler.DeleteScheduleAsync(new DeleteScheduleRequest { Name = id }); } - [Fact] + [Test] public async Task When_Rescheduling_A_Sns_Request_That_Not_Exists_Async() { var scheduler = _factory.CreateAsync(null!); - Assert.False((bool)(await scheduler.ReSchedulerAsync(Guid.NewGuid().ToString("N"), DateTimeOffset.UtcNow.AddHours(1)))); + await Assert.That((bool)(await scheduler.ReSchedulerAsync(Guid.NewGuid().ToString("N"), DateTimeOffset.UtcNow.AddHours(1)))).IsFalse(); - Assert.False((bool)(await scheduler.ReSchedulerAsync(Guid.NewGuid().ToString("N"), TimeSpan.FromMinutes(1)))); + await Assert.That((bool)(await scheduler.ReSchedulerAsync(Guid.NewGuid().ToString("N"), TimeSpan.FromMinutes(1)))).IsFalse(); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Cancel_A_Sns_Request_Async(RequestSchedulerType schedulerType) { var command = new MyCommand(); @@ -220,26 +219,29 @@ public async Task When_Cancel_A_Sns_Request_Async(RequestSchedulerType scheduler var scheduler = _factory.CreateAsync(null!); var id = await scheduler.ScheduleAsync(command, schedulerType, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(1))); - Assert.True((bool?)(id)?.Any()); + await Assert.That((bool?)(id)?.Any()).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); await scheduler.CancelAsync(id); var ex = await Catch.ExceptionAsync(async () => await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id })); - Assert.NotNull(ex); - Assert.True((ex) is ResourceNotFoundException); + await Assert.That(ex).IsNotNull(); + await Assert.That((ex) is ResourceNotFoundException).IsTrue(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _channelFactory.DeleteTopicAsync().GetAwaiter().GetResult(); - _messageProducer.Dispose(); - _consumer.Dispose(); + await _channelFactory.DeleteQueueAsync(); + await _channelFactory.DeleteTopicAsync(); + await _messageProducer.DisposeAsync(); + await _consumer.DisposeAsync(); _scheduler.Dispose(); } } + + diff --git a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Requests/Sqs/When_Scheduling_A_Sqs_Request.cs b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Requests/Sqs/When_Scheduling_A_Sqs_Request.cs index 210b2c3bdb..81221dff8b 100644 --- a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Requests/Sqs/When_Scheduling_A_Sqs_Request.cs +++ b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Requests/Sqs/When_Scheduling_A_Sqs_Request.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using Amazon.Scheduler; using Amazon.Scheduler.Model; using Paramore.Brighter.AWSScheduler.Tests.Helpers; @@ -9,9 +9,8 @@ namespace Paramore.Brighter.AWSScheduler.Tests.Scheduler.Requests.Sqs; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SQS")] -public class SqsSchedulingRequestTest : IDisposable +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) +public class SqsSchedulingRequestTest { private const int BufferSize = 3; private readonly SqsMessageProducer _messageProducer; @@ -46,26 +45,26 @@ public SqsSchedulingRequestTest() _scheduler = new AWSClientFactory(awsConnection).CreateSchedulerClient(); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = false, MakeRole = OnMissingRole.Create, SchedulerTopicOrQueue = routingKey }; } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Scheduling_A_Sqs_Request_With_Delay_Async(RequestSchedulerType schedulerType) { var command = new MyCommand(); var scheduler = _factory.CreateAsync(null!); var id = await scheduler.ScheduleAsync(command, schedulerType, TimeSpan.FromMinutes(1)); - Assert.True(Enumerable.Any(id)); + await Assert.That(Enumerable.Any(id)).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); await Task.Delay(TimeSpan.FromMinutes(1)); @@ -73,18 +72,18 @@ public async Task When_Scheduling_A_Sqs_Request_With_Delay_Async(RequestSchedule while (stopAt > DateTimeOffset.UtcNow) { var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True((bool?)(messages[0].Body.Value)?.Any()); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That((bool?)(messages[0].Body.Value)?.Any()).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equal(schedulerType, m.SchedulerType); - Assert.Equal(typeof(MyCommand).FullName, (string?)m.RequestType); - Assert.True((bool)m.Async); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.SchedulerType).IsEqualTo(schedulerType); + await Assert.That((string?)m.RequestType).IsEqualTo(typeof(MyCommand).FullName); + await Assert.That((bool)m.Async).IsTrue(); await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -95,10 +94,10 @@ public async Task When_Scheduling_A_Sqs_Request_With_Delay_Async(RequestSchedule Assert.Fail("The message wasn't fired"); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Scheduling_A_Sqs_Request_With_SpecificDateTimeOffset_Async( RequestSchedulerType schedulerType) { @@ -109,24 +108,24 @@ public async Task When_Scheduling_A_Sqs_Request_With_SpecificDateTimeOffset_Asyn DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(1))); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); var stopAt = DateTimeOffset.UtcNow.AddMinutes(2); while (stopAt > DateTimeOffset.UtcNow) { var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True((bool?)(messages[0].Body.Value)?.Any()); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That((bool?)(messages[0].Body.Value)?.Any()).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equal(schedulerType, m.SchedulerType); - Assert.Equal(typeof(MyCommand).FullName, (string?)m.RequestType); - Assert.True((bool)m.Async); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.SchedulerType).IsEqualTo(schedulerType); + await Assert.That((string?)m.RequestType).IsEqualTo(typeof(MyCommand).FullName); + await Assert.That((bool)m.Async).IsTrue(); await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -137,34 +136,34 @@ public async Task When_Scheduling_A_Sqs_Request_With_SpecificDateTimeOffset_Asyn Assert.Fail("The message wasn't fired"); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Rescheduling_A_Sqs_Request_With_Delay_Async(RequestSchedulerType schedulerType) { var command = new MyCommand(); var scheduler = _factory.CreateAsync(null!); var id = await scheduler.ScheduleAsync(command, schedulerType, TimeSpan.FromMinutes(1)); - Assert.True(Enumerable.Any(id)); + await Assert.That(Enumerable.Any(id)).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); - Assert.True((bool)(await scheduler.ReSchedulerAsync(id, TimeSpan.FromMinutes(2)))); + await Assert.That((bool)(await scheduler.ReSchedulerAsync(id, TimeSpan.FromMinutes(2)))).IsTrue(); var awsReScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsReScheduler); - Assert.NotEqual(awsScheduler.ScheduleExpression, awsReScheduler.ScheduleExpression); + await Assert.That(awsReScheduler).IsNotNull(); + await Assert.That(awsReScheduler.ScheduleExpression).IsNotEqualTo(awsScheduler.ScheduleExpression); await _scheduler.DeleteScheduleAsync(new DeleteScheduleRequest { Name = id }); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Rescheduling_A_Sqs_Request_With_SpecificDateTimeOffset_Async( RequestSchedulerType schedulerType) { @@ -173,33 +172,33 @@ public async Task When_Rescheduling_A_Sqs_Request_With_SpecificDateTimeOffset_As var scheduler = _factory.CreateAsync(null!); var id = await scheduler.ScheduleAsync(command, schedulerType, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(1))); - Assert.True(Enumerable.Any(id)); + await Assert.That(Enumerable.Any(id)).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); - Assert.True((bool)(await scheduler.ReSchedulerAsync(id, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(2))))); + await Assert.That((bool)(await scheduler.ReSchedulerAsync(id, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(2))))).IsTrue(); var awsReScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsReScheduler); - Assert.NotEqual(awsScheduler.ScheduleExpression, awsReScheduler.ScheduleExpression); + await Assert.That(awsReScheduler).IsNotNull(); + await Assert.That(awsReScheduler.ScheduleExpression).IsNotEqualTo(awsScheduler.ScheduleExpression); await _scheduler.DeleteScheduleAsync(new DeleteScheduleRequest { Name = id }); } - [Fact] + [Test] public async Task When_Rescheduling_A_Sqs_Request_That_Not_Exists_Async() { var scheduler = _factory.CreateAsync(null!); - Assert.False((bool)(await scheduler.ReSchedulerAsync(Guid.NewGuid().ToString("N"), DateTimeOffset.UtcNow.AddHours(1)))); + await Assert.That((bool)(await scheduler.ReSchedulerAsync(Guid.NewGuid().ToString("N"), DateTimeOffset.UtcNow.AddHours(1)))).IsFalse(); - Assert.False((bool)(await scheduler.ReSchedulerAsync(Guid.NewGuid().ToString("N"), TimeSpan.FromMinutes(1)))); + await Assert.That((bool)(await scheduler.ReSchedulerAsync(Guid.NewGuid().ToString("N"), TimeSpan.FromMinutes(1)))).IsFalse(); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Cancel_A_Sqs_Request_Async(RequestSchedulerType schedulerType) { var command = new MyCommand(); @@ -207,26 +206,29 @@ public async Task When_Cancel_A_Sqs_Request_Async(RequestSchedulerType scheduler var scheduler = _factory.CreateAsync(null!); var id = await scheduler.ScheduleAsync(command, schedulerType, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(1))); - Assert.True((bool?)(id)?.Any()); + await Assert.That((bool?)(id)?.Any()).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); await scheduler.CancelAsync(id); var ex = await Catch.ExceptionAsync(async () => await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id })); - Assert.NotNull(ex); - Assert.True((ex) is ResourceNotFoundException); + await Assert.That(ex).IsNotNull(); + await Assert.That((ex) is ResourceNotFoundException).IsTrue(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _messageProducer.Dispose(); - _consumer.Dispose(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); + await _consumer.DisposeAsync(); _scheduler.Dispose(); } } + + diff --git a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Requests/Sqs/When_Scheduling_A_Sqs_Request_Async.cs b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Requests/Sqs/When_Scheduling_A_Sqs_Request_Async.cs index d426c83597..b60e70764f 100644 --- a/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Requests/Sqs/When_Scheduling_A_Sqs_Request_Async.cs +++ b/tests/Paramore.Brighter.AWSScheduler.Tests/Scheduler/Requests/Sqs/When_Scheduling_A_Sqs_Request_Async.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using System.Text.Json; using Amazon.Scheduler; using Paramore.Brighter.AWSScheduler.Tests.Helpers; @@ -9,26 +9,31 @@ namespace Paramore.Brighter.AWSScheduler.Tests.Scheduler.Requests.Sqs; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SQS")] +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) public class SqsSchedulingRequestAsyncTest : IAsyncDisposable { private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; - private readonly SqsMessageProducer _messageProducer; - private readonly SqsMessageConsumer _consumer; + private SqsMessageProducer _messageProducer; + private SqsMessageConsumer _consumer; private readonly string _queueName; private readonly ChannelFactory _channelFactory; - private readonly AwsSchedulerFactory _factory; - private readonly IAmazonScheduler _scheduler; + private AwsSchedulerFactory _factory; + private IAmazonScheduler _scheduler; + private readonly AWSMessagingGatewayConnection _awsConnection; public SqsSchedulingRequestAsyncTest() { - var awsConnection = GatewayFactory.CreateFactory(); + _awsConnection = GatewayFactory.CreateFactory(); - _channelFactory = new ChannelFactory(awsConnection); - var subscriptionName = $"Buffered-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); + _channelFactory = new ChannelFactory(_awsConnection); _queueName = $"Buffered-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); + } + + [Before(Test)] + public async Task Setup() + { + var subscriptionName = $"Buffered-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); //we need the channel to create the queues and notifications var routingKey = new RoutingKey(_queueName); @@ -39,30 +44,30 @@ public SqsSchedulingRequestAsyncTest() delaySeconds: TimeSpan.Zero, tags: new Dictionary { { "Environment", "Test" } } ); - - var channel = _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( + + var channel = await _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( subscriptionName: new SubscriptionName(subscriptionName), channelName: new ChannelName(_queueName), channelType: ChannelType.PointToPoint, - routingKey: routingKey, bufferSize: BufferSize, queueAttributes: sqsAttributes, makeChannels: OnMissingChannel.Create)).GetAwaiter().GetResult(); + routingKey: routingKey, bufferSize: BufferSize, queueAttributes: sqsAttributes, makeChannels: OnMissingChannel.Create)); //we want to access via a consumer, to receive multiple messages - we don't want to expose on channel //just for the tests, so create a new consumer from the properties - _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName(), BufferSize); - + _consumer = new SqsMessageConsumer(_awsConnection, channel.Name.ToValidSQSQueueName(), BufferSize); + //in principle, for point-to-point, we don't need both sides to create the queue; whoever does not own the API can just validate _messageProducer = new SqsMessageProducer( - awsConnection, + _awsConnection, new SqsPublication{ QueueAttributes = sqsAttributes, MakeChannels = OnMissingChannel.Create }); - - _scheduler = new AWSClientFactory(awsConnection).CreateSchedulerClient(); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + + _scheduler = new AWSClientFactory(_awsConnection).CreateSchedulerClient(); + _factory = new AwsSchedulerFactory(_awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = false, MakeRole = OnMissingRole.Create, SchedulerTopicOrQueue = routingKey }; } - [Fact] + [Test] public async Task When_Scheduling_A_Sqs_Message_Via_FireScheduler_Async() { var routingKey = new RoutingKey(_queueName); @@ -81,17 +86,17 @@ public async Task When_Scheduling_A_Sqs_Message_Via_FireScheduler_Async() while (stopAt > DateTimeOffset.UtcNow) { var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True(Enumerable.Any(messages[0].Body.Value)); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(Enumerable.Any(messages[0].Body.Value)).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equivalent(message, m.Message); - Assert.True((bool)m.Async); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.Message).IsEquivalentTo(message); + await Assert.That((bool)m.Async).IsTrue(); await _consumer.AcknowledgeAsync(messages[0]); return; } diff --git a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Paramore.Brighter.AWSScheduler.V4.Tests.csproj b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Paramore.Brighter.AWSScheduler.V4.Tests.csproj index 8d720987dc..c3d4c35822 100644 --- a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Paramore.Brighter.AWSScheduler.V4.Tests.csproj +++ b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Paramore.Brighter.AWSScheduler.V4.Tests.csproj @@ -1,29 +1,14 @@ - $(BrighterTestTargetFrameworks) enable false - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - + Exe + - + + + \ No newline at end of file diff --git a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message.cs b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message.cs index efe9e4527a..e760bf744f 100644 --- a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message.cs +++ b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using Paramore.Brighter.AWSScheduler.V4.Tests.Helpers; using Paramore.Brighter.AWSScheduler.V4.Tests.TestDoubles; using Paramore.Brighter.MessageScheduler.AWS.V4; @@ -7,9 +7,8 @@ namespace Paramore.Brighter.AWSScheduler.V4.Tests.Scheduler.Messages.Sns; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SNS")] -public class SnsSchedulingMessageTest : IDisposable +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) +public class SnsSchedulingMessageTest { private readonly ContentType _contentType = new ContentType(MediaTypeNames.Text.Plain); private const int BufferSize = 3; @@ -53,14 +52,14 @@ public SnsSchedulingMessageTest() _consumer.Purge(); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = true, MakeRole = OnMissingRole.Create }; } - [Fact] - public void When_Scheduling_A_Sns_Message() + [Test] + public async Task When_Scheduling_A_Sns_Message() { var routingKey = new RoutingKey(_topicName); var message = new Message( @@ -77,15 +76,15 @@ public void When_Scheduling_A_Sns_Message() var stopAt = DateTimeOffset.UtcNow.AddMinutes(2); while (stopAt > DateTimeOffset.UtcNow) { - var messages = _consumer.Receive(); - Assert.Single(messages); + var messages = await _consumer.ReceiveAsync(); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(message.Header.MessageType, messages[0].Header.MessageType); - Assert.Equal((string?)message.Body.Value, (string?)messages[0].Body.Value); - Assert.Equivalent(message.Header, messages[0].Header); - _consumer.Acknowledge(messages[0]); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That((string?)messages[0].Body.Value).IsEqualTo((string?)message.Body.Value); + await Assert.That(messages[0].Header).IsEquivalentTo(message.Header); + await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -95,11 +94,14 @@ public void When_Scheduling_A_Sns_Message() Assert.Fail("The message wasn't fired"); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _channelFactory.DeleteTopicAsync().GetAwaiter().GetResult(); - _messageProducer.Dispose(); - _consumer.Dispose(); + await _channelFactory.DeleteQueueAsync(); + await _channelFactory.DeleteTopicAsync(); + await _messageProducer.DisposeAsync(); + await _consumer.DisposeAsync(); } } + + diff --git a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Async.cs b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Async.cs index d60f4c4d4e..c8100076d9 100644 --- a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Async.cs +++ b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Async.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using Paramore.Brighter.AWSScheduler.V4.Tests.Helpers; using Paramore.Brighter.AWSScheduler.V4.Tests.TestDoubles; using Paramore.Brighter.MessageScheduler.AWS.V4; @@ -7,60 +7,65 @@ namespace Paramore.Brighter.AWSScheduler.V4.Tests.Scheduler.Messages.Sns; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 minutes per test) -[Collection("Scheduler SNS")] +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 minutes per test) public class SnsSchedulingAsyncMessageTest : IAsyncDisposable { private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; - private readonly SnsMessageProducer _messageProducer; - private readonly SqsMessageConsumer _consumer; + private SnsMessageProducer _messageProducer; + private SqsMessageConsumer _consumer; private readonly string _topicName; private readonly ChannelFactory _channelFactory; - private readonly IAmAMessageSchedulerFactory _factory; + private IAmAMessageSchedulerFactory _factory; + private readonly AWSMessagingGatewayConnection _awsConnection; public SnsSchedulingAsyncMessageTest() { - var awsConnection = GatewayFactory.CreateFactory(); + _awsConnection = GatewayFactory.CreateFactory(); - _channelFactory = new ChannelFactory(awsConnection); - //we need the channel to create the queues and notifications + _channelFactory = new ChannelFactory(_awsConnection); _topicName = $"Producer-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); + } + + [Before(Test)] + public async Task Setup() + { + //we need the channel to create the queues and notifications var channelName = $"Producer-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); var routingKey = new RoutingKey(_topicName); - var channel = _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( + var channel = await _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( subscriptionName: new SubscriptionName(channelName), channelName: new ChannelName(channelName), routingKey: routingKey, bufferSize: BufferSize, makeChannels: OnMissingChannel.Create, queueAttributes: new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }) - )).GetAwaiter().GetResult(); + )); //we want to access via a consumer, to receive multiple messages - we don't want to expose on channel //just for the tests, so create a new consumer from the properties - _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName(), BufferSize); - _messageProducer = new SnsMessageProducer(awsConnection, + _consumer = new SqsMessageConsumer(_awsConnection, channel.Name.ToValidSQSQueueName(), BufferSize); + _messageProducer = new SnsMessageProducer(_awsConnection, new SnsPublication { MakeChannels = OnMissingChannel.Create, TopicAttributes = new SnsAttributes(tags: [new Tag { Key = "Environment", Value = "Test" }]) }); // Enforce topic to be created - _messageProducer.SendAsync(new Message( + await _messageProducer.SendAsync(new Message( new MessageHeader(Guid.NewGuid().ToString(), routingKey, MessageType.MT_COMMAND, correlationId: Guid.NewGuid().ToString(), contentType: _contentType), new MessageBody("test content one") - )).GetAwaiter().GetResult(); + )); - _consumer.Purge(); + await _consumer.PurgeAsync(); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(_awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = true, MakeRole = OnMissingRole.Create }; } - [Fact] + [Test] public async Task When_Scheduling_A_Sns_Message_Async() { var routingKey = new RoutingKey(_topicName); @@ -77,12 +82,12 @@ public async Task When_Scheduling_A_Sns_Message_Async() while (stopAt > DateTimeOffset.UtcNow) { var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal((string?)message.Body.Value, (string?)messages[0].Body.Value); - Assert.Equivalent(message.Header, messages[0].Header); + await Assert.That((string?)messages[0].Body.Value).IsEqualTo((string?)message.Body.Value); + await Assert.That(messages[0].Header).IsEquivalentTo(message.Header); await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -101,3 +106,5 @@ public async ValueTask DisposeAsync() await _consumer.DisposeAsync(); } } + + diff --git a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Via_FireScheduler.cs b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Via_FireScheduler.cs index b1eef4a099..912558fe7c 100644 --- a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Via_FireScheduler.cs +++ b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Via_FireScheduler.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using System.Text.Json; using Paramore.Brighter.AWSScheduler.V4.Tests.Helpers; using Paramore.Brighter.JsonConverters; @@ -9,9 +9,8 @@ namespace Paramore.Brighter.AWSScheduler.V4.Tests.Scheduler.Messages.Sns; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SNS")] -public class SnsSchedulingMessageViaFireSchedulerTest : IDisposable +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) +public class SnsSchedulingMessageViaFireSchedulerTest { private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; @@ -54,14 +53,14 @@ public SnsSchedulingMessageViaFireSchedulerTest() )); _consumer.Purge(); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = false, MakeRole = OnMissingRole.Create, SchedulerTopicOrQueue = routingKey }; } - [Fact] - public void When_Scheduling_A_Sns_Message_With_Delay_Via_FireScheduler() + [Test] + public async Task When_Scheduling_A_Sns_Message_With_Delay_Via_FireScheduler() { var routingKey = new RoutingKey(_topicName); var message = new Message( @@ -78,19 +77,19 @@ public void When_Scheduling_A_Sns_Message_With_Delay_Via_FireScheduler() var stopAt = DateTimeOffset.UtcNow.AddMinutes(2); while (stopAt > DateTimeOffset.UtcNow) { - var messages = _consumer.Receive(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True(Enumerable.Any(messages[0].Body.Value)); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(Enumerable.Any(messages[0].Body.Value)).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equivalent(message, m.Message); - Assert.False((bool)m.Async); - _consumer.Acknowledge(messages[0]); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.Message).IsEquivalentTo(message); + await Assert.That((bool)m.Async).IsFalse(); + await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -100,11 +99,14 @@ public void When_Scheduling_A_Sns_Message_With_Delay_Via_FireScheduler() Assert.Fail("The message wasn't fired"); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _channelFactory.DeleteTopicAsync().GetAwaiter().GetResult(); - _messageProducer.Dispose(); - _consumer.Dispose(); + await _channelFactory.DeleteQueueAsync(); + await _channelFactory.DeleteTopicAsync(); + await _messageProducer.DisposeAsync(); + await _consumer.DisposeAsync(); } } + + diff --git a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Via_FireScheduler_Async.cs b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Via_FireScheduler_Async.cs index 4d55c7466a..a7f708cb94 100644 --- a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Via_FireScheduler_Async.cs +++ b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sns/When_Scheduling_A_Sns_Message_Via_FireScheduler_Async.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using System.Text.Json; using Paramore.Brighter.AWSScheduler.V4.Tests.Helpers; using Paramore.Brighter.JsonConverters; @@ -9,9 +9,8 @@ namespace Paramore.Brighter.AWSScheduler.V4.Tests.Scheduler.Messages.Sns; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SNS")] -public class SnsSchedulingMessageViaFireSchedulerAsyncTest : IDisposable +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) +public class SnsSchedulingMessageViaFireSchedulerAsyncTest { private readonly ContentType _contentType = new( MediaTypeNames.Text.Plain); private const int BufferSize = 3; @@ -54,13 +53,13 @@ public SnsSchedulingMessageViaFireSchedulerAsyncTest() )); _consumer.Purge(); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = false, MakeRole = OnMissingRole.Create, SchedulerTopicOrQueue = routingKey }; } - [Fact] + [Test] public async Task When_Scheduling_A_Sns_Message_Async() { var routingKey = new RoutingKey(_topicName); @@ -79,17 +78,17 @@ public async Task When_Scheduling_A_Sns_Message_Async() while (stopAt > DateTimeOffset.UtcNow) { var messages = await _consumer.ReceiveAsync(); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True(Enumerable.Any(messages[0].Body.Value)); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(Enumerable.Any(messages[0].Body.Value)).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equivalent(message, m.Message); - Assert.True((bool)m.Async); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.Message).IsEquivalentTo(message); + await Assert.That((bool)m.Async).IsTrue(); await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -100,11 +99,14 @@ public async Task When_Scheduling_A_Sns_Message_Async() Assert.Fail("The message wasn't fired"); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _channelFactory.DeleteTopicAsync().GetAwaiter().GetResult(); - _messageProducer.Dispose(); - _consumer.Dispose(); + await _channelFactory.DeleteQueueAsync(); + await _channelFactory.DeleteTopicAsync(); + await _messageProducer.DisposeAsync(); + await _consumer.DisposeAsync(); } } + + diff --git a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message.cs b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message.cs index 5443445b96..02a9dfbe13 100644 --- a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message.cs +++ b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using Paramore.Brighter.AWSScheduler.V4.Tests.Helpers; using Paramore.Brighter.AWSScheduler.V4.Tests.TestDoubles; using Paramore.Brighter.MessageScheduler.AWS.V4; @@ -6,9 +6,8 @@ namespace Paramore.Brighter.AWSScheduler.V4.Tests.Scheduler.Messages.Sqs; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SQS")] -public class SqsSchedulingMessageTest : IDisposable +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) +public class SqsSchedulingMessageTest { private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; @@ -41,15 +40,15 @@ public SqsSchedulingMessageTest() _messageProducer = new SqsMessageProducer(awsConnection, new SqsPublication { MakeChannels = OnMissingChannel.Create, QueueAttributes = new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }) }); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = true, MakeRole = OnMissingRole.Create }; } - [Fact] - public void When_Scheduling_A_Sqs_Message() + [Test] + public async Task When_Scheduling_A_Sqs_Message() { var routingKey = new RoutingKey(_queueName); var message = new Message( @@ -66,14 +65,14 @@ public void When_Scheduling_A_Sqs_Message() var stopAt = DateTimeOffset.UtcNow.AddMinutes(2); while (stopAt > DateTimeOffset.UtcNow) { - var messages = _consumer.Receive(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal((string?)message.Body.Value, (string?)messages[0].Body.Value); - Assert.Equivalent(message.Header, messages[0].Header); - _consumer.Acknowledge(messages[0]); + await Assert.That((string?)messages[0].Body.Value).IsEqualTo((string?)message.Body.Value); + await Assert.That(messages[0].Header).IsEquivalentTo(message.Header); + await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -83,10 +82,13 @@ public void When_Scheduling_A_Sqs_Message() Assert.Fail("The message wasn't fired"); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _messageProducer.Dispose(); - _consumer.Dispose(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); + await _consumer.DisposeAsync(); } } + + diff --git a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Async.cs b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Async.cs index c88dbbba15..36a06ed88b 100644 --- a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Async.cs +++ b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Async.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using Paramore.Brighter.AWSScheduler.V4.Tests.Helpers; using Paramore.Brighter.AWSScheduler.V4.Tests.TestDoubles; using Paramore.Brighter.MessageScheduler.AWS.V4; @@ -6,48 +6,53 @@ namespace Paramore.Brighter.AWSScheduler.V4.Tests.Scheduler.Messages.Sqs; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SQS")] +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) public class SqsSchedulingAsyncMessageTest : IAsyncDisposable { private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; - private readonly SqsMessageProducer _messageProducer; - private readonly SqsMessageConsumer _consumer; + private SqsMessageProducer _messageProducer; + private SqsMessageConsumer _consumer; private readonly string _queueName; private readonly ChannelFactory _channelFactory; - private readonly IAmAMessageSchedulerFactory _factory; + private IAmAMessageSchedulerFactory _factory; + private readonly AWSMessagingGatewayConnection _awsConnection; public SqsSchedulingAsyncMessageTest() { - var awsConnection = GatewayFactory.CreateFactory(); + _awsConnection = GatewayFactory.CreateFactory(); - _channelFactory = new ChannelFactory(awsConnection); - var subscriptionName = $"Buffered-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); + _channelFactory = new ChannelFactory(_awsConnection); _queueName = $"Buffered-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); + } + + [Before(Test)] + public async Task Setup() + { + var subscriptionName = $"Buffered-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); //we need the channel to create the queues and notifications var routingKey = new RoutingKey(_queueName); - var channel = _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( + var channel = await _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( subscriptionName: new SubscriptionName(subscriptionName), channelName: new ChannelName(_queueName), channelType: ChannelType.PointToPoint, routingKey: routingKey, bufferSize: BufferSize, makeChannels: OnMissingChannel.Create, - queueAttributes: new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }))).GetAwaiter().GetResult(); + queueAttributes: new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }))); //we want to access via a consumer, to receive multiple messages - we don't want to expose on channel //just for the tests, so create a new consumer from the properties - _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName(), BufferSize); - _messageProducer = new SqsMessageProducer(awsConnection, + _consumer = new SqsMessageConsumer(_awsConnection, channel.Name.ToValidSQSQueueName(), BufferSize); + _messageProducer = new SqsMessageProducer(_awsConnection, new SqsPublication { MakeChannels = OnMissingChannel.Create, QueueAttributes = new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }) }); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(_awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = true }; } - [Fact] + [Test] public async Task When_Scheduling_A_Sqs_Message_Async() { var routingKey = new RoutingKey(_queueName); @@ -66,12 +71,12 @@ public async Task When_Scheduling_A_Sqs_Message_Async() while (stopAt > DateTimeOffset.UtcNow) { var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal((string?)message.Body.Value, (string?)messages[0].Body.Value); - Assert.Equivalent(message.Header, messages[0].Header); + await Assert.That((string?)messages[0].Body.Value).IsEqualTo((string?)message.Body.Value); + await Assert.That(messages[0].Header).IsEquivalentTo(message.Header); await _consumer.AcknowledgeAsync(messages[0]); return; } diff --git a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Via_FireScheduler.cs b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Via_FireScheduler.cs index 616934e94b..396b7e2573 100644 --- a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Via_FireScheduler.cs +++ b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Via_FireScheduler.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using System.Text.Json; using Paramore.Brighter.AWSScheduler.V4.Tests.Helpers; using Paramore.Brighter.AWSScheduler.V4.Tests.TestDoubles; @@ -8,9 +8,8 @@ namespace Paramore.Brighter.AWSScheduler.V4.Tests.Scheduler.Messages.Sqs; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SQS")] -public class SqsSchedulingMessageViaFireSchedulerTest : IDisposable +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) +public class SqsSchedulingMessageViaFireSchedulerTest { private readonly ContentType _contentType = new (MediaTypeNames.Text.Plain); private const int BufferSize = 3; @@ -43,7 +42,7 @@ public SqsSchedulingMessageViaFireSchedulerTest() _messageProducer = new SqsMessageProducer(awsConnection, new SqsPublication { MakeChannels = OnMissingChannel.Create, QueueAttributes = new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }) }); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = false, MakeRole = OnMissingRole.Create, @@ -51,8 +50,8 @@ public SqsSchedulingMessageViaFireSchedulerTest() }; } - [Fact] - public void When_Scheduling_A_Sqs_Message_Via_FireScheduler() + [Test] + public async Task When_Scheduling_A_Sqs_Message_Via_FireScheduler() { var routingKey = new RoutingKey(_queueName); var message = new Message( @@ -69,19 +68,19 @@ public void When_Scheduling_A_Sqs_Message_Via_FireScheduler() var stopAt = DateTimeOffset.UtcNow.AddMinutes(2); while (stopAt > DateTimeOffset.UtcNow) { - var messages = _consumer.Receive(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True(Enumerable.Any(messages[0].Body.Value)); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(Enumerable.Any(messages[0].Body.Value)).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equivalent(message, m.Message); - Assert.False((bool)m.Async); - _consumer.Acknowledge(messages[0]); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.Message).IsEquivalentTo(message); + await Assert.That((bool)m.Async).IsFalse(); + await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -91,10 +90,13 @@ public void When_Scheduling_A_Sqs_Message_Via_FireScheduler() Assert.Fail("The message wasn't fired"); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _messageProducer.Dispose(); - _consumer.Dispose(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); + await _consumer.DisposeAsync(); } } + + diff --git a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Via_FireScheduler_Async.cs b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Via_FireScheduler_Async.cs index 37cd1007f4..8e8c8b915d 100644 --- a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Via_FireScheduler_Async.cs +++ b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Messages/Sqs/When_Scheduling_A_Sqs_Message_Via_FireScheduler_Async.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using System.Text.Json; using Paramore.Brighter.AWSScheduler.V4.Tests.Helpers; using Paramore.Brighter.AWSScheduler.V4.Tests.TestDoubles; @@ -8,50 +8,55 @@ namespace Paramore.Brighter.AWSScheduler.V4.Tests.Scheduler.Messages.Sqs; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SQS")] +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) public class SqsSchedulingAsyncMessageViaFireSchedulerTest : IAsyncDisposable { private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; - private readonly SqsMessageProducer _messageProducer; - private readonly SqsMessageConsumer _consumer; + private SqsMessageProducer _messageProducer; + private SqsMessageConsumer _consumer; private readonly string _queueName; private readonly ChannelFactory _channelFactory; - private readonly IAmAMessageSchedulerFactory _factory; + private IAmAMessageSchedulerFactory _factory; + private readonly AWSMessagingGatewayConnection _awsConnection; public SqsSchedulingAsyncMessageViaFireSchedulerTest() { - var awsConnection = GatewayFactory.CreateFactory(); + _awsConnection = GatewayFactory.CreateFactory(); - _channelFactory = new ChannelFactory(awsConnection); - var subscriptionName = $"Buffered-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); + _channelFactory = new ChannelFactory(_awsConnection); _queueName = $"Buffered-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); + } + + [Before(Test)] + public async Task Setup() + { + var subscriptionName = $"Buffered-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); //we need the channel to create the queues and notifications var routingKey = new RoutingKey(_queueName); - var channel = _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( + var channel = await _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( subscriptionName: new SubscriptionName(subscriptionName), channelName: new ChannelName(_queueName), channelType: ChannelType.PointToPoint, routingKey: routingKey, bufferSize: BufferSize, makeChannels: OnMissingChannel.Create, - queueAttributes: new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }))).GetAwaiter().GetResult(); + queueAttributes: new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }))); //we want to access via a consumer, to receive multiple messages - we don't want to expose on channel //just for the tests, so create a new consumer from the properties - _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName(), BufferSize); - _messageProducer = new SqsMessageProducer(awsConnection, + _consumer = new SqsMessageConsumer(_awsConnection, channel.Name.ToValidSQSQueueName(), BufferSize); + _messageProducer = new SqsMessageProducer(_awsConnection, new SqsPublication { MakeChannels = OnMissingChannel.Create, QueueAttributes = new SqsAttributes(tags: new Dictionary { { "Environment", "Test" } }) }); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(_awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = false, - MakeRole = OnMissingRole.Create, + MakeRole = OnMissingRole.Create, SchedulerTopicOrQueue = routingKey }; } - [Fact] + [Test] public async Task When_Scheduling_A_Sqs_Message_Via_FireScheduler_Async() { var routingKey = new RoutingKey(_queueName); @@ -70,17 +75,17 @@ public async Task When_Scheduling_A_Sqs_Message_Via_FireScheduler_Async() while (stopAt > DateTimeOffset.UtcNow) { var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True(Enumerable.Any(messages[0].Body.Value)); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(Enumerable.Any(messages[0].Body.Value)).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equivalent(message, m.Message); - Assert.True((bool)m.Async); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.Message).IsEquivalentTo(message); + await Assert.That((bool)m.Async).IsTrue(); await _consumer.AcknowledgeAsync(messages[0]); return; } diff --git a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Requests/Sns/When_Scheduling_A_Sns_Request.cs b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Requests/Sns/When_Scheduling_A_Sns_Request.cs index 52cf63bdac..143f1ceb04 100644 --- a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Requests/Sns/When_Scheduling_A_Sns_Request.cs +++ b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Requests/Sns/When_Scheduling_A_Sns_Request.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using System.Text.Json; using Amazon.Scheduler; using Amazon.Scheduler.Model; @@ -12,9 +12,8 @@ namespace Paramore.Brighter.AWSScheduler.V4.Tests.Scheduler.Requests.Sns; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SNS")] -public class SnsSchedulingMessageViaFireSchedulerRequestTest : IDisposable +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) +public class SnsSchedulingMessageViaFireSchedulerRequestTest { private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; @@ -59,46 +58,46 @@ public SnsSchedulingMessageViaFireSchedulerRequestTest() _scheduler = new AWSClientFactory(awsConnection).CreateSchedulerClient(); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = false, MakeRole = OnMissingRole.Create, SchedulerTopicOrQueue = routingKey }; } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Scheduling_A_Sns_Request_With_Delay(RequestSchedulerType schedulerType) { var command = new MyCommand(); var scheduler = _factory.CreateSync(null!); var id = scheduler.Schedule(command, schedulerType, TimeSpan.FromMinutes(1)); - Assert.True(Enumerable.Any(id)); + await Assert.That(Enumerable.Any(id)).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); await Task.Delay(TimeSpan.FromMinutes(1)); var stopAt = DateTimeOffset.UtcNow.AddMinutes(2); while (stopAt > DateTimeOffset.UtcNow) { - var messages = _consumer.Receive(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True((bool?)(messages[0].Body.Value)?.Any()); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That((bool?)(messages[0].Body.Value)?.Any()).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equal(schedulerType, m.SchedulerType); - Assert.Equal(typeof(MyCommand).FullName, (string?)m.RequestType); - Assert.False((bool)m.Async); - _consumer.Acknowledge(messages[0]); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.SchedulerType).IsEqualTo(schedulerType); + await Assert.That((string?)m.RequestType).IsEqualTo(typeof(MyCommand).FullName); + await Assert.That((bool)m.Async).IsFalse(); + await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -108,10 +107,10 @@ public async Task When_Scheduling_A_Sns_Request_With_Delay(RequestSchedulerType Assert.Fail("The message wasn't fired"); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Scheduling_A_Sns_Request_With_SpecificDateTime(RequestSchedulerType schedulerType) { var command = new MyCommand(); @@ -120,26 +119,26 @@ public async Task When_Scheduling_A_Sns_Request_With_SpecificDateTime(RequestSch var id = scheduler.Schedule(command, schedulerType, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(1))); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); var stopAt = DateTimeOffset.UtcNow.AddMinutes(2); while (stopAt > DateTimeOffset.UtcNow) { - var messages = _consumer.Receive(TimeSpan.FromMinutes(1)); + var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True((bool?)(messages[0].Body.Value)?.Any()); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That((bool?)(messages[0].Body.Value)?.Any()).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equal(schedulerType, m.SchedulerType); - Assert.Equal(typeof(MyCommand).FullName, (string?)m.RequestType); - Assert.False((bool)m.Async); - _consumer.Acknowledge(messages[0]); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.SchedulerType).IsEqualTo(schedulerType); + await Assert.That((string?)m.RequestType).IsEqualTo(typeof(MyCommand).FullName); + await Assert.That((bool)m.Async).IsFalse(); + await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -149,93 +148,96 @@ public async Task When_Scheduling_A_Sns_Request_With_SpecificDateTime(RequestSch Assert.Fail("The message wasn't fired"); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Rescheduling_A_Sns_Request_With_Delay(RequestSchedulerType schedulerType) { var command = new MyCommand(); var scheduler = _factory.CreateSync(null!); var id = scheduler.Schedule(command, schedulerType, TimeSpan.FromMinutes(1)); - Assert.True((bool?)(id)?.Any()); + await Assert.That((bool?)(id)?.Any()).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); - Assert.True((bool)scheduler.ReScheduler(id, TimeSpan.FromMinutes(2))); + await Assert.That((bool)scheduler.ReScheduler(id, TimeSpan.FromMinutes(2))).IsTrue(); var awsReScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsReScheduler); - Assert.NotEqual(awsScheduler.ScheduleExpression, awsReScheduler.ScheduleExpression); + await Assert.That(awsReScheduler).IsNotNull(); + await Assert.That(awsReScheduler.ScheduleExpression).IsNotEqualTo(awsScheduler.ScheduleExpression); await _scheduler.DeleteScheduleAsync(new DeleteScheduleRequest { Name = id }); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Rescheduling_A_Sns_Request_With_SpecificDateTimeOffset(RequestSchedulerType schedulerType) { var command = new MyCommand(); var scheduler = _factory.CreateSync(null!); var id = scheduler.Schedule(command, schedulerType, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(1))); - Assert.True((bool?)(id)?.Any()); + await Assert.That((bool?)(id)?.Any()).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); - Assert.True((bool)scheduler.ReScheduler(id, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(2)))); + await Assert.That((bool)scheduler.ReScheduler(id, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(2)))).IsTrue(); var awsReScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsReScheduler); - Assert.NotEqual(awsScheduler.ScheduleExpression, awsReScheduler.ScheduleExpression); + await Assert.That(awsReScheduler).IsNotNull(); + await Assert.That(awsReScheduler.ScheduleExpression).IsNotEqualTo(awsScheduler.ScheduleExpression); await _scheduler.DeleteScheduleAsync(new DeleteScheduleRequest { Name = id }); } - [Fact] - public void When_Rescheduling_A_Sns_Request_That_Not_Exists() + [Test] + public async Task When_Rescheduling_A_Sns_Request_That_Not_Exists() { var scheduler = _factory.CreateSync(null!); - Assert.False((bool)scheduler.ReScheduler(Guid.NewGuid().ToString("N"), DateTimeOffset.UtcNow.AddHours(1))); + await Assert.That((bool)scheduler.ReScheduler(Guid.NewGuid().ToString("N"), DateTimeOffset.UtcNow.AddHours(1))).IsFalse(); - Assert.False((bool)scheduler.ReScheduler(Guid.NewGuid().ToString("N"), TimeSpan.FromMinutes(1))); + await Assert.That((bool)scheduler.ReScheduler(Guid.NewGuid().ToString("N"), TimeSpan.FromMinutes(1))).IsFalse(); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Cancel_A_Sns_Request(RequestSchedulerType schedulerType) { var command = new MyCommand(); var scheduler = _factory.CreateSync(null!); var id = scheduler.Schedule(command, schedulerType, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(1))); - Assert.True((bool?)(id)?.Any()); + await Assert.That((bool?)(id)?.Any()).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); scheduler.Cancel(id); var ex = await Catch.ExceptionAsync(async () => await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id })); - Assert.NotNull(ex); - Assert.True((ex) is ResourceNotFoundException); + await Assert.That(ex).IsNotNull(); + await Assert.That((ex) is ResourceNotFoundException).IsTrue(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _channelFactory.DeleteTopicAsync().GetAwaiter().GetResult(); - _messageProducer.Dispose(); - _consumer.Dispose(); + await _channelFactory.DeleteQueueAsync(); + await _channelFactory.DeleteTopicAsync(); + await _messageProducer.DisposeAsync(); + await _consumer.DisposeAsync(); _scheduler.Dispose(); } } + + diff --git a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Requests/Sns/When_Scheduling_A_Sns_Request_Async.cs b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Requests/Sns/When_Scheduling_A_Sns_Request_Async.cs index 069a3ff558..3c544452e4 100644 --- a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Requests/Sns/When_Scheduling_A_Sns_Request_Async.cs +++ b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Requests/Sns/When_Scheduling_A_Sns_Request_Async.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using System.Text.Json; using Amazon.Scheduler; using Amazon.Scheduler.Model; @@ -12,9 +12,8 @@ namespace Paramore.Brighter.AWSScheduler.V4.Tests.Scheduler.Requests.Sns; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SNS")] -public class SnsSchedulingRequestAsyncTest : IDisposable +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) +public class SnsSchedulingRequestAsyncTest { private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; @@ -59,26 +58,26 @@ public SnsSchedulingRequestAsyncTest() _scheduler = new AWSClientFactory(awsConnection).CreateSchedulerClient(); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = false, MakeRole = OnMissingRole.Create, SchedulerTopicOrQueue = routingKey }; } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Scheduling_A_Sns_Request_With_Delay_Async(RequestSchedulerType schedulerType) { var command = new MyCommand(); var scheduler = _factory.CreateAsync(null!); var id = await scheduler.ScheduleAsync(command, schedulerType, TimeSpan.FromMinutes(1)); - Assert.True(Enumerable.Any(id)); + await Assert.That(Enumerable.Any(id)).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); await Task.Delay(TimeSpan.FromMinutes(1)); @@ -86,18 +85,18 @@ public async Task When_Scheduling_A_Sns_Request_With_Delay_Async(RequestSchedule while (stopAt > DateTimeOffset.UtcNow) { var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True((bool?)(messages[0].Body.Value)?.Any()); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That((bool?)(messages[0].Body.Value)?.Any()).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equal(schedulerType, m.SchedulerType); - Assert.Equal(typeof(MyCommand).FullName, (string?)m.RequestType); - Assert.True((bool)m.Async); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.SchedulerType).IsEqualTo(schedulerType); + await Assert.That((string?)m.RequestType).IsEqualTo(typeof(MyCommand).FullName); + await Assert.That((bool)m.Async).IsTrue(); await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -108,10 +107,10 @@ public async Task When_Scheduling_A_Sns_Request_With_Delay_Async(RequestSchedule Assert.Fail("The message wasn't fired"); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Scheduling_A_Sns_Request_With_SpecificDateTimeOffset_Async( RequestSchedulerType schedulerType) { @@ -122,24 +121,24 @@ public async Task When_Scheduling_A_Sns_Request_With_SpecificDateTimeOffset_Asyn DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(1))); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); var stopAt = DateTimeOffset.UtcNow.AddMinutes(2); while (stopAt > DateTimeOffset.UtcNow) { var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True((bool?)(messages[0].Body.Value)?.Any()); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That((bool?)(messages[0].Body.Value)?.Any()).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equal(schedulerType, m.SchedulerType); - Assert.Equal(typeof(MyCommand).FullName, (string?)m.RequestType); - Assert.True((bool)m.Async); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.SchedulerType).IsEqualTo(schedulerType); + await Assert.That((string?)m.RequestType).IsEqualTo(typeof(MyCommand).FullName); + await Assert.That((bool)m.Async).IsTrue(); await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -150,34 +149,34 @@ public async Task When_Scheduling_A_Sns_Request_With_SpecificDateTimeOffset_Asyn Assert.Fail("The message wasn't fired"); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Rescheduling_A_Sns_Request_With_Delay_Async(RequestSchedulerType schedulerType) { var command = new MyCommand(); var scheduler = _factory.CreateAsync(null!); var id = await scheduler.ScheduleAsync(command, schedulerType, TimeSpan.FromMinutes(1)); - Assert.True(Enumerable.Any(id)); + await Assert.That(Enumerable.Any(id)).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); - Assert.True((bool)(await scheduler.ReSchedulerAsync(id, TimeSpan.FromMinutes(2)))); + await Assert.That((bool)(await scheduler.ReSchedulerAsync(id, TimeSpan.FromMinutes(2)))).IsTrue(); var awsReScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsReScheduler); - Assert.NotEqual(awsScheduler.ScheduleExpression, awsReScheduler.ScheduleExpression); + await Assert.That(awsReScheduler).IsNotNull(); + await Assert.That(awsReScheduler.ScheduleExpression).IsNotEqualTo(awsScheduler.ScheduleExpression); await _scheduler.DeleteScheduleAsync(new DeleteScheduleRequest { Name = id }); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Rescheduling_A_Sns_Request_With_SpecificDateTimeOffset_Async( RequestSchedulerType schedulerType) { @@ -186,33 +185,33 @@ public async Task When_Rescheduling_A_Sns_Request_With_SpecificDateTimeOffset_As var scheduler = _factory.CreateAsync(null!); var id = await scheduler.ScheduleAsync(command, schedulerType, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(1))); - Assert.True((bool?)(id)?.Any()); + await Assert.That((bool?)(id)?.Any()).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); - Assert.True((bool)(await scheduler.ReSchedulerAsync(id, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(2))))); + await Assert.That((bool)(await scheduler.ReSchedulerAsync(id, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(2))))).IsTrue(); var awsReScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsReScheduler); - Assert.NotEqual(awsScheduler.ScheduleExpression, awsReScheduler.ScheduleExpression); + await Assert.That(awsReScheduler).IsNotNull(); + await Assert.That(awsReScheduler.ScheduleExpression).IsNotEqualTo(awsScheduler.ScheduleExpression); await _scheduler.DeleteScheduleAsync(new DeleteScheduleRequest { Name = id }); } - [Fact] + [Test] public async Task When_Rescheduling_A_Sns_Request_That_Not_Exists_Async() { var scheduler = _factory.CreateAsync(null!); - Assert.False((bool)(await scheduler.ReSchedulerAsync(Guid.NewGuid().ToString("N"), DateTimeOffset.UtcNow.AddHours(1)))); + await Assert.That((bool)(await scheduler.ReSchedulerAsync(Guid.NewGuid().ToString("N"), DateTimeOffset.UtcNow.AddHours(1)))).IsFalse(); - Assert.False((bool)(await scheduler.ReSchedulerAsync(Guid.NewGuid().ToString("N"), TimeSpan.FromMinutes(1)))); + await Assert.That((bool)(await scheduler.ReSchedulerAsync(Guid.NewGuid().ToString("N"), TimeSpan.FromMinutes(1)))).IsFalse(); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Cancel_A_Sns_Request_Async(RequestSchedulerType schedulerType) { var command = new MyCommand(); @@ -220,26 +219,29 @@ public async Task When_Cancel_A_Sns_Request_Async(RequestSchedulerType scheduler var scheduler = _factory.CreateAsync(null!); var id = await scheduler.ScheduleAsync(command, schedulerType, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(1))); - Assert.True((bool?)(id)?.Any()); + await Assert.That((bool?)(id)?.Any()).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); await scheduler.CancelAsync(id); var ex = await Catch.ExceptionAsync(async () => await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id })); - Assert.NotNull(ex); - Assert.True((ex) is ResourceNotFoundException); + await Assert.That(ex).IsNotNull(); + await Assert.That((ex) is ResourceNotFoundException).IsTrue(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _channelFactory.DeleteTopicAsync().GetAwaiter().GetResult(); - _messageProducer.Dispose(); - _consumer.Dispose(); + await _channelFactory.DeleteQueueAsync(); + await _channelFactory.DeleteTopicAsync(); + await _messageProducer.DisposeAsync(); + await _consumer.DisposeAsync(); _scheduler.Dispose(); } } + + diff --git a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Requests/Sqs/When_Scheduling_A_Sqs_Request.cs b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Requests/Sqs/When_Scheduling_A_Sqs_Request.cs index f8ac5889ae..e42712ac17 100644 --- a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Requests/Sqs/When_Scheduling_A_Sqs_Request.cs +++ b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Requests/Sqs/When_Scheduling_A_Sqs_Request.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using Amazon.Scheduler; using Amazon.Scheduler.Model; using Paramore.Brighter.AWSScheduler.V4.Tests.Helpers; @@ -9,9 +9,8 @@ namespace Paramore.Brighter.AWSScheduler.V4.Tests.Scheduler.Requests.Sqs; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SQS")] -public class SqsSchedulingRequestTest : IDisposable +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) +public class SqsSchedulingRequestTest { private const int BufferSize = 3; private readonly SqsMessageProducer _messageProducer; @@ -46,26 +45,26 @@ public SqsSchedulingRequestTest() _scheduler = new AWSClientFactory(awsConnection).CreateSchedulerClient(); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _factory = new AwsSchedulerFactory(awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = false, MakeRole = OnMissingRole.Create, SchedulerTopicOrQueue = routingKey }; } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Scheduling_A_Sqs_Request_With_Delay_Async(RequestSchedulerType schedulerType) { var command = new MyCommand(); var scheduler = _factory.CreateAsync(null!); var id = await scheduler.ScheduleAsync(command, schedulerType, TimeSpan.FromMinutes(1)); - Assert.True(Enumerable.Any(id)); + await Assert.That(Enumerable.Any(id)).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); await Task.Delay(TimeSpan.FromMinutes(1)); @@ -73,18 +72,18 @@ public async Task When_Scheduling_A_Sqs_Request_With_Delay_Async(RequestSchedule while (stopAt > DateTimeOffset.UtcNow) { var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True((bool?)(messages[0].Body.Value)?.Any()); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That((bool?)(messages[0].Body.Value)?.Any()).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equal(schedulerType, m.SchedulerType); - Assert.Equal(typeof(MyCommand).FullName, (string?)m.RequestType); - Assert.True((bool)m.Async); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.SchedulerType).IsEqualTo(schedulerType); + await Assert.That((string?)m.RequestType).IsEqualTo(typeof(MyCommand).FullName); + await Assert.That((bool)m.Async).IsTrue(); await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -95,10 +94,10 @@ public async Task When_Scheduling_A_Sqs_Request_With_Delay_Async(RequestSchedule Assert.Fail("The message wasn't fired"); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Scheduling_A_Sqs_Request_With_SpecificDateTimeOffset_Async( RequestSchedulerType schedulerType) { @@ -109,24 +108,24 @@ public async Task When_Scheduling_A_Sqs_Request_With_SpecificDateTimeOffset_Asyn DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(1))); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); var stopAt = DateTimeOffset.UtcNow.AddMinutes(2); while (stopAt > DateTimeOffset.UtcNow) { var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True((bool?)(messages[0].Body.Value)?.Any()); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That((bool?)(messages[0].Body.Value)?.Any()).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equal(schedulerType, m.SchedulerType); - Assert.Equal(typeof(MyCommand).FullName, (string?)m.RequestType); - Assert.True((bool)m.Async); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.SchedulerType).IsEqualTo(schedulerType); + await Assert.That((string?)m.RequestType).IsEqualTo(typeof(MyCommand).FullName); + await Assert.That((bool)m.Async).IsTrue(); await _consumer.AcknowledgeAsync(messages[0]); return; } @@ -137,34 +136,34 @@ public async Task When_Scheduling_A_Sqs_Request_With_SpecificDateTimeOffset_Asyn Assert.Fail("The message wasn't fired"); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Rescheduling_A_Sqs_Request_With_Delay_Async(RequestSchedulerType schedulerType) { var command = new MyCommand(); var scheduler = _factory.CreateAsync(null!); var id = await scheduler.ScheduleAsync(command, schedulerType, TimeSpan.FromMinutes(1)); - Assert.True(Enumerable.Any(id)); + await Assert.That(Enumerable.Any(id)).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); - Assert.True((bool)(await scheduler.ReSchedulerAsync(id, TimeSpan.FromMinutes(2)))); + await Assert.That((bool)(await scheduler.ReSchedulerAsync(id, TimeSpan.FromMinutes(2)))).IsTrue(); var awsReScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsReScheduler); - Assert.NotEqual(awsScheduler.ScheduleExpression, awsReScheduler.ScheduleExpression); + await Assert.That(awsReScheduler).IsNotNull(); + await Assert.That(awsReScheduler.ScheduleExpression).IsNotEqualTo(awsScheduler.ScheduleExpression); await _scheduler.DeleteScheduleAsync(new DeleteScheduleRequest { Name = id }); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Rescheduling_A_Sqs_Request_With_SpecificDateTimeOffset_Async( RequestSchedulerType schedulerType) { @@ -173,33 +172,33 @@ public async Task When_Rescheduling_A_Sqs_Request_With_SpecificDateTimeOffset_As var scheduler = _factory.CreateAsync(null!); var id = await scheduler.ScheduleAsync(command, schedulerType, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(1))); - Assert.True(Enumerable.Any(id)); + await Assert.That(Enumerable.Any(id)).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); - Assert.True((bool)(await scheduler.ReSchedulerAsync(id, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(2))))); + await Assert.That((bool)(await scheduler.ReSchedulerAsync(id, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(2))))).IsTrue(); var awsReScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsReScheduler); - Assert.NotEqual(awsScheduler.ScheduleExpression, awsReScheduler.ScheduleExpression); + await Assert.That(awsReScheduler).IsNotNull(); + await Assert.That(awsReScheduler.ScheduleExpression).IsNotEqualTo(awsScheduler.ScheduleExpression); await _scheduler.DeleteScheduleAsync(new DeleteScheduleRequest { Name = id }); } - [Fact] + [Test] public async Task When_Rescheduling_A_Sqs_Request_That_Not_Exists_Async() { var scheduler = _factory.CreateAsync(null!); - Assert.False((bool)(await scheduler.ReSchedulerAsync(Guid.NewGuid().ToString("N"), DateTimeOffset.UtcNow.AddHours(1)))); + await Assert.That((bool)(await scheduler.ReSchedulerAsync(Guid.NewGuid().ToString("N"), DateTimeOffset.UtcNow.AddHours(1)))).IsFalse(); - Assert.False((bool)(await scheduler.ReSchedulerAsync(Guid.NewGuid().ToString("N"), TimeSpan.FromMinutes(1)))); + await Assert.That((bool)(await scheduler.ReSchedulerAsync(Guid.NewGuid().ToString("N"), TimeSpan.FromMinutes(1)))).IsFalse(); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_Cancel_A_Sqs_Request_Async(RequestSchedulerType schedulerType) { var command = new MyCommand(); @@ -207,26 +206,29 @@ public async Task When_Cancel_A_Sqs_Request_Async(RequestSchedulerType scheduler var scheduler = _factory.CreateAsync(null!); var id = await scheduler.ScheduleAsync(command, schedulerType, DateTimeOffset.UtcNow.Add(TimeSpan.FromMinutes(1))); - Assert.True((bool?)(id)?.Any()); + await Assert.That((bool?)(id)?.Any()).IsTrue(); var awsScheduler = await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id }); - Assert.NotNull(awsScheduler); + await Assert.That(awsScheduler).IsNotNull(); await scheduler.CancelAsync(id); var ex = await Catch.ExceptionAsync(async () => await _scheduler.GetScheduleAsync(new GetScheduleRequest { Name = id })); - Assert.NotNull(ex); - Assert.True((ex) is ResourceNotFoundException); + await Assert.That(ex).IsNotNull(); + await Assert.That((ex) is ResourceNotFoundException).IsTrue(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteQueueAsync().GetAwaiter().GetResult(); - _messageProducer.Dispose(); - _consumer.Dispose(); + await _channelFactory.DeleteQueueAsync(); + await _messageProducer.DisposeAsync(); + await _consumer.DisposeAsync(); _scheduler.Dispose(); } } + + diff --git a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Requests/Sqs/When_Scheduling_A_Sqs_Request_Async.cs b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Requests/Sqs/When_Scheduling_A_Sqs_Request_Async.cs index 3982ee9c3b..236ef5670e 100644 --- a/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Requests/Sqs/When_Scheduling_A_Sqs_Request_Async.cs +++ b/tests/Paramore.Brighter.AWSScheduler.V4.Tests/Scheduler/Requests/Sqs/When_Scheduling_A_Sqs_Request_Async.cs @@ -1,4 +1,4 @@ -using System.Net.Mime; +using System.Net.Mime; using System.Text.Json; using Amazon.Scheduler; using Paramore.Brighter.AWSScheduler.V4.Tests.Helpers; @@ -9,26 +9,31 @@ namespace Paramore.Brighter.AWSScheduler.V4.Tests.Scheduler.Requests.Sqs; -[Trait("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) -[Collection("Scheduler SQS")] +[Property("Fragile", "CI")] // It isn't really fragile, it's time consumer (1-2 per test) public class SqsSchedulingRequestAsyncTest : IAsyncDisposable { private readonly ContentType _contentType = new(MediaTypeNames.Text.Plain); private const int BufferSize = 3; - private readonly SqsMessageProducer _messageProducer; - private readonly SqsMessageConsumer _consumer; + private SqsMessageProducer _messageProducer; + private SqsMessageConsumer _consumer; private readonly string _queueName; private readonly ChannelFactory _channelFactory; - private readonly AwsSchedulerFactory _factory; - private readonly IAmazonScheduler _scheduler; + private AwsSchedulerFactory _factory; + private IAmazonScheduler _scheduler; + private readonly AWSMessagingGatewayConnection _awsConnection; public SqsSchedulingRequestAsyncTest() { - var awsConnection = GatewayFactory.CreateFactory(); + _awsConnection = GatewayFactory.CreateFactory(); - _channelFactory = new ChannelFactory(awsConnection); - var subscriptionName = $"Buffered-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); + _channelFactory = new ChannelFactory(_awsConnection); _queueName = $"Buffered-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); + } + + [Before(Test)] + public async Task Setup() + { + var subscriptionName = $"Buffered-Scheduler-Async-Tests-{Guid.NewGuid().ToString()}".Truncate(45); //we need the channel to create the queues and notifications var routingKey = new RoutingKey(_queueName); @@ -39,31 +44,31 @@ public SqsSchedulingRequestAsyncTest() delaySeconds: TimeSpan.Zero, tags: new Dictionary { { "Environment", "Test" } } ); - - var channel = _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( + + var channel = await _channelFactory.CreateAsyncChannelAsync(new SqsSubscription( subscriptionName: new SubscriptionName(subscriptionName), channelName: new ChannelName(_queueName), channelType: ChannelType.PointToPoint, - routingKey: routingKey, bufferSize: BufferSize, queueAttributes: sqsAttributes, makeChannels: OnMissingChannel.Create)).GetAwaiter().GetResult(); + routingKey: routingKey, bufferSize: BufferSize, queueAttributes: sqsAttributes, makeChannels: OnMissingChannel.Create)); //we want to access via a consumer, to receive multiple messages - we don't want to expose on channel //just for the tests, so create a new consumer from the properties - _consumer = new SqsMessageConsumer(awsConnection, channel.Name.ToValidSQSQueueName(), BufferSize); - + _consumer = new SqsMessageConsumer(_awsConnection, channel.Name.ToValidSQSQueueName(), BufferSize); + //in principle, for point-to-point, we don't need both sides to create the queue; whoever does not own the API can just validate _messageProducer = new SqsMessageProducer( - awsConnection, + _awsConnection, new SqsPublication{QueueAttributes = sqsAttributes, MakeChannels = OnMissingChannel.Create} ); - _scheduler = new AWSClientFactory(awsConnection).CreateSchedulerClient(); - _factory = new AwsSchedulerFactory(awsConnection, "brighter-scheduler") + _scheduler = new AWSClientFactory(_awsConnection).CreateSchedulerClient(); + _factory = new AwsSchedulerFactory(_awsConnection, $"brighter-scheduler-{Guid.NewGuid():N}") { UseMessageTopicAsTarget = false, MakeRole = OnMissingRole.Create, SchedulerTopicOrQueue = routingKey }; } - [Fact] + [Test] public async Task When_Scheduling_A_Sqs_Message_Via_FireScheduler_Async() { var routingKey = new RoutingKey(_queueName); @@ -82,17 +87,17 @@ public async Task When_Scheduling_A_Sqs_Message_Via_FireScheduler_Async() while (stopAt > DateTimeOffset.UtcNow) { var messages = await _consumer.ReceiveAsync(TimeSpan.FromMinutes(1)); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.True(Enumerable.Any(messages[0].Body.Value)); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(Enumerable.Any(messages[0].Body.Value)).IsTrue(); var m = JsonSerializer.Deserialize(messages[0].Body.Value, JsonSerialisationOptions.Options); - Assert.NotNull((object?)m); - Assert.Equivalent(message, m.Message); - Assert.True((bool)m.Async); + await Assert.That((object?)m).IsNotNull(); + await Assert.That(m.Message).IsEquivalentTo(message); + await Assert.That((bool)m.Async).IsTrue(); await _consumer.AcknowledgeAsync(messages[0]); return; } diff --git a/tests/Paramore.Brighter.Analyzer.Tests/Analyzers/PublicationRequestTypeAssignmentAnalyzerTest.cs b/tests/Paramore.Brighter.Analyzer.Tests/Analyzers/PublicationRequestTypeAssignmentAnalyzerTest.cs index a8e904138a..45a16b486f 100644 --- a/tests/Paramore.Brighter.Analyzer.Tests/Analyzers/PublicationRequestTypeAssignmentAnalyzerTest.cs +++ b/tests/Paramore.Brighter.Analyzer.Tests/Analyzers/PublicationRequestTypeAssignmentAnalyzerTest.cs @@ -1,4 +1,4 @@ -using Microsoft.CodeAnalysis.Testing; +using Microsoft.CodeAnalysis.Testing; using Paramore.Brighter.Analyzer.Analyzers; using Paramore.Brighter.Analyzer.Tests.Analyzers; @@ -8,7 +8,7 @@ namespace Paramore.Brighter.Analyzer.Test.Analyzers public class PublicationRequestTypeAssignmentAnalyzerTest : BaseAnalyzerTest { - [Fact] + [Test] public async Task When_Initializing_Publication_WithOut_RequestType() { @@ -28,7 +28,7 @@ public class PublicationTest : Publication await testContext.RunAsync(); } - [Fact] + [Test] public async Task When_Initializing_Publication_With_Right_RequestType() { testContext.TestCode = /* lang=c#-test */ """ @@ -54,7 +54,7 @@ public EventSample(Id id) : base(id) await testContext.RunAsync(); } - [Fact] + [Test] public async Task When_Initializing_Publication_With_Wrong_RequestType() { testContext.TestCode = /* lang=c#-test */ """ @@ -76,7 +76,7 @@ public class EventSample{} await testContext.RunAsync(); } - [Fact] + [Test] public async Task When_Initializing_Non_Publication_Type() { testContext.TestCode = /* lang=c#-test */ """ diff --git a/tests/Paramore.Brighter.Analyzer.Tests/Analyzers/SubscriptionConstructorAnalyzerTest.cs b/tests/Paramore.Brighter.Analyzer.Tests/Analyzers/SubscriptionConstructorAnalyzerTest.cs index 8d2bf4d8a2..5f06231432 100644 --- a/tests/Paramore.Brighter.Analyzer.Tests/Analyzers/SubscriptionConstructorAnalyzerTest.cs +++ b/tests/Paramore.Brighter.Analyzer.Tests/Analyzers/SubscriptionConstructorAnalyzerTest.cs @@ -1,4 +1,4 @@ -using Microsoft.CodeAnalysis.Testing; +using Microsoft.CodeAnalysis.Testing; using Paramore.Brighter.Analyzer.Analyzers; using Paramore.Brighter.Analyzer.Tests.Analyzers; @@ -6,7 +6,7 @@ namespace Paramore.Brighter.Analyzer.Test.Analyzers { public class SubscriptionConstructorAnalyzerTest : BaseAnalyzerTest { - [Fact] + [Test] public async Task When_Initializing_Subscription_With_MessagePump() { @@ -28,7 +28,7 @@ public SubscriptionTest(SubscriptionName subscriptionName, ChannelName channelNa await testContext.RunAsync(); } - [Fact] + [Test] public async Task When_Initializing_Subscription_WithOut_MessagePump() { @@ -50,7 +50,7 @@ public SubscriptionTest(SubscriptionName subscriptionName, ChannelName channelNa testContext.ExpectedDiagnostics.Add(new DiagnosticResult(SubscriptionConstructorAnalyzer.MessagePumpMissingRule).WithLocation(0).WithArguments("SubscriptionTest")); await testContext.RunAsync(); } - [Fact] + [Test] public async Task When_Initializing_SubscriptionNested_WithOut_MessagePump() { diff --git a/tests/Paramore.Brighter.Analyzer.Tests/Analyzers/WrapAttributeAnalyzerTest.cs b/tests/Paramore.Brighter.Analyzer.Tests/Analyzers/WrapAttributeAnalyzerTest.cs index 8ad50ccffd..5c0bcde062 100644 --- a/tests/Paramore.Brighter.Analyzer.Tests/Analyzers/WrapAttributeAnalyzerTest.cs +++ b/tests/Paramore.Brighter.Analyzer.Tests/Analyzers/WrapAttributeAnalyzerTest.cs @@ -1,4 +1,4 @@ -using Microsoft.CodeAnalysis.Testing; +using Microsoft.CodeAnalysis.Testing; using Paramore.Brighter.Analyzer.Analyzers; using Paramore.Brighter.Analyzer.Tests.Analyzers; @@ -7,7 +7,7 @@ namespace Paramore.Brighter.Analyzer.Test.Analyzers public class WrapAttributeAnalyzerTest: BaseAnalyzerTest { - [Fact] + [Test] public async Task When_Adding_Attribute_To_MessageMapper() { diff --git a/tests/Paramore.Brighter.Analyzer.Tests/Paramore.Brighter.Analyzer.Tests.csproj b/tests/Paramore.Brighter.Analyzer.Tests/Paramore.Brighter.Analyzer.Tests.csproj index 1eef7fe76a..cd2170c707 100644 --- a/tests/Paramore.Brighter.Analyzer.Tests/Paramore.Brighter.Analyzer.Tests.csproj +++ b/tests/Paramore.Brighter.Analyzer.Tests/Paramore.Brighter.Analyzer.Tests.csproj @@ -1,32 +1,17 @@ - - + $(BrighterTestNineOnlyTargetFrameworks) enable - false true + Exe - - - - - + - - - - - - - - - - - + \ No newline at end of file diff --git a/tests/Paramore.Brighter.Azure.Tests/AzureBlobArchiveProviderTests.cs b/tests/Paramore.Brighter.Azure.Tests/AzureBlobArchiveProviderTests.cs index f29b9525c1..a9227c086d 100644 --- a/tests/Paramore.Brighter.Azure.Tests/AzureBlobArchiveProviderTests.cs +++ b/tests/Paramore.Brighter.Azure.Tests/AzureBlobArchiveProviderTests.cs @@ -51,17 +51,17 @@ public async Task GivenARequestToArchiveAMessage_TheMessageIsArchived() _provider?.ArchiveMessage(commandMessage); - Assert.That((bool)await blobClient.ExistsAsync(), Is.True); + await Assert.That((bool)await blobClient.ExistsAsync()).IsTrue(); var tags = (await blobClient.GetTagsAsync()).Value.Tags; - Assert.That(tags.Count, Is.EqualTo(0)); + await Assert.That(tags.Count).IsEqualTo(0); var body = (await blobClient.DownloadContentAsync()).Value.Content.ToString(); - Assert.That(body, Is.EqualTo(commandMessage.Body.Value)); + await Assert.That(body).IsEqualTo(commandMessage.Body.Value); var tier = await blobClient.GetPropertiesAsync(); - Assert.That(tier.Value.AccessTier, Is.EqualTo(AccessTier.Cool.ToString())); + await Assert.That(tier.Value.AccessTier).IsEqualTo(AccessTier.Cool.ToString()); } @@ -81,15 +81,15 @@ public async Task GivenARequestToArchiveAMessage_WhenTagsAreTurnedOn_ThenTagsAre _provider?.ArchiveMessage(eventMessage); var tier = await blobClient.GetPropertiesAsync(); - Assert.That(tier.Value.AccessTier, Is.EqualTo(AccessTier.Hot.ToString())); + await Assert.That(tier.Value.AccessTier).IsEqualTo(AccessTier.Hot.ToString()); var tags = (await blobClient.GetTagsAsync()).Value.Tags; - Assert.That(tags["topic"], Is.EqualTo(eventMessage.Header.Topic.Value)); - Assert.That(tags["correlationId"], Is.EqualTo(eventMessage.Header.CorrelationId.Value)); - Assert.That(tags["message_type"], Is.EqualTo(eventMessage.Header.MessageType.ToString())); - Assert.That(DateTime.Parse(tags["timestamp"]), Is.EqualTo(eventMessage.Header.TimeStamp.DateTime)); - Assert.That(tags["content_type"], Is.EqualTo(eventMessage.Header.ContentType!.ToString())); + await Assert.That(tags["topic"]).IsEqualTo(eventMessage.Header.Topic.Value); + await Assert.That(tags["correlationId"]).IsEqualTo(eventMessage.Header.CorrelationId.Value); + await Assert.That(tags["message_type"]).IsEqualTo(eventMessage.Header.MessageType.ToString()); + await Assert.That(DateTime.Parse(tags["timestamp"])).IsEqualTo(eventMessage.Header.TimeStamp.DateTime); + await Assert.That(tags["content_type"]).IsEqualTo(eventMessage.Header.ContentType!.ToString()); } [Test] @@ -113,17 +113,17 @@ public async Task GivenARequestToArchiveAMessageAsync_TheMessageIsArchived() await _provider?.ArchiveMessageAsync(commandMessage, CancellationToken.None)!; - Assert.That((bool)await blobClient.ExistsAsync(), Is.True); + await Assert.That((bool)await blobClient.ExistsAsync()).IsTrue(); var tags = (await blobClient.GetTagsAsync()).Value.Tags; - Assert.That(tags.Count, Is.EqualTo(0)); + await Assert.That(tags.Count).IsEqualTo(0); var body = (await blobClient.DownloadContentAsync()).Value.Content.ToString(); - Assert.That(body, Is.EqualTo(commandMessage.Body.Value)); + await Assert.That(body).IsEqualTo(commandMessage.Body.Value); var tier = await blobClient.GetPropertiesAsync(); - Assert.That(tier.Value.AccessTier, Is.EqualTo(AccessTier.Cool.ToString())); + await Assert.That(tier.Value.AccessTier).IsEqualTo(AccessTier.Cool.ToString()); } @@ -162,10 +162,10 @@ public async Task GivenARequestToArchiveAMessageAsync_WhenParallel_TheMessageIsA foreach (var message in messages) { var blobClient = containerClient.GetBlobClient(_storageLocationFunction.Invoke(message)); - Assert.That((bool)await blobClient.ExistsAsync(), Is.True); + await Assert.That((bool)await blobClient.ExistsAsync()).IsTrue(); var tags = (await blobClient.GetTagsAsync()).Value.Tags; - Assert.That(tags.Count, Is.EqualTo(0)); + await Assert.That(tags.Count).IsEqualTo(0); var body = (await blobClient.DownloadContentAsync()).Value.Content.ToString(); @@ -175,10 +175,10 @@ public async Task GivenARequestToArchiveAMessageAsync_WhenParallel_TheMessageIsA else if (message.Header.MessageType == MessageType.MT_EVENT) brighterBody = JsonSerializer.Serialize(superAwesomeEvents.First(c => c.Id == message.Id)); - Assert.That(body, Is.EqualTo(brighterBody)); + await Assert.That(body).IsEqualTo(brighterBody); var tier = await blobClient.GetPropertiesAsync(); - Assert.That(tier.Value.AccessTier, Is.EqualTo(AccessTier.Cool.ToString())); + await Assert.That(tier.Value.AccessTier).IsEqualTo(AccessTier.Cool.ToString()); } } @@ -199,15 +199,15 @@ public async Task GivenARequestToArchiveAMessageAsync_WhenTagsAreTurnedOn_ThenTa await _provider?.ArchiveMessageAsync(eventMessage, CancellationToken.None)!; var tier = await blobClient.GetPropertiesAsync(); - Assert.That(tier.Value.AccessTier, Is.EqualTo(AccessTier.Hot.ToString())); + await Assert.That(tier.Value.AccessTier).IsEqualTo(AccessTier.Hot.ToString()); var tags = (await blobClient.GetTagsAsync()).Value.Tags; - Assert.That(tags["topic"], Is.EqualTo(eventMessage.Header.Topic.Value)); - Assert.That(tags["correlationId"], Is.EqualTo(eventMessage.Header.CorrelationId.Value)); - Assert.That(tags["message_type"], Is.EqualTo(eventMessage.Header.MessageType.ToString())); - Assert.That(DateTime.Parse(tags["timestamp"]), Is.EqualTo(eventMessage.Header.TimeStamp.DateTime)); - Assert.That(tags["content_type"], Is.EqualTo(eventMessage.Header.ContentType!.ToString())); + await Assert.That(tags["topic"]).IsEqualTo(eventMessage.Header.Topic.Value); + await Assert.That(tags["correlationId"]).IsEqualTo(eventMessage.Header.CorrelationId.Value); + await Assert.That(tags["message_type"]).IsEqualTo(eventMessage.Header.MessageType.ToString()); + await Assert.That(DateTime.Parse(tags["timestamp"])).IsEqualTo(eventMessage.Header.TimeStamp.DateTime); + await Assert.That(tags["content_type"]).IsEqualTo(eventMessage.Header.ContentType!.ToString()); } private BlobContainerClient GetClient(AccessTier tier , bool tags = false ) diff --git a/tests/Paramore.Brighter.Azure.Tests/AzureBlobLockingProviderTests.cs b/tests/Paramore.Brighter.Azure.Tests/AzureBlobLockingProviderTests.cs index ed15483717..5605326f80 100644 --- a/tests/Paramore.Brighter.Azure.Tests/AzureBlobLockingProviderTests.cs +++ b/tests/Paramore.Brighter.Azure.Tests/AzureBlobLockingProviderTests.cs @@ -23,8 +23,8 @@ public async Task GivenAnAzureBlobLockingProvider_WhenLockIsCalled_ItCanOnlyBeOb var firstLock = await _blobLocking.ObtainLockAsync(resourceName, CancellationToken.None); var secondLock = await _blobLocking.ObtainLockAsync(resourceName, CancellationToken.None); - Assert.That(firstLock, Is.Not.Null); - Assert.That(secondLock, Is.Null, "A Lock should not be able to be acquired"); + await Assert.That(firstLock).IsNotNull(); + await Assert.That(secondLock).IsNull(); } [Test] @@ -37,9 +37,9 @@ public async Task GivenAnAzureBlobLockingProviderWithALockedBlob_WhenReleaseLock var secondLock = await _blobLocking.ObtainLockAsync(resourceName, CancellationToken.None); var thirdLock = await _blobLocking.ObtainLockAsync(resourceName, CancellationToken.None); - Assert.That(firstLock, Is.Not.Null); - Assert.That(secondLock, Is.Not.Null, "A Lock should be able to be acquired"); - Assert.That(thirdLock, Is.Null, "A Lock should not be able to be acquired"); + await Assert.That(firstLock).IsNotNull(); + await Assert.That(secondLock).IsNotNull(); + await Assert.That(thirdLock).IsNull(); } } diff --git a/tests/Paramore.Brighter.Azure.Tests/Paramore.Brighter.Azure.Tests.csproj b/tests/Paramore.Brighter.Azure.Tests/Paramore.Brighter.Azure.Tests.csproj index 83a320efbc..8b68609723 100644 --- a/tests/Paramore.Brighter.Azure.Tests/Paramore.Brighter.Azure.Tests.csproj +++ b/tests/Paramore.Brighter.Azure.Tests/Paramore.Brighter.Azure.Tests.csproj @@ -1,34 +1,21 @@ - - - $(BrighterTestTargetFrameworks) - enable - false - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + $(BrighterTestTargetFrameworks) + enable + false + Exe + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + - - + \ No newline at end of file diff --git a/tests/Paramore.Brighter.Azure.Tests/Transformers/When_unwrapping_a_large_message.cs b/tests/Paramore.Brighter.Azure.Tests/Transformers/When_unwrapping_a_large_message.cs index e9ae33bef7..8bc20a720c 100644 --- a/tests/Paramore.Brighter.Azure.Tests/Transformers/When_unwrapping_a_large_message.cs +++ b/tests/Paramore.Brighter.Azure.Tests/Transformers/When_unwrapping_a_large_message.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using Azure.Identity; using Azure.Storage.Blobs; using Paramore.Brighter.Azure.Tests.Helpers; @@ -30,7 +30,6 @@ public LargeMessagePayloadAUnwrapTests() Credential = new AzureCliCredential() }); - TransformPipelineBuilder.ClearPipelineCache(); var mapperRegistry = new MessageMapperRegistry( new SimpleMessageMapperFactory(_ => new MyLargeCommandMessageMapper()), @@ -43,7 +42,7 @@ public LargeMessagePayloadAUnwrapTests() } [Test] - public void When_unwrapping_a_large_message_async() + public async Task When_unwrapping_a_large_message_async() { //arrange Thread.Sleep(3000); //allow bucket definition to propagate @@ -55,8 +54,8 @@ public void When_unwrapping_a_large_message_async() var stream = new MemoryStream(); var writer = new StreamWriter(stream); - writer.Write(commandAsJson); - writer.Flush(); + await writer.WriteAsync(commandAsJson); + await writer.FlushAsync(); stream.Position = 0; var id = _luggageStore.Store(stream); @@ -78,8 +77,8 @@ public void When_unwrapping_a_large_message_async() //assert //contents should be from storage - Assert.Equals(contents, transformedMessage.Value); - Assert.That(_luggageStore.HasClaim(id)); + await Assert.That(transformedMessage.Value).IsEqualTo(contents); + await Assert.That(_luggageStore.HasClaim(id)).IsTrue(); } public void Dispose() diff --git a/tests/Paramore.Brighter.Azure.Tests/Transformers/When_unwrapping_a_large_message_async.cs b/tests/Paramore.Brighter.Azure.Tests/Transformers/When_unwrapping_a_large_message_async.cs index daa6963e8d..30fcfafa45 100644 --- a/tests/Paramore.Brighter.Azure.Tests/Transformers/When_unwrapping_a_large_message_async.cs +++ b/tests/Paramore.Brighter.Azure.Tests/Transformers/When_unwrapping_a_large_message_async.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using Azure.Identity; using Azure.Storage.Blobs; using Paramore.Brighter.Azure.Tests.Helpers; @@ -31,7 +31,6 @@ public LargeMessagePayloadAUnwrapAsyncTests() Credential = new AzureCliCredential() }); - TransformPipelineBuilder.ClearPipelineCache(); var mapperRegistry = new MessageMapperRegistry( new SimpleMessageMapperFactory(_ => new MyLargeCommandMessageMapper()), @@ -79,8 +78,8 @@ public async Task When_unwrapping_a_large_message_async() //assert //contents should be from storage - Assert.Equals(contents, transformedMessage.Value); - Assert.That((await _luggageStore.HasClaimAsync(id, CancellationToken.None))); + await Assert.That(transformedMessage.Value).IsEqualTo(contents); + await Assert.That(await _luggageStore.HasClaimAsync(id, CancellationToken.None)).IsTrue(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.Azure.Tests/Transformers/When_uploading_luggage_to_blob.cs b/tests/Paramore.Brighter.Azure.Tests/Transformers/When_uploading_luggage_to_blob.cs index 31246ddefc..34b9973145 100644 --- a/tests/Paramore.Brighter.Azure.Tests/Transformers/When_uploading_luggage_to_blob.cs +++ b/tests/Paramore.Brighter.Azure.Tests/Transformers/When_uploading_luggage_to_blob.cs @@ -1,4 +1,4 @@ -using Azure.Identity; +using Azure.Identity; using Azure.Storage.Blobs; using Paramore.Brighter.Azure.Tests.Helpers; using Paramore.Brighter.Transformers.Azure; @@ -20,7 +20,7 @@ public AzureBlobUploadTests() } [Test] - public void When_uploading_luggage_to_blob() + public async Task When_uploading_luggage_to_blob() { //arrange var luggageStore = new AzureBlobLuggageStore(new AzureBlobLuggageOptions @@ -29,27 +29,27 @@ public void When_uploading_luggage_to_blob() Credential = new AzureCliCredential() }); - luggageStore.EnsureStoreExists(); + await luggageStore.EnsureStoreExistsAsync(); //act //Upload the test stream to Azure const string testContent = "Well, always know that you shine Brighter"; var stream = new MemoryStream(); var streamWriter = new StreamWriter(stream); - streamWriter.Write(testContent); - streamWriter.Flush(); + await streamWriter.WriteAsync(testContent); + await streamWriter.FlushAsync(); stream.Position = 0; var claim = luggageStore.Store(stream); //assert //do we have a claim? - Assert.That(luggageStore.HasClaim(claim)); + await Assert.That(luggageStore.HasClaim(claim)).IsTrue(); //check for the contents indicated by the claim id on S3 var result = luggageStore.Retrieve(claim); - var resultAsString = new StreamReader(result).ReadToEnd(); - Assert.Equals(testContent, resultAsString); + var resultAsString = await new StreamReader(result).ReadToEndAsync(); + await Assert.That(resultAsString).IsEqualTo(testContent); luggageStore.Delete(claim); } diff --git a/tests/Paramore.Brighter.Azure.Tests/Transformers/When_uploading_luggage_to_blob_async.cs b/tests/Paramore.Brighter.Azure.Tests/Transformers/When_uploading_luggage_to_blob_async.cs index bc71cd1089..8b7f799612 100644 --- a/tests/Paramore.Brighter.Azure.Tests/Transformers/When_uploading_luggage_to_blob_async.cs +++ b/tests/Paramore.Brighter.Azure.Tests/Transformers/When_uploading_luggage_to_blob_async.cs @@ -44,12 +44,12 @@ public async Task When_uploading_luggage_to_blob_async() //assert //do we have a claim? - Assert.That(await luggageStore.HasClaimAsync(claim, CancellationToken.None)); + await Assert.That(await luggageStore.HasClaimAsync(claim, CancellationToken.None)).IsTrue(); //check for the contents indicated by the claim id on S3 var result = await luggageStore.RetrieveAsync(claim, CancellationToken.None); var resultAsString = await new StreamReader(result).ReadToEndAsync(); - Assert.Equals(testContent, resultAsString); + await Assert.That(resultAsString).IsEqualTo(testContent); await luggageStore.DeleteAsync(claim, CancellationToken.None); diff --git a/tests/Paramore.Brighter.Azure.Tests/Transformers/When_wrapping_a_large_message.cs b/tests/Paramore.Brighter.Azure.Tests/Transformers/When_wrapping_a_large_message.cs index 9683941f5d..c168e29db2 100644 --- a/tests/Paramore.Brighter.Azure.Tests/Transformers/When_wrapping_a_large_message.cs +++ b/tests/Paramore.Brighter.Azure.Tests/Transformers/When_wrapping_a_large_message.cs @@ -1,4 +1,4 @@ -using Azure.Identity; +using Azure.Identity; using Azure.Storage.Blobs; using Paramore.Brighter.Azure.Tests.Helpers; using Paramore.Brighter.Azure.Tests.TestDoubles; @@ -22,7 +22,6 @@ public class LargeMessagePayloadWrapTests : IDisposable public LargeMessagePayloadWrapTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); var mapperRegistry = new MessageMapperRegistry( new SimpleMessageMapperFactory(_ => new MyLargeCommandMessageMapper()), @@ -48,23 +47,23 @@ public LargeMessagePayloadWrapTests() } [Test] - public void When_wrapping_a_large_message() + public async Task When_wrapping_a_large_message() { - _luggageStore.EnsureStoreExists(); + await _luggageStore.EnsureStoreExistsAsync(); //act _transformPipeline = _pipelineBuilder.BuildWrapPipeline(); var message = _transformPipeline.Wrap(_myCommand, new RequestContext(), _publication); //assert - Assert.That(message.Header.DataRef, Is.Not.Null); - Assert.That(message.Header.Bag.ContainsKey(ClaimCheckTransformer.CLAIM_CHECK)); - Assert.That(message.Header.DataRef, Is.EqualTo((string)message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK])); + await Assert.That(message.Header.DataRef).IsNotNull(); + await Assert.That(message.Header.Bag.ContainsKey(ClaimCheckTransformer.CLAIM_CHECK)).IsTrue(); + await Assert.That(message.Header.DataRef).IsEqualTo((string)message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK]); _id = (string)message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK]; - Assert.Equals($"Claim Check {_id}", message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo($"Claim Check {_id}"); - Assert.That(_luggageStore.HasClaim(_id)); + await Assert.That(_luggageStore.HasClaim(_id)).IsTrue(); } public void Dispose() diff --git a/tests/Paramore.Brighter.Azure.Tests/Transformers/When_wrapping_a_large_message_async.cs b/tests/Paramore.Brighter.Azure.Tests/Transformers/When_wrapping_a_large_message_async.cs index 8ebeeed9d1..a0defbb661 100644 --- a/tests/Paramore.Brighter.Azure.Tests/Transformers/When_wrapping_a_large_message_async.cs +++ b/tests/Paramore.Brighter.Azure.Tests/Transformers/When_wrapping_a_large_message_async.cs @@ -1,4 +1,4 @@ -using Azure.Identity; +using Azure.Identity; using Azure.Storage.Blobs; using Paramore.Brighter.Azure.Tests.Helpers; using Paramore.Brighter.Azure.Tests.TestDoubles; @@ -23,7 +23,6 @@ public class LargeMessagePayloadAsyncWrapTests : IDisposable public LargeMessagePayloadAsyncWrapTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); var mapperRegistry = new MessageMapperRegistry( new SimpleMessageMapperFactory(_ => new MyLargeCommandMessageMapper()), @@ -58,14 +57,14 @@ public async Task When_wrapping_a_large_message_async() var message = await _transformPipeline.WrapAsync(_myCommand, new RequestContext(), _publication); //assert - Assert.That(message.Header.DataRef, Is.Not.Null); - Assert.That(message.Header.Bag.ContainsKey(ClaimCheckTransformer.CLAIM_CHECK)); - Assert.That(message.Header.DataRef, Is.EqualTo((string)message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK])); + await Assert.That(message.Header.DataRef).IsNotNull(); + await Assert.That(message.Header.Bag.ContainsKey(ClaimCheckTransformer.CLAIM_CHECK)).IsTrue(); + await Assert.That(message.Header.DataRef).IsEqualTo((string)message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK]); _id = (string)message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK]; - Assert.Equals($"Claim Check {_id}", message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo($"Claim Check {_id}"); - Assert.That(await _luggageStore.HasClaimAsync(_id, CancellationToken.None)); + await Assert.That(await _luggageStore.HasClaimAsync(_id, CancellationToken.None)).IsTrue(); } public void Dispose() diff --git a/tests/Paramore.Brighter.Azure.Tests/Usings.cs b/tests/Paramore.Brighter.Azure.Tests/Usings.cs index 324456763a..a905505d18 100644 --- a/tests/Paramore.Brighter.Azure.Tests/Usings.cs +++ b/tests/Paramore.Brighter.Azure.Tests/Usings.cs @@ -1 +1 @@ -global using NUnit.Framework; +// NUnit global using removed during TUnit migration diff --git a/tests/Paramore.Brighter.AzureServiceBus.Tests/AzureServiceBusChannelFactoryTests.cs b/tests/Paramore.Brighter.AzureServiceBus.Tests/AzureServiceBusChannelFactoryTests.cs index 2cbf452974..f4374ad7eb 100644 --- a/tests/Paramore.Brighter.AzureServiceBus.Tests/AzureServiceBusChannelFactoryTests.cs +++ b/tests/Paramore.Brighter.AzureServiceBus.Tests/AzureServiceBusChannelFactoryTests.cs @@ -1,40 +1,39 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.AzureServiceBus.Tests.TestDoubles; -using Xunit; using Paramore.Brighter.MessagingGateway.AzureServiceBus; namespace Paramore.Brighter.AzureServiceBus.Tests; public class AzureServiceBusChannelFactoryTests { - [Fact] - public void When_the_timeout_is_below_400_ms_it_should_throw_an_exception() + [Test] + public async Task When_the_timeout_is_below_400_ms_it_should_throw_an_exception() { var factory = new AzureServiceBusChannelFactory(new AzureServiceBusConsumerFactory(new AzureServiceBusConfiguration("Endpoint=sb://someString.servicebus.windows.net;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=oUWJw7777s7ydjdafqFqhk9O7TOs="))); var subscription = new AzureServiceBusSubscription(new SubscriptionName("name"), new ChannelName("name"), new RoutingKey("name"), bufferSize: 1, noOfPerformers: 1, messagePumpType: MessagePumpType.Proactor, timeOut: TimeSpan.FromMilliseconds(399)); - ArgumentException exception = Assert.Throws(() => factory.CreateSyncChannel(subscription)); + var exception = Assert.ThrowsExactly(() => factory.CreateSyncChannel(subscription)); - Assert.Equal("The minimum allowed timeout is 400 milliseconds", exception.Message); + await Assert.That(exception.Message).IsEqualTo("The minimum allowed timeout is 400 milliseconds"); } - [Fact] - public void When_the_timeout_is_below_400_ms_it_should_throw_an_exception_async_channel() + [Test] + public async Task When_the_timeout_is_below_400_ms_it_should_throw_an_exception_async_channel() { var factory = new AzureServiceBusChannelFactory(new AzureServiceBusConsumerFactory(new AzureServiceBusConfiguration("Endpoint=sb://someString.servicebus.windows.net;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=oUWJw7777s7ydjdafqFqhk9O7TOs="))); var subscription = new AzureServiceBusSubscription(new SubscriptionName("name"), new ChannelName("name"), new RoutingKey("name"), bufferSize:1, noOfPerformers:1, messagePumpType: MessagePumpType.Proactor, timeOut: TimeSpan.FromMilliseconds(399)); - ArgumentException exception = Assert.Throws(() => factory.CreateAsyncChannel(subscription)); + var exception = Assert.ThrowsExactly(() => factory.CreateAsyncChannel(subscription)); - Assert.Equal("The minimum allowed timeout is 400 milliseconds", exception.Message); + await Assert.That(exception.Message).IsEqualTo("The minimum allowed timeout is 400 milliseconds"); } - [Fact] + [Test] public async Task When_the_timeout_is_below_400_ms_it_should_throw_an_exception_async_channel_async() { var factory = new AzureServiceBusChannelFactory(new AzureServiceBusConsumerFactory(new AzureServiceBusConfiguration("Endpoint=sb://someString.servicebus.windows.net;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=oUWJw7777s7ydjdafqFqhk9O7TOs="))); @@ -42,8 +41,8 @@ public async Task When_the_timeout_is_below_400_ms_it_should_throw_an_exception_ var subscription = new AzureServiceBusSubscription(new SubscriptionName("name"), new ChannelName("name"), new RoutingKey("name"), bufferSize:1, noOfPerformers:1, messagePumpType: MessagePumpType.Proactor, timeOut: TimeSpan.FromMilliseconds(399)); - ArgumentException exception = await Assert.ThrowsAsync(() => factory.CreateAsyncChannelAsync(subscription)); + var exception = await Assert.ThrowsAsync(() => factory.CreateAsyncChannelAsync(subscription)); - Assert.Equal("The minimum allowed timeout is 400 milliseconds", exception.Message); + await Assert.That(exception.Message).IsEqualTo("The minimum allowed timeout is 400 milliseconds"); } } diff --git a/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/Proactor/AzureServiceBusBulkMessageProducerTestsAsync.cs b/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/Proactor/AzureServiceBusBulkMessageProducerTestsAsync.cs index 9989eb0001..26ad64b22f 100644 --- a/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/Proactor/AzureServiceBusBulkMessageProducerTestsAsync.cs +++ b/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/Proactor/AzureServiceBusBulkMessageProducerTestsAsync.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Net.Mime; @@ -7,7 +7,6 @@ using Azure.Messaging.ServiceBus; using Paramore.Brighter.AzureServiceBus.Tests.Fakes; using Paramore.Brighter.MessagingGateway.AzureServiceBus; -using Xunit; namespace Paramore.Brighter.AzureServiceBus.Tests.MessagingGateway.Proactor; @@ -38,7 +37,7 @@ public AzureServiceBusBulkMessageProducerTestsAsync() ); } - [Fact] + [Test] public async Task When_the_topic_exists_and_sending_a_batch_with_one_message_it_should_send_the_message_to_the_correct_topicclient() { @@ -61,14 +60,14 @@ public async Task ServiceBusMessage sentMessage = _topicClient.SentMessages.Single(); - Assert.Equal(messageBody, sentMessage.Body.ToArray()); - Assert.Equal("MT_EVENT", sentMessage.ApplicationProperties["MessageType"]); - Assert.Equal(2, _topicClient.ClosedCount); + await Assert.That(sentMessage.Body.ToArray()).IsEqualTo(messageBody); + await Assert.That(sentMessage.ApplicationProperties["MessageType"]).IsEqualTo("MT_EVENT"); + await Assert.That(_topicClient.ClosedCount).IsEqualTo(2); } - [Theory] - [InlineData(false)] - [InlineData(true)] + [Test] + [Arguments(false)] + [Arguments(true)] public async Task When_sending_a_command_message_type_message_it_should_set_the_correct_messagetype_property( bool useQueues) { @@ -92,14 +91,14 @@ public async Task When_sending_a_command_message_type_message_it_should_set_the_ ServiceBusMessage sentMessage = _topicClient.SentMessages.Single(); - Assert.Equal(messageBody, sentMessage.Body.ToArray()); - Assert.Equal("MT_COMMAND", sentMessage.ApplicationProperties["MessageType"]); - Assert.Equal(2, _topicClient.ClosedCount); + await Assert.That(sentMessage.Body.ToArray()).IsEqualTo(messageBody); + await Assert.That(sentMessage.ApplicationProperties["MessageType"]).IsEqualTo("MT_COMMAND"); + await Assert.That(_topicClient.ClosedCount).IsEqualTo(2); } - [Theory] - [InlineData(false)] - [InlineData(true)] + [Test] + [Arguments(false)] + [Arguments(true)] public async Task When_the_topic_does_not_exist_it_should_be_created_and_the_message_is_sent_to_the_correct_topicclient( bool useQueues) @@ -122,13 +121,13 @@ public async Task ServiceBusMessage sentMessage = _topicClient.SentMessages.Single(); - Assert.Equal(1, _nameSpaceManagerWrapper.CreateCount); - Assert.Equal(messageBody, sentMessage.Body.ToArray()); + await Assert.That(_nameSpaceManagerWrapper.CreateCount).IsEqualTo(1); + await Assert.That(sentMessage.Body.ToArray()).IsEqualTo(messageBody); } - [Theory] - [InlineData(false)] - [InlineData(true)] + [Test] + [Arguments(false)] + [Arguments(true)] public async Task When_a_message_batch_is_created_and_an_exception_occurs_close_is_still_called(bool useQueues) { byte[] messageBody = Encoding.UTF8.GetBytes("A message body"); @@ -158,12 +157,12 @@ public async Task When_a_message_batch_is_created_and_an_exception_occurs_close_ // ignored } - Assert.Equal(1, _topicClient.ClosedCount); + await Assert.That(_topicClient.ClosedCount).IsEqualTo(1); } - [Theory] - [InlineData(false)] - [InlineData(true)] + [Test] + [Arguments(false)] + [Arguments(true)] public async Task When_a_message_batch_is_send_and_an_exception_occurs_close_is_still_called(bool useQueues) { byte[] messageBody = Encoding.UTF8.GetBytes("A message body"); @@ -192,10 +191,10 @@ public async Task When_a_message_batch_is_send_and_an_exception_occurs_close_is_ // ignored } - Assert.Equal(2, _topicClient.ClosedCount); + await Assert.That(_topicClient.ClosedCount).IsEqualTo(2); } - [Fact] + [Test] public async Task When_a_message_batch_is_created_for_a_couple_message_that_exceeds_message_batch_size_a_new_batch_is_created() { @@ -227,14 +226,14 @@ public async Task ServiceBusMessage sentMessage1 = _topicClient.SentMessages.Single(x => x.MessageId == message1.Id.Value); ServiceBusMessage sentMessage2 = _topicClient.SentMessages.Single(x => x.MessageId == message2.Id.Value); - Assert.Equal(2, batches.Count()); - Assert.Equal(message1.Body.Value, sentMessage1.Body.ToString()); - Assert.Equal("MT_COMMAND", sentMessage1.ApplicationProperties["MessageType"]); - Assert.Equal(message2.Body.Value, sentMessage2.Body.ToString()); - Assert.Equal("MT_COMMAND", sentMessage2.ApplicationProperties["MessageType"]); + await Assert.That(batches.Count()).IsEqualTo(2); + await Assert.That(sentMessage1.Body.ToString()).IsEqualTo(message1.Body.Value); + await Assert.That(sentMessage1.ApplicationProperties["MessageType"]).IsEqualTo("MT_COMMAND"); + await Assert.That(sentMessage2.Body.ToString()).IsEqualTo(message2.Body.Value); + await Assert.That(sentMessage2.ApplicationProperties["MessageType"]).IsEqualTo("MT_COMMAND"); } - [Fact] + [Test] public async Task When_a_message_batch_is_created_for_a_single_message_that_exceeds_message_batch_size_a_single_message_batch_is_created() { @@ -254,13 +253,13 @@ public async Task ServiceBusMessage sentMessage1 = _topicClient.SentMessages.Single(x => x.MessageId == message1.Id.Value); AzureServiceBusSingleMessageBatch? singleMessageBatch = batches.First() as AzureServiceBusSingleMessageBatch; - Assert.Single(batches); - Assert.True(singleMessageBatch is not null); - Assert.Equal(message1.Body.Value, sentMessage1.Body.ToString()); - Assert.Equal("MT_COMMAND", sentMessage1.ApplicationProperties["MessageType"]); + await Assert.That(batches).HasSingleItem(); + await Assert.That(singleMessageBatch is not null).IsTrue(); + await Assert.That(sentMessage1.Body.ToString()).IsEqualTo(message1.Body.Value); + await Assert.That(sentMessage1.ApplicationProperties["MessageType"]).IsEqualTo("MT_COMMAND"); } - [Fact] + [Test] public async Task When_a_message_batch_is_created_for_a_few_messages_with_1_that_exceeds_message_batch_size_a_new_batch_is_created() { @@ -296,12 +295,12 @@ public async Task ServiceBusMessage sentMessage2 = _topicClient.SentMessages.Single(x => x.MessageId == message2.Id.Value); ServiceBusMessage sentMessage3 = _topicClient.SentMessages.Single(x => x.MessageId == message3.Id.Value); - Assert.Equal(2, batches.Count()); - Assert.Equal(message1.Body.Value, sentMessage1.Body.ToString()); - Assert.Equal("MT_COMMAND", sentMessage1.ApplicationProperties["MessageType"]); - Assert.Equal(message2.Body.Value, sentMessage2.Body.ToString()); - Assert.Equal("MT_COMMAND", sentMessage2.ApplicationProperties["MessageType"]); - Assert.Equal(message3.Body.Value, sentMessage3.Body.ToString()); - Assert.Equal("MT_COMMAND", sentMessage3.ApplicationProperties["MessageType"]); + await Assert.That(batches.Count()).IsEqualTo(2); + await Assert.That(sentMessage1.Body.ToString()).IsEqualTo(message1.Body.Value); + await Assert.That(sentMessage1.ApplicationProperties["MessageType"]).IsEqualTo("MT_COMMAND"); + await Assert.That(sentMessage2.Body.ToString()).IsEqualTo(message2.Body.Value); + await Assert.That(sentMessage2.ApplicationProperties["MessageType"]).IsEqualTo("MT_COMMAND"); + await Assert.That(sentMessage3.Body.ToString()).IsEqualTo(message3.Body.Value); + await Assert.That(sentMessage3.ApplicationProperties["MessageType"]).IsEqualTo("MT_COMMAND"); } } diff --git a/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/Proactor/AzureServiceBusConsumerTestsAsync.cs b/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/Proactor/AzureServiceBusConsumerTestsAsync.cs index 404e7d4d84..0614b39297 100644 --- a/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/Proactor/AzureServiceBusConsumerTestsAsync.cs +++ b/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/Proactor/AzureServiceBusConsumerTestsAsync.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -8,7 +8,6 @@ using Paramore.Brighter.AzureServiceBus.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AzureServiceBus; using Paramore.Brighter.MessagingGateway.AzureServiceBus.AzureServiceBusWrappers; -using Xunit; namespace Paramore.Brighter.AzureServiceBus.Tests.MessagingGateway.Proactor; @@ -37,7 +36,7 @@ public AzureServiceBusConsumerTestsAsync() _nameSpaceManagerWrapper, _fakeMessageReceiver); } - [Fact] + [Test] public async Task When_a_subscription_exists_and_messages_are_in_the_queue_the_messages_are_returned() { _nameSpaceManagerWrapper.ResetState(); @@ -63,16 +62,16 @@ public async Task When_a_subscription_exists_and_messages_are_in_the_queue_the_m Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Equal("somebody", result[0].Body.Value); - Assert.Equal("topic", result[0].Header.Topic); - Assert.Equal(MessageType.MT_EVENT, result[0].Header.MessageType); + await Assert.That(result[0].Body.Value).IsEqualTo("somebody"); + await Assert.That(result[0].Header.Topic).IsEqualTo("topic"); + await Assert.That(result[0].Header.MessageType).IsEqualTo(MessageType.MT_EVENT); - Assert.Equal("somebody2", result[1].Body.Value); - Assert.Equal("topic", result[1].Header.Topic); - Assert.Equal(MessageType.MT_DOCUMENT, result[1].Header.MessageType); + await Assert.That(result[1].Body.Value).IsEqualTo("somebody2"); + await Assert.That(result[1].Header.Topic).IsEqualTo("topic"); + await Assert.That(result[1].Header.MessageType).IsEqualTo(MessageType.MT_DOCUMENT); } - [Fact] + [Test] public async Task When_a_subscription_does_not_exist_and_messages_are_in_the_queue_then_the_subscription_is_created_and_messages_are_returned() { _nameSpaceManagerWrapper.ResetState(); @@ -90,10 +89,10 @@ public async Task When_a_subscription_does_not_exist_and_messages_are_in_the_que Message[] result =await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); await _nameSpaceManagerWrapper.SubscriptionExistsAsync("topic", "subscription"); - Assert.Equal("somebody", result[0].Body.Value); + await Assert.That(result[0].Body.Value).IsEqualTo("somebody"); } - [Fact] + [Test] public async Task When_a_message_is_a_command_type_then_the_message_type_is_set_correctly() { _nameSpaceManagerWrapper.ResetState(); @@ -111,12 +110,12 @@ public async Task When_a_message_is_a_command_type_then_the_message_type_is_set_ Message[] result =await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Equal("somebody", result[0].Body.Value); - Assert.Equal("topic", result[0].Header.Topic); - Assert.Equal(MessageType.MT_COMMAND, result[0].Header.MessageType); + await Assert.That(result[0].Body.Value).IsEqualTo("somebody"); + await Assert.That(result[0].Header.Topic).IsEqualTo("topic"); + await Assert.That(result[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); } - [Fact] + [Test] public async Task When_a_message_is_a_command_type_and_it_is_specified_in_funny_casing_then_the_message_type_is_set_correctly() { _nameSpaceManagerWrapper.ResetState(); @@ -134,12 +133,12 @@ public async Task When_a_message_is_a_command_type_and_it_is_specified_in_funny_ Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Equal("somebody", result[0].Body.Value); - Assert.Equal("topic", result[0].Header.Topic); - Assert.Equal(MessageType.MT_COMMAND, result[0].Header.MessageType); + await Assert.That(result[0].Body.Value).IsEqualTo("somebody"); + await Assert.That(result[0].Header.Topic).IsEqualTo("topic"); + await Assert.That(result[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); } - [Fact] + [Test] public async Task When_the_specified_message_type_is_unknown_then_it_should_default_to_MT_EVENT() { _nameSpaceManagerWrapper.ResetState(); @@ -157,10 +156,10 @@ public async Task When_the_specified_message_type_is_unknown_then_it_should_defa Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Equal(MessageType.MT_EVENT, result[0].Header.MessageType); + await Assert.That(result[0].Header.MessageType).IsEqualTo(MessageType.MT_EVENT); } - [Fact] + [Test] public async Task When_the_message_type_is_not_specified_it_should_default_to_MT_EVENT() { _nameSpaceManagerWrapper.ResetState(); @@ -178,12 +177,12 @@ public async Task When_the_message_type_is_not_specified_it_should_default_to_MT Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Equal("somebody", result[0].Body.Value); - Assert.Equal("topic", result[0].Header.Topic); - Assert.Equal(MessageType.MT_EVENT, result[0].Header.MessageType); + await Assert.That(result[0].Body.Value).IsEqualTo("somebody"); + await Assert.That(result[0].Header.Topic).IsEqualTo("topic"); + await Assert.That(result[0].Header.MessageType).IsEqualTo(MessageType.MT_EVENT); } - [Fact] + [Test] public async Task When_the_user_properties_on_the_azure_sb_message_is_null_it_should_default_to_message_type_to_MT_EVENT() { _nameSpaceManagerWrapper.ResetState(); @@ -202,12 +201,12 @@ public async Task When_the_user_properties_on_the_azure_sb_message_is_null_it_sh Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Equal("somebody", result[0].Body.Value); - Assert.Equal("topic", result[0].Header.Topic); - Assert.Equal(MessageType.MT_EVENT, result[0].Header.MessageType); + await Assert.That(result[0].Body.Value).IsEqualTo("somebody"); + await Assert.That(result[0].Header.Topic).IsEqualTo("topic"); + await Assert.That(result[0].Header.MessageType).IsEqualTo(MessageType.MT_EVENT); } - [Fact] + [Test] public async Task When_there_are_no_messages_then_it_returns_an_empty_array() { _nameSpaceManagerWrapper.ResetState(); @@ -217,10 +216,10 @@ public async Task When_there_are_no_messages_then_it_returns_an_empty_array() _messageReceiver.MessageQueue = brokeredMessageList; Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Empty(result); + await Assert.That(result).IsEmpty(); } - [Fact] + [Test] public async Task When_trying_to_create_a_subscription_which_was_already_created_by_another_thread_it_should_ignore_the_error() { _nameSpaceManagerWrapper.ResetState(); @@ -239,10 +238,10 @@ public async Task When_trying_to_create_a_subscription_which_was_already_created Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Equal("somebody", result[0].Body.Value); + await Assert.That(result[0].Body.Value).IsEqualTo("somebody"); } - [Fact] + [Test] public async Task When_dispose_is_called_the_close_method_is_called() { _nameSpaceManagerWrapper.ResetState(); @@ -250,10 +249,10 @@ public async Task When_dispose_is_called_the_close_method_is_called() await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.Zero); await _azureServiceBusConsumer.DisposeAsync(); - Assert.True(_messageReceiver.IsClosedOrClosing); + await Assert.That(_messageReceiver.IsClosedOrClosing).IsTrue(); } - [Fact] + [Test] public async Task When_requeue_is_called_and_the_delay_is_zero_the_send_method_is_called() { _nameSpaceManagerWrapper.ResetState(); @@ -266,11 +265,11 @@ public async Task When_requeue_is_called_and_the_delay_is_zero_the_send_method_i await _azureServiceBusConsumer.RequeueAsync(message, TimeSpan.Zero); - Assert.Single(_fakeMessageProducer.SentMessages); + await Assert.That(_fakeMessageProducer.SentMessages).HasSingleItem(); } - [Fact] - public void When_requeue_is_called_and_the_delay_is_more_than_zero_the_sendWithDelay_method_is_called() + [Test] + public async Task When_requeue_is_called_and_the_delay_is_more_than_zero_the_sendWithDelay_method_is_called() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.Topics.Add("topic", new ()); @@ -281,36 +280,35 @@ public void When_requeue_is_called_and_the_delay_is_more_than_zero_the_sendWithD var message = new Message(messageHeader, new MessageBody("body")); message.Header.Bag.Add("LockToken", messageLockTokenOne); - _azureServiceBusConsumer.Requeue(message, TimeSpan.FromMilliseconds(100)); + await _azureServiceBusConsumer.RequeueAsync(message, TimeSpan.FromMilliseconds(100)); - Assert.Single(_fakeMessageProducer.SentMessages); + await Assert.That(_fakeMessageProducer.SentMessages).HasSingleItem(); } - [Fact] - public void - When_there_is_an_error_talking_to_servicebus_when_checking_if_subscription_exist_then_a_ChannelFailureException_is_raised() + [Test] + public async Task When_there_is_an_error_talking_to_servicebus_when_checking_if_subscription_exist_then_a_ChannelFailureException_is_raised() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.CreateSubscriptionException = new Exception(); - Assert.Throws(() => _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400))); + await Assert.That(() => _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400))).ThrowsExactly(); } - [Fact] - public void When_there_is_an_error_talking_to_servicebus_when_creating_the_subscription_then_a_ChannelFailureException_is_raised_and_ManagementClientWrapper_is_reinitilised() + [Test] + public async Task When_there_is_an_error_talking_to_servicebus_when_creating_the_subscription_then_a_ChannelFailureException_is_raised_and_ManagementClientWrapper_is_reinitilised() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.CreateSubscriptionException = new Exception(); - Assert.Throws(() => _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400))); - Assert.Equal(1, _nameSpaceManagerWrapper.ResetCount); + await Assert.That(() => _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400))).ThrowsExactly(); + await Assert.That(_nameSpaceManagerWrapper.ResetCount).IsEqualTo(1); } /// /// TODO: review /// - [Fact] - public void When_there_is_an_error_talking_to_servicebus_when_receiving_then_a_ChannelFailureException_is_raised_and_the_messageReceiver_is_recreated() + [Test] + public async Task When_there_is_an_error_talking_to_servicebus_when_receiving_then_a_ChannelFailureException_is_raised_and_the_messageReceiver_is_recreated() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.Topics.Add("topic", ["subscription"]); @@ -318,13 +316,13 @@ public void When_there_is_an_error_talking_to_servicebus_when_receiving_then_a_C _messageReceiver.MessageQueue.Clear(); _messageReceiver.ReceiveException = new Exception(); - Assert.Throws(() => _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400))); - Assert.Equal(2, _fakeMessageReceiver.CreationCount); + await Assert.That(() => _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400))).ThrowsExactly(); + await Assert.That(_fakeMessageReceiver.CreationCount).IsEqualTo(2); } - [Theory] - [InlineData(true)] - [InlineData(false)] + [Test] + [Arguments(true)] + [Arguments(false)] public async Task Once_the_subscription_is_created_or_exits_it_does_not_check_if_it_exists_every_time(bool subscriptionExists) { _nameSpaceManagerWrapper.ResetState(); @@ -341,17 +339,17 @@ public async Task Once_the_subscription_is_created_or_exits_it_does_not_check_if _messageReceiver.MessageQueue = brokeredMessageList; - _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); - _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); + await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); + await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); //Subscription is only created once - Assert.Equal(1, _nameSpaceManagerWrapper.Topics["topic"].Count(s => s.Equals("subscription"))); + await Assert.That(_nameSpaceManagerWrapper.Topics["topic"].Count(s => s.Equals("subscription"))).IsEqualTo(1); - Assert.Equal(1, _nameSpaceManagerWrapper.ExistCount); + await Assert.That(_nameSpaceManagerWrapper.ExistCount).IsEqualTo(1); } - [Fact] - public void When_MessagingEntityAlreadyExistsException_does_not_check_if_subscription_exists() + [Test] + public async Task When_MessagingEntityAlreadyExistsException_does_not_check_if_subscription_exists() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.Topics.Add("topic", new ()); @@ -369,16 +367,16 @@ public void When_MessagingEntityAlreadyExistsException_does_not_check_if_subscri _messageReceiver.MessageQueue = brokeredMessageList; - Message[] result = _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); - _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); + Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); + await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Equal("somebody", result[0].Body.Value); + await Assert.That(result[0].Body.Value).IsEqualTo("somebody"); - Assert.Equal(1, _nameSpaceManagerWrapper.ExistCount); + await Assert.That(_nameSpaceManagerWrapper.ExistCount).IsEqualTo(1); } - [Fact] - public void When_a_message_contains_a_null_body_message_is_still_processed() + [Test] + public async Task When_a_message_contains_a_null_body_message_is_still_processed() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.Topics.Add("topic", new ()); @@ -396,25 +394,25 @@ public void When_a_message_contains_a_null_body_message_is_still_processed() _messageReceiver.MessageQueue = brokeredMessageList; - Message[] result = _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); + Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Equal(string.Empty, result[0].Body.Value); + await Assert.That(result[0].Body.Value).IsEqualTo(string.Empty); } - [Fact] - public void When_receiving_messages_and_the_receiver_is_closing_a_MT_QUIT_message_is_sent() + [Test] + public async Task When_receiving_messages_and_the_receiver_is_closing_a_MT_QUIT_message_is_sent() { _nameSpaceManagerWrapper.Topics.Add("topic", new ()); - _messageReceiver.Close(); + await _messageReceiver.CloseAsync(); - Message[] result = _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); + Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Equal(MessageType.MT_QUIT, result[0].Header.MessageType); + await Assert.That(result[0].Header.MessageType).IsEqualTo(MessageType.MT_QUIT); } - [Fact] - public void When_a_subscription_does_not_exist_and_Missing_is_set_to_Validate_a_Channel_Failure_is_Raised() + [Test] + public async Task When_a_subscription_does_not_exist_and_Missing_is_set_to_Validate_a_Channel_Failure_is_Raised() { _nameSpaceManagerWrapper.ResetState(); @@ -424,6 +422,6 @@ public void When_a_subscription_does_not_exist_and_Missing_is_set_to_Validate_a_ var azureServiceBusConsumerValidate = new AzureServiceBusTopicConsumer(sub, _fakeMessageProducer, _nameSpaceManagerWrapper, _fakeMessageReceiver); - Assert.Throws(() => azureServiceBusConsumerValidate.Receive(TimeSpan.FromMilliseconds(400))); + await Assert.That(() => azureServiceBusConsumerValidate.Receive(TimeSpan.FromMilliseconds(400))).ThrowsExactly(); } } diff --git a/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/Proactor/AzureServiceBusMessageProducerTestsAsync.cs b/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/Proactor/AzureServiceBusMessageProducerTestsAsync.cs index 6893c2525f..d8ddc932af 100644 --- a/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/Proactor/AzureServiceBusMessageProducerTestsAsync.cs +++ b/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/Proactor/AzureServiceBusMessageProducerTestsAsync.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Net.Mime; using System.Text; @@ -6,7 +6,6 @@ using Azure.Messaging.ServiceBus; using Paramore.Brighter.AzureServiceBus.Tests.Fakes; using Paramore.Brighter.MessagingGateway.AzureServiceBus; -using Xunit; namespace Paramore.Brighter.AzureServiceBus.Tests.MessagingGateway.Proactor { @@ -38,7 +37,7 @@ public AzureServiceBusMessageProducerTestsAsync() ); } - [Fact] + [Test] public async Task When_the_topic_exists_and_sending_a_message_with_no_delay_it_should_send_the_message_to_the_correct_topicclient() { var messageBody = Encoding.UTF8.GetBytes("A message body"); @@ -53,14 +52,14 @@ await _producer.SendAsync(new Message( ServiceBusMessage sentMessage = _topicClient.SentMessages.First(); - Assert.Equal(messageBody, sentMessage.Body.ToArray()); - Assert.Equal("MT_EVENT", sentMessage.ApplicationProperties["MessageType"]); - Assert.Equal(1, _topicClient.ClosedCount); + await Assert.That(sentMessage.Body.ToArray()).IsEqualTo(messageBody); + await Assert.That(sentMessage.ApplicationProperties["MessageType"]).IsEqualTo("MT_EVENT"); + await Assert.That(_topicClient.ClosedCount).IsEqualTo(1); } - [Theory] - [InlineData(false)] - [InlineData(true)] + [Test] + [Arguments(false)] + [Arguments(true)] public async Task When_sending_a_command_message_type_message_with_no_delay_it_should_set_the_correct_messagetype_property(bool useQueues) { var messageBody = Encoding.UTF8.GetBytes("A message body"); @@ -78,14 +77,14 @@ await producer.SendAsync(new Message( ServiceBusMessage sentMessage = _topicClient.SentMessages.First(); - Assert.Equal(messageBody, sentMessage.Body.ToArray()); - Assert.Equal("MT_COMMAND", sentMessage.ApplicationProperties["MessageType"]); - Assert.Equal(1, _topicClient.ClosedCount); + await Assert.That(sentMessage.Body.ToArray()).IsEqualTo(messageBody); + await Assert.That(sentMessage.ApplicationProperties["MessageType"]).IsEqualTo("MT_COMMAND"); + await Assert.That(_topicClient.ClosedCount).IsEqualTo(1); } - [Theory] - [InlineData(false)] - [InlineData(true)] + [Test] + [Arguments(false)] + [Arguments(true)] public async Task When_the_topic_does_not_exist_it_should_be_created_and_the_message_is_sent_to_the_correct_topicclient(bool useQueues) { var messageBody = Encoding.UTF8.GetBytes("A message body"); @@ -100,13 +99,13 @@ await producer.SendAsync(new Message( ServiceBusMessage sentMessage = _topicClient.SentMessages.First(); - Assert.Equal(1, _nameSpaceManagerWrapper.CreateCount); - Assert.Equal(messageBody, sentMessage.Body.ToArray()); + await Assert.That(_nameSpaceManagerWrapper.CreateCount).IsEqualTo(1); + await Assert.That(sentMessage.Body.ToArray()).IsEqualTo(messageBody); } - [Theory] - [InlineData(false)] - [InlineData(true)] + [Test] + [Arguments(false)] + [Arguments(true)] public async Task When_a_message_is_send_and_an_exception_occurs_close_is_still_called(bool useQueues) { _nameSpaceManagerWrapper.ResetState(); @@ -128,12 +127,12 @@ await producer.SendAsync(new Message( // ignored } - Assert.Equal(1, _topicClient.ClosedCount); + await Assert.That(_topicClient.ClosedCount).IsEqualTo(1); } - [Theory] - [InlineData(false)] - [InlineData(true)] + [Test] + [Arguments(false)] + [Arguments(true)] public async Task When_the_topic_exists_and_sending_a_message_with_a_delay_it_should_send_the_message_to_the_correct_topicclient(bool useQueues) { var messageBody = Encoding.UTF8.GetBytes("A message body"); @@ -151,14 +150,14 @@ await producer.SendWithDelayAsync( ServiceBusMessage sentMessage = _topicClient.SentMessages.First(); - Assert.Equal(messageBody, sentMessage.Body.ToArray()); - Assert.Equal("MT_EVENT", sentMessage.ApplicationProperties["MessageType"]); - Assert.Equal(1, _topicClient.ClosedCount); + await Assert.That(sentMessage.Body.ToArray()).IsEqualTo(messageBody); + await Assert.That(sentMessage.ApplicationProperties["MessageType"]).IsEqualTo("MT_EVENT"); + await Assert.That(_topicClient.ClosedCount).IsEqualTo(1); } - [Theory] - [InlineData(false)] - [InlineData(true)] + [Test] + [Arguments(false)] + [Arguments(true)] public async Task When_sending_a_command_message_type_message_with_delay_it_should_set_the_correct_messagetype_property(bool useQueues) { var messageBody = Encoding.UTF8.GetBytes("A message body"); @@ -175,14 +174,14 @@ await producer.SendWithDelayAsync(new Message( ServiceBusMessage sentMessage = _topicClient.SentMessages.First(); - Assert.Equal(messageBody, sentMessage.Body.ToArray()); - Assert.Equal("MT_COMMAND", sentMessage.ApplicationProperties["MessageType"]); - Assert.Equal(1, _topicClient.ClosedCount); + await Assert.That(sentMessage.Body.ToArray()).IsEqualTo(messageBody); + await Assert.That(sentMessage.ApplicationProperties["MessageType"]).IsEqualTo("MT_COMMAND"); + await Assert.That(_topicClient.ClosedCount).IsEqualTo(1); } - [Theory] - [InlineData(false)] - [InlineData(true)] + [Test] + [Arguments(false)] + [Arguments(true)] public async Task When_the_topic_does_not_exist_and_sending_a_message_with_a_delay_it_should_send_the_message_to_the_correct_topicclient(bool useQueues) { var messageBody = Encoding.UTF8.GetBytes("A message body"); @@ -197,17 +196,17 @@ await producer.SendWithDelayAsync(new Message( ServiceBusMessage sentMessage = _topicClient.SentMessages.First(); - Assert.Equal(1, _nameSpaceManagerWrapper.CreateCount); + await Assert.That(_nameSpaceManagerWrapper.CreateCount).IsEqualTo(1); - Assert.Equal(messageBody, sentMessage.Body.ToArray()); - Assert.Equal(1, _topicClient.ClosedCount); + await Assert.That(sentMessage.Body.ToArray()).IsEqualTo(messageBody); + await Assert.That(_topicClient.ClosedCount).IsEqualTo(1); } - [Theory] - [InlineData(true, true)] - [InlineData(false, true)] - [InlineData(true, false)] - [InlineData(false, false)] + [Test] + [Arguments(true, true)] + [Arguments(false, true)] + [Arguments(true, false)] + [Arguments(false, false)] public async Task Once_the_topic_is_created_it_then_does_not_check_if_it_exists_every_time(bool topicExists, bool useQueues) { var messageBody = Encoding.UTF8.GetBytes("A message body"); @@ -231,14 +230,14 @@ await producer.SendWithDelayAsync(new Message( new MessageBody(messageBody, new ContentType(MediaTypeNames.Application.Json))), TimeSpan.FromSeconds(1)); if (topicExists == false) - Assert.Equal(1, _nameSpaceManagerWrapper.CreateCount); + await Assert.That(_nameSpaceManagerWrapper.CreateCount).IsEqualTo(1); - Assert.Equal(1, _nameSpaceManagerWrapper.ExistCount); + await Assert.That(_nameSpaceManagerWrapper.ExistCount).IsEqualTo(1); } - [Theory] - [InlineData(false)] - [InlineData(true)] + [Test] + [Arguments(false)] + [Arguments(true)] public async Task When_there_is_an_error_talking_to_servicebus_when_creating_the_topic_the_ManagementClientWrapper_is_reinitilised(bool useQueues) { var messageBody = Encoding.UTF8.GetBytes("A message body"); @@ -252,14 +251,14 @@ await Assert.ThrowsAsync(() => producer.SendWithDelayAsync( new MessageHeader(Id.Random(), new RoutingKey("topic"), MessageType.MT_NONE), new MessageBody(messageBody, new ContentType(MediaTypeNames.Application.Json))), TimeSpan.FromSeconds(1)) ); - Assert.Equal(1, _nameSpaceManagerWrapper.ResetCount); + await Assert.That(_nameSpaceManagerWrapper.ResetCount).IsEqualTo(1); } - [Theory] - [InlineData(false)] - [InlineData(true)] - public void When_there_is_an_error_getting_a_topic_client_the_connection_for_topic_client_is_retried(bool useQueues) + [Test] + [Arguments(false)] + [Arguments(true)] + public async Task When_there_is_an_error_getting_a_topic_client_the_connection_for_topic_client_is_retried(bool useQueues) { var messageBody = Encoding.UTF8.GetBytes("A message body"); @@ -271,15 +270,15 @@ public void When_there_is_an_error_getting_a_topic_client_the_connection_for_top var producer = useQueues ? _queueProducer : _producer; - producer.SendWithDelay(new Message( - new MessageHeader(Id.Random(), new RoutingKey("topic"), MessageType.MT_NONE), - new MessageBody(messageBody, new ContentType(MediaTypeNames.Application.Json))) - ); + await producer.SendWithDelayAsync(new Message( + new MessageHeader(Id.Random(), new RoutingKey("topic"), MessageType.MT_NONE), + new MessageBody(messageBody, new ContentType(MediaTypeNames.Application.Json))) + ); - Assert.Single(_topicClient.SentMessages); + await Assert.That(_topicClient.SentMessages).HasSingleItem(); } - [Fact] + [Test] public async Task When_the_topic_does_not_exist_and_Missing_is_set_to_Validate_an_exception_is_raised() { var messageBody = Encoding.UTF8.GetBytes("A message body"); diff --git a/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/Reactor/AzureServiceBusConsumerTests.cs b/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/Reactor/AzureServiceBusConsumerTests.cs index 0216ee10c7..e8e28e098e 100644 --- a/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/Reactor/AzureServiceBusConsumerTests.cs +++ b/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/Reactor/AzureServiceBusConsumerTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -8,7 +8,6 @@ using Paramore.Brighter.AzureServiceBus.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.AzureServiceBus; using Paramore.Brighter.MessagingGateway.AzureServiceBus.AzureServiceBusWrappers; -using Xunit; namespace Paramore.Brighter.AzureServiceBus.Tests.MessagingGateway.Reactor; @@ -37,8 +36,8 @@ public AzureServiceBusConsumerTests() _nameSpaceManagerWrapper, _fakeMessageReceiver); } - [Fact] - public void When_a_subscription_exists_and_messages_are_in_the_queue_the_messages_are_returned() + [Test] + public async Task When_a_subscription_exists_and_messages_are_in_the_queue_the_messages_are_returned() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.Topics.Add("topic", ["subscription"]); @@ -61,18 +60,18 @@ public void When_a_subscription_exists_and_messages_are_in_the_queue_the_message _messageReceiver.MessageQueue = brokeredMessageList; - Message[] result = _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); + Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Equal("somebody", result[0].Body.Value); - Assert.Equal("topic", result[0].Header.Topic); - Assert.Equal(MessageType.MT_EVENT, result[0].Header.MessageType); + await Assert.That(result[0].Body.Value).IsEqualTo("somebody"); + await Assert.That(result[0].Header.Topic).IsEqualTo("topic"); + await Assert.That(result[0].Header.MessageType).IsEqualTo(MessageType.MT_EVENT); - Assert.Equal("somebody2", result[1].Body.Value); - Assert.Equal("topic", result[1].Header.Topic); - Assert.Equal(MessageType.MT_DOCUMENT, result[1].Header.MessageType); + await Assert.That(result[1].Body.Value).IsEqualTo("somebody2"); + await Assert.That(result[1].Header.Topic).IsEqualTo("topic"); + await Assert.That(result[1].Header.MessageType).IsEqualTo(MessageType.MT_DOCUMENT); } - [Fact] + [Test] public async Task When_a_subscription_does_not_exist_and_messages_are_in_the_queue_then_the_subscription_is_created_and_messages_are_returned() { _nameSpaceManagerWrapper.ResetState(); @@ -87,15 +86,15 @@ public async Task When_a_subscription_does_not_exist_and_messages_are_in_the_que _messageReceiver.MessageQueue = brokeredMessageList; - Message[] result = _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); + Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); await _nameSpaceManagerWrapper.SubscriptionExistsAsync("topic", "subscription"); //A.CallTo(() => _nameSpaceManagerWrapper.f => f.CreateSubscription("topic", "subscription", _subConfig)).MustHaveHappened(); - Assert.Equal("somebody", result[0].Body.Value); + await Assert.That(result[0].Body.Value).IsEqualTo("somebody"); } - [Fact] - public void When_a_message_is_a_command_type_then_the_message_type_is_set_correctly() + [Test] + public async Task When_a_message_is_a_command_type_then_the_message_type_is_set_correctly() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.Topics.Add("topic", ["subscription"]); @@ -110,15 +109,15 @@ public void When_a_message_is_a_command_type_then_the_message_type_is_set_correc _messageReceiver.MessageQueue = brokeredMessageList; - Message[] result = _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); + Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Equal("somebody", result[0].Body.Value); - Assert.Equal("topic", result[0].Header.Topic); - Assert.Equal(MessageType.MT_COMMAND, result[0].Header.MessageType); + await Assert.That(result[0].Body.Value).IsEqualTo("somebody"); + await Assert.That(result[0].Header.Topic).IsEqualTo("topic"); + await Assert.That(result[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); } - [Fact] - public void When_a_message_is_a_command_type_and_it_is_specified_in_funny_casing_then_the_message_type_is_set_correctly() + [Test] + public async Task When_a_message_is_a_command_type_and_it_is_specified_in_funny_casing_then_the_message_type_is_set_correctly() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.Topics.Add("topic", ["subscription"]); @@ -133,15 +132,15 @@ public void When_a_message_is_a_command_type_and_it_is_specified_in_funny_casing _messageReceiver.MessageQueue = brokeredMessageList; - Message[] result = _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); + Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Equal("somebody", result[0].Body.Value); - Assert.Equal("topic", result[0].Header.Topic); - Assert.Equal(MessageType.MT_COMMAND, result[0].Header.MessageType); + await Assert.That(result[0].Body.Value).IsEqualTo("somebody"); + await Assert.That(result[0].Header.Topic).IsEqualTo("topic"); + await Assert.That(result[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); } - [Fact] - public void When_the_specified_message_type_is_unknown_then_it_should_default_to_MT_EVENT() + [Test] + public async Task When_the_specified_message_type_is_unknown_then_it_should_default_to_MT_EVENT() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.Topics.Add("topic", ["subscription"]); @@ -156,13 +155,13 @@ public void When_the_specified_message_type_is_unknown_then_it_should_default_to _messageReceiver.MessageQueue = brokeredMessageList; - Message[] result = _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); + Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Equal(MessageType.MT_EVENT, result[0].Header.MessageType); + await Assert.That(result[0].Header.MessageType).IsEqualTo(MessageType.MT_EVENT); } - [Fact] - public void When_the_message_type_is_not_specified_it_should_default_to_MT_EVENT() + [Test] + public async Task When_the_message_type_is_not_specified_it_should_default_to_MT_EVENT() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.Topics.Add("topic", ["subscription"]); @@ -177,15 +176,15 @@ public void When_the_message_type_is_not_specified_it_should_default_to_MT_EVENT _messageReceiver.MessageQueue = brokeredMessageList; - Message[] result = _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); + Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Equal("somebody", result[0].Body.Value); - Assert.Equal("topic", result[0].Header.Topic); - Assert.Equal(MessageType.MT_EVENT, result[0].Header.MessageType); + await Assert.That(result[0].Body.Value).IsEqualTo("somebody"); + await Assert.That(result[0].Header.Topic).IsEqualTo("topic"); + await Assert.That(result[0].Header.MessageType).IsEqualTo(MessageType.MT_EVENT); } - [Fact] - public void When_the_user_properties_on_the_azure_sb_message_is_null_it_should_default_to_message_type_to_MT_EVENT() + [Test] + public async Task When_the_user_properties_on_the_azure_sb_message_is_null_it_should_default_to_message_type_to_MT_EVENT() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.Topics.Add("topic", ["subscription"]); @@ -201,15 +200,15 @@ public void When_the_user_properties_on_the_azure_sb_message_is_null_it_should_d _messageReceiver.MessageQueue = brokeredMessageList; - Message[] result = _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); + Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Equal("somebody", result[0].Body.Value); - Assert.Equal("topic", result[0].Header.Topic); - Assert.Equal(MessageType.MT_EVENT, result[0].Header.MessageType); + await Assert.That(result[0].Body.Value).IsEqualTo("somebody"); + await Assert.That(result[0].Header.Topic).IsEqualTo("topic"); + await Assert.That(result[0].Header.MessageType).IsEqualTo(MessageType.MT_EVENT); } - [Fact] - public void When_there_are_no_messages_then_it_returns_an_empty_array() + [Test] + public async Task When_there_are_no_messages_then_it_returns_an_empty_array() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.Topics.Add("topic", ["subscription"]); @@ -217,12 +216,12 @@ public void When_there_are_no_messages_then_it_returns_an_empty_array() _messageReceiver.MessageQueue = brokeredMessageList; - Message[] result = _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); - Assert.Empty(result); + Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); + await Assert.That(result).IsEmpty(); } - [Fact] - public void When_trying_to_create_a_subscription_which_was_already_created_by_another_thread_it_should_ignore_the_error() + [Test] + public async Task When_trying_to_create_a_subscription_which_was_already_created_by_another_thread_it_should_ignore_the_error() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.CreateSubscriptionException = @@ -238,24 +237,24 @@ public void When_trying_to_create_a_subscription_which_was_already_created_by_an _messageReceiver.MessageQueue = brokeredMessageList; - Message[] result = _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); + Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Equal("somebody", result[0].Body.Value); + await Assert.That(result[0].Body.Value).IsEqualTo("somebody"); } - [Fact] - public void When_dispose_is_called_the_close_method_is_called() + [Test] + public async Task When_dispose_is_called_the_close_method_is_called() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.Topics.Add("topic", new ()); - _azureServiceBusConsumer.Receive(TimeSpan.Zero); - _azureServiceBusConsumer.Dispose(); + await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.Zero); + await _azureServiceBusConsumer.DisposeAsync(); - Assert.True(_messageReceiver.IsClosedOrClosing); + await Assert.That(_messageReceiver.IsClosedOrClosing).IsTrue(); } - [Fact] - public void When_requeue_is_called_and_the_delay_is_zero_the_send_method_is_called() + [Test] + public async Task When_requeue_is_called_and_the_delay_is_zero_the_send_method_is_called() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.Topics.Add("topic", new ()); @@ -265,13 +264,13 @@ public void When_requeue_is_called_and_the_delay_is_zero_the_send_method_is_call var message = new Message(messageHeader, new MessageBody("body")); message.Header.Bag.Add("LockToken", messageLockTokenOne); - _azureServiceBusConsumer.Requeue(message, TimeSpan.Zero); + await _azureServiceBusConsumer.RequeueAsync(message, TimeSpan.Zero); - Assert.Single(_fakeMessageProducer.SentMessages); + await Assert.That(_fakeMessageProducer.SentMessages).HasSingleItem(); } - [Fact] - public void When_requeue_is_called_and_the_delay_is_more_than_zero_the_sendWithDelay_method_is_called() + [Test] + public async Task When_requeue_is_called_and_the_delay_is_more_than_zero_the_sendWithDelay_method_is_called() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.Topics.Add("topic", new ()); @@ -282,36 +281,35 @@ public void When_requeue_is_called_and_the_delay_is_more_than_zero_the_sendWithD var message = new Message(messageHeader, new MessageBody("body")); message.Header.Bag.Add("LockToken", messageLockTokenOne); - _azureServiceBusConsumer.Requeue(message, TimeSpan.FromMilliseconds(100)); + await _azureServiceBusConsumer.RequeueAsync(message, TimeSpan.FromMilliseconds(100)); - Assert.Single(_fakeMessageProducer.SentMessages); + await Assert.That(_fakeMessageProducer.SentMessages).HasSingleItem(); } - [Fact] - public void - When_there_is_an_error_talking_to_servicebus_when_checking_if_subscription_exist_then_a_ChannelFailureException_is_raised() + [Test] + public async Task When_there_is_an_error_talking_to_servicebus_when_checking_if_subscription_exist_then_a_ChannelFailureException_is_raised() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.CreateSubscriptionException = new Exception(); - Assert.Throws(() => _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400))); + await Assert.That(() => _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400))).ThrowsExactly(); } - [Fact] - public void When_there_is_an_error_talking_to_servicebus_when_creating_the_subscription_then_a_ChannelFailureException_is_raised_and_ManagementClientWrapper_is_reinitilised() + [Test] + public async Task When_there_is_an_error_talking_to_servicebus_when_creating_the_subscription_then_a_ChannelFailureException_is_raised_and_ManagementClientWrapper_is_reinitilised() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.CreateSubscriptionException = new Exception(); - Assert.Throws(() => _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400))); - Assert.Equal(1, _nameSpaceManagerWrapper.ResetCount); + await Assert.That(() => _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400))).ThrowsExactly(); + await Assert.That(_nameSpaceManagerWrapper.ResetCount).IsEqualTo(1); } /// /// TODO: review /// - [Fact] - public void When_there_is_an_error_talking_to_servicebus_when_receiving_then_a_ChannelFailureException_is_raised_and_the_messageReceiver_is_recreated() + [Test] + public async Task When_there_is_an_error_talking_to_servicebus_when_receiving_then_a_ChannelFailureException_is_raised_and_the_messageReceiver_is_recreated() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.Topics.Add("topic", ["subscription"]); @@ -319,13 +317,13 @@ public void When_there_is_an_error_talking_to_servicebus_when_receiving_then_a_C _messageReceiver.MessageQueue.Clear(); _messageReceiver.ReceiveException = new Exception(); - Assert.Throws(() => _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400))); - Assert.Equal(2, _fakeMessageReceiver.CreationCount); + await Assert.That(() => _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400))).ThrowsExactly(); + await Assert.That(_fakeMessageReceiver.CreationCount).IsEqualTo(2); } - [Theory] - [InlineData(true)] - [InlineData(false)] + [Test] + [Arguments(true)] + [Arguments(false)] public async Task Once_the_subscription_is_created_or_exits_it_does_not_check_if_it_exists_every_time(bool subscriptionExists) { _nameSpaceManagerWrapper.ResetState(); @@ -342,17 +340,17 @@ public async Task Once_the_subscription_is_created_or_exits_it_does_not_check_if _messageReceiver.MessageQueue = brokeredMessageList; - _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); - _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); + await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); + await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); //Subscription is only created once - Assert.Equal(1, _nameSpaceManagerWrapper.Topics["topic"].Count(s => s.Equals("subscription"))); + await Assert.That(_nameSpaceManagerWrapper.Topics["topic"].Count(s => s.Equals("subscription"))).IsEqualTo(1); - Assert.Equal(1, _nameSpaceManagerWrapper.ExistCount); + await Assert.That(_nameSpaceManagerWrapper.ExistCount).IsEqualTo(1); } - [Fact] - public void When_MessagingEntityAlreadyExistsException_does_not_check_if_subscription_exists() + [Test] + public async Task When_MessagingEntityAlreadyExistsException_does_not_check_if_subscription_exists() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.Topics.Add("topic", new ()); @@ -370,16 +368,16 @@ public void When_MessagingEntityAlreadyExistsException_does_not_check_if_subscri _messageReceiver.MessageQueue = brokeredMessageList; - Message[] result = _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); - _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); + Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); + await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Equal("somebody", result[0].Body.Value); + await Assert.That(result[0].Body.Value).IsEqualTo("somebody"); - Assert.Equal(1, _nameSpaceManagerWrapper.ExistCount); + await Assert.That(_nameSpaceManagerWrapper.ExistCount).IsEqualTo(1); } - [Fact] - public void When_a_message_contains_a_null_body_message_is_still_processed() + [Test] + public async Task When_a_message_contains_a_null_body_message_is_still_processed() { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.Topics.Add("topic", new ()); @@ -397,25 +395,25 @@ public void When_a_message_contains_a_null_body_message_is_still_processed() _messageReceiver.MessageQueue = brokeredMessageList; - Message[] result = _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); + Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Equal(string.Empty, result[0].Body.Value); + await Assert.That(result[0].Body.Value).IsEqualTo(string.Empty); } - [Fact] - public void When_receiving_messages_and_the_receiver_is_closing_a_MT_QUIT_message_is_sent() + [Test] + public async Task When_receiving_messages_and_the_receiver_is_closing_a_MT_QUIT_message_is_sent() { _nameSpaceManagerWrapper.Topics.Add("topic", new ()); - _messageReceiver.Close(); + await _messageReceiver.CloseAsync(); - Message[] result = _azureServiceBusConsumer.Receive(TimeSpan.FromMilliseconds(400)); + Message[] result = await _azureServiceBusConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(400)); - Assert.Equal(MessageType.MT_QUIT, result[0].Header.MessageType); + await Assert.That(result[0].Header.MessageType).IsEqualTo(MessageType.MT_QUIT); } - [Fact] - public void When_a_subscription_does_not_exist_and_Missing_is_set_to_Validate_a_Channel_Failure_is_Raised() + [Test] + public async Task When_a_subscription_does_not_exist_and_Missing_is_set_to_Validate_a_Channel_Failure_is_Raised() { _nameSpaceManagerWrapper.ResetState(); @@ -425,6 +423,6 @@ public void When_a_subscription_does_not_exist_and_Missing_is_set_to_Validate_a_ var azureServiceBusConsumerValidate = new AzureServiceBusTopicConsumer(sub, _fakeMessageProducer, _nameSpaceManagerWrapper, _fakeMessageReceiver); - Assert.Throws(() => azureServiceBusConsumerValidate.Receive(TimeSpan.FromMilliseconds(400))); + await Assert.That(() => azureServiceBusConsumerValidate.Receive(TimeSpan.FromMilliseconds(400))).ThrowsExactly(); } } diff --git a/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/Reactor/AzureServiceBusMessageProducerTests.cs b/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/Reactor/AzureServiceBusMessageProducerTests.cs index 3a0233dba6..07f2973ce3 100644 --- a/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/Reactor/AzureServiceBusMessageProducerTests.cs +++ b/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/Reactor/AzureServiceBusMessageProducerTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Net.Mime; using System.Text; @@ -6,7 +6,6 @@ using Azure.Messaging.ServiceBus; using Paramore.Brighter.AzureServiceBus.Tests.Fakes; using Paramore.Brighter.MessagingGateway.AzureServiceBus; -using Xunit; namespace Paramore.Brighter.AzureServiceBus.Tests.MessagingGateway.Reactor { @@ -38,30 +37,30 @@ public AzureServiceBusMessageProducerTests() ); } - [Fact] - public void When_the_topic_exists_and_sending_a_message_with_no_delay_it_should_send_the_message_to_the_correct_topicclient() + [Test] + public async Task When_the_topic_exists_and_sending_a_message_with_no_delay_it_should_send_the_message_to_the_correct_topicclient() { var messageBody = Encoding.UTF8.GetBytes("A message body"); _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.Topics.Add("topic", []); - _producer.Send(new Message( + await _producer.SendAsync(new Message( new MessageHeader(Id.Random(), new RoutingKey("topic"), MessageType.MT_EVENT), new MessageBody(messageBody, new ContentType(MediaTypeNames.Application.Json))) ); ServiceBusMessage sentMessage = _topicClient.SentMessages.First(); - Assert.Equal(messageBody, sentMessage.Body.ToArray()); - Assert.Equal("MT_EVENT", sentMessage.ApplicationProperties["MessageType"]); - Assert.Equal(1, _topicClient.ClosedCount); + await Assert.That(sentMessage.Body.ToArray()).IsEqualTo(messageBody); + await Assert.That(sentMessage.ApplicationProperties["MessageType"]).IsEqualTo("MT_EVENT"); + await Assert.That(_topicClient.ClosedCount).IsEqualTo(1); } - [Theory] - [InlineData(false)] - [InlineData(true)] - public void When_sending_a_command_message_type_message_with_no_delay_it_should_set_the_correct_messagetype_property(bool useQueues) + [Test] + [Arguments(false)] + [Arguments(true)] + public async Task When_sending_a_command_message_type_message_with_no_delay_it_should_set_the_correct_messagetype_property(bool useQueues) { var messageBody = Encoding.UTF8.GetBytes("A message body"); @@ -71,22 +70,22 @@ public void When_sending_a_command_message_type_message_with_no_delay_it_should_ var producer = useQueues ? _queueProducer : _producer; - producer.Send(new Message( + await producer.SendAsync(new Message( new MessageHeader(Id.Random(), new RoutingKey("topic"), MessageType.MT_COMMAND), new MessageBody(messageBody, new ContentType(MediaTypeNames.Application.Json))) ); ServiceBusMessage sentMessage = _topicClient.SentMessages.First(); - Assert.Equal(messageBody, sentMessage.Body.ToArray()); - Assert.Equal("MT_COMMAND", sentMessage.ApplicationProperties["MessageType"]); - Assert.Equal(1, _topicClient.ClosedCount); + await Assert.That(sentMessage.Body.ToArray()).IsEqualTo(messageBody); + await Assert.That(sentMessage.ApplicationProperties["MessageType"]).IsEqualTo("MT_COMMAND"); + await Assert.That(_topicClient.ClosedCount).IsEqualTo(1); } - [Theory] - [InlineData(false)] - [InlineData(true)] - public void When_the_topic_does_not_exist_it_should_be_created_and_the_message_is_sent_to_the_correct_topicclient(bool useQueues) + [Test] + [Arguments(false)] + [Arguments(true)] + public async Task When_the_topic_does_not_exist_it_should_be_created_and_the_message_is_sent_to_the_correct_topicclient(bool useQueues) { var messageBody = Encoding.UTF8.GetBytes("A message body"); @@ -94,20 +93,20 @@ public void When_the_topic_does_not_exist_it_should_be_created_and_the_message_i var producer = useQueues ? _queueProducer : _producer; - producer.Send(new Message( + await producer.SendAsync(new Message( new MessageHeader(Id.Random(), new RoutingKey("topic"), MessageType.MT_NONE), new MessageBody(messageBody, new ContentType(MediaTypeNames.Application.Json)))); ServiceBusMessage sentMessage = _topicClient.SentMessages.First(); - Assert.Equal(1, _nameSpaceManagerWrapper.CreateCount); - Assert.Equal(messageBody, sentMessage.Body.ToArray()); + await Assert.That(_nameSpaceManagerWrapper.CreateCount).IsEqualTo(1); + await Assert.That(sentMessage.Body.ToArray()).IsEqualTo(messageBody); } - [Theory] - [InlineData(false)] - [InlineData(true)] - public void When_a_message_is_send_and_an_exception_occurs_close_is_still_called(bool useQueues) + [Test] + [Arguments(false)] + [Arguments(true)] + public async Task When_a_message_is_send_and_an_exception_occurs_close_is_still_called(bool useQueues) { _nameSpaceManagerWrapper.ResetState(); _nameSpaceManagerWrapper.Topics.Add("topic", []); @@ -119,7 +118,7 @@ public void When_a_message_is_send_and_an_exception_occurs_close_is_still_called { var producer = useQueues ? _queueProducer : _producer; - producer.Send(new Message( + await producer.SendAsync(new Message( new MessageHeader(Id.Random(), new RoutingKey("topic"), MessageType.MT_NONE), new MessageBody("Message", new ContentType(MediaTypeNames.Application.Json)))); } @@ -128,15 +127,14 @@ public void When_a_message_is_send_and_an_exception_occurs_close_is_still_called // ignored } - Assert.Equal(1, _topicClient.ClosedCount); + await Assert.That(_topicClient.ClosedCount).IsEqualTo(1); } - [Theory] - [InlineData(false)] - [InlineData(true)] - public void - When_the_topic_exists_and_sending_a_message_with_a_delay_it_should_send_the_message_to_the_correct_topicclient(bool useQueues) - { + [Test] + [Arguments(false)] + [Arguments(true)] + public async Task When_the_topic_exists_and_sending_a_message_with_a_delay_it_should_send_the_message_to_the_correct_topicclient(bool useQueues) + { var messageBody = Encoding.UTF8.GetBytes("A message body"); _nameSpaceManagerWrapper.ResetState(); @@ -145,25 +143,24 @@ public void var producer = useQueues ? _queueProducer : _producer; - producer.SendWithDelay( + await producer.SendWithDelayAsync( new Message( new MessageHeader(Id.Random(), new RoutingKey("topic"), MessageType.MT_EVENT), new MessageBody(messageBody, new ContentType(MediaTypeNames.Application.Json))), TimeSpan.FromSeconds(1)); ServiceBusMessage sentMessage = _topicClient.SentMessages.First(); - Assert.Equal(messageBody, sentMessage.Body.ToArray()); - Assert.Equal("MT_EVENT", sentMessage.ApplicationProperties["MessageType"]); - Assert.Equal(1, _topicClient.ClosedCount); + await Assert.That(sentMessage.Body.ToArray()).IsEqualTo(messageBody); + await Assert.That(sentMessage.ApplicationProperties["MessageType"]).IsEqualTo("MT_EVENT"); + await Assert.That(_topicClient.ClosedCount).IsEqualTo(1); } - [Theory] - [InlineData(false)] - [InlineData(true)] - public void - When_sending_a_command_message_type_message_with_delay_it_should_set_the_correct_messagetype_property( + [Test] + [Arguments(false)] + [Arguments(true)] + public async Task When_sending_a_command_message_type_message_with_delay_it_should_set_the_correct_messagetype_property( bool useQueues) - { + { var messageBody = Encoding.UTF8.GetBytes("A message body"); _nameSpaceManagerWrapper.ResetState(); @@ -172,48 +169,47 @@ public void var producer = useQueues ? _queueProducer : _producer; - producer.SendWithDelay(new Message( + await producer.SendWithDelayAsync(new Message( new MessageHeader(Id.Random(), new RoutingKey("topic"), MessageType.MT_COMMAND), new MessageBody(messageBody, new ContentType(MediaTypeNames.Application.Json))), TimeSpan.FromSeconds(1)); ServiceBusMessage sentMessage = _topicClient.SentMessages.First(); - Assert.Equal(messageBody, sentMessage.Body.ToArray()); - Assert.Equal("MT_COMMAND", sentMessage.ApplicationProperties["MessageType"]); - Assert.Equal(1, _topicClient.ClosedCount); + await Assert.That(sentMessage.Body.ToArray()).IsEqualTo(messageBody); + await Assert.That(sentMessage.ApplicationProperties["MessageType"]).IsEqualTo("MT_COMMAND"); + await Assert.That(_topicClient.ClosedCount).IsEqualTo(1); } - [Theory] - [InlineData(false)] - [InlineData(true)] - public void - When_the_topic_does_not_exist_and_sending_a_message_with_a_delay_it_should_send_the_message_to_the_correct_topicclient( + [Test] + [Arguments(false)] + [Arguments(true)] + public async Task When_the_topic_does_not_exist_and_sending_a_message_with_a_delay_it_should_send_the_message_to_the_correct_topicclient( bool useQueues) - { + { var messageBody = Encoding.UTF8.GetBytes("A message body"); _nameSpaceManagerWrapper.ResetState(); var producer = useQueues ? _queueProducer : _producer; - producer.SendWithDelay(new Message( + await producer.SendWithDelayAsync(new Message( new MessageHeader(Id.Random(), new RoutingKey("topic"), MessageType.MT_NONE), new MessageBody(messageBody, new ContentType(MediaTypeNames.Application.Json))), TimeSpan.FromSeconds(1)); ServiceBusMessage sentMessage = _topicClient.SentMessages.First(); - Assert.Equal(1, _nameSpaceManagerWrapper.CreateCount); + await Assert.That(_nameSpaceManagerWrapper.CreateCount).IsEqualTo(1); - Assert.Equal(messageBody, sentMessage.Body.ToArray()); - Assert.Equal(1, _topicClient.ClosedCount); + await Assert.That(sentMessage.Body.ToArray()).IsEqualTo(messageBody); + await Assert.That(_topicClient.ClosedCount).IsEqualTo(1); } - [Theory] - [InlineData(true, true)] - [InlineData(false, true)] - [InlineData(true, false)] - [InlineData(false, false)] - public void Once_the_topic_is_created_it_then_does_not_check_if_it_exists_every_time(bool topicExists, bool useQueues) + [Test] + [Arguments(true, true)] + [Arguments(false, true)] + [Arguments(true, false)] + [Arguments(false, false)] + public async Task Once_the_topic_is_created_it_then_does_not_check_if_it_exists_every_time(bool topicExists, bool useQueues) { var messageBody = Encoding.UTF8.GetBytes("A message body"); @@ -228,22 +224,22 @@ public void Once_the_topic_is_created_it_then_does_not_check_if_it_exists_every_ var routingKey = new RoutingKey("topic"); - producer.SendWithDelay(new Message( + await producer.SendWithDelayAsync(new Message( new MessageHeader(Id.Random(), routingKey, MessageType.MT_NONE), new MessageBody(messageBody, new ContentType(MediaTypeNames.Application.Json))), TimeSpan.FromSeconds(1)); - producer.SendWithDelay(new Message( + await producer.SendWithDelayAsync(new Message( new MessageHeader(Id.Random(), routingKey, MessageType.MT_NONE), new MessageBody(messageBody, new ContentType(MediaTypeNames.Application.Json))), TimeSpan.FromSeconds(1)); if (topicExists == false) - Assert.Equal(1, _nameSpaceManagerWrapper.CreateCount); + await Assert.That(_nameSpaceManagerWrapper.CreateCount).IsEqualTo(1); - Assert.Equal(1, _nameSpaceManagerWrapper.ExistCount); + await Assert.That(_nameSpaceManagerWrapper.ExistCount).IsEqualTo(1); } - [Theory] - [InlineData(false)] - [InlineData(true)] + [Test] + [Arguments(false)] + [Arguments(true)] public async Task When_there_is_an_error_talking_to_servicebus_when_creating_the_topic_the_ManagementClientWrapper_is_reinitilised(bool useQueues) { var messageBody = Encoding.UTF8.GetBytes("A message body"); @@ -257,14 +253,14 @@ await Assert.ThrowsAsync(() => producer.SendWithDelayAsync( new MessageHeader(Id.Random(), new RoutingKey("topic"), MessageType.MT_NONE), new MessageBody(messageBody, new ContentType(MediaTypeNames.Application.Json))), TimeSpan.FromSeconds(1)) ); - Assert.Equal(1, _nameSpaceManagerWrapper.ResetCount); + await Assert.That(_nameSpaceManagerWrapper.ResetCount).IsEqualTo(1); } - [Theory] - [InlineData(false)] - [InlineData(true)] - public void When_there_is_an_error_getting_a_topic_client_the_connection_for_topic_client_is_retried(bool useQueues) + [Test] + [Arguments(false)] + [Arguments(true)] + public async Task When_there_is_an_error_getting_a_topic_client_the_connection_for_topic_client_is_retried(bool useQueues) { var messageBody = Encoding.UTF8.GetBytes("A message body"); @@ -276,15 +272,15 @@ public void When_there_is_an_error_getting_a_topic_client_the_connection_for_top var producer = useQueues ? _queueProducer : _producer; - producer.SendWithDelay(new Message( - new MessageHeader(Id.Random(), new RoutingKey("topic"), MessageType.MT_NONE), - new MessageBody(messageBody, new ContentType(MediaTypeNames.Application.Json))) - ); + await producer.SendWithDelayAsync(new Message( + new MessageHeader(Id.Random(), new RoutingKey("topic"), MessageType.MT_NONE), + new MessageBody(messageBody, new ContentType(MediaTypeNames.Application.Json))) + ); - Assert.Single(_topicClient.SentMessages); + await Assert.That(_topicClient.SentMessages).HasSingleItem(); } - [Fact] + [Test] public async Task When_the_topic_does_not_exist_and_Missing_is_set_to_Validate_an_exception_is_raised() { var messageBody = Encoding.UTF8.GetBytes("A message body"); diff --git a/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/When_consuming_a_message_via_the_consumer.cs b/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/When_consuming_a_message_via_the_consumer.cs index 7d73b7def3..217f72d398 100644 --- a/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/When_consuming_a_message_via_the_consumer.cs +++ b/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/When_consuming_a_message_via_the_consumer.cs @@ -1,31 +1,33 @@ -using System; +using System; using System.Net.Mime; using System.Text.Json; using System.Threading; using System.Threading.Tasks; using Azure.Messaging.ServiceBus; -using Xunit; using Paramore.Brighter.AzureServiceBus.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AzureServiceBus; using Paramore.Brighter.MessagingGateway.AzureServiceBus.AzureServiceBusWrappers; +using Paramore.Brighter.MessagingGateway.AzureServiceBus.ClientProvider; using Paramore.Brighter.Observability; namespace Paramore.Brighter.AzureServiceBus.Tests.MessagingGateway { - [Trait("Category", "ASB")] - public class ASBConsumerTests : IDisposable + [Category("ASB")] + public class ASBConsumerTests { private readonly Message _message; - private readonly IAmAChannelSync _channel; - private readonly IAmAProducerRegistry _producerRegistry; + private IAmAChannelSync _channel; + private IAmAProducerRegistry _producerRegistry; private readonly string _correlationId; private readonly ContentType _contentType; private readonly string _topicName; private readonly string _channelName; - private readonly ServiceBusClient _serviceBusClient; + private ServiceBusClient _serviceBusClient; private readonly IAdministrationClientWrapper _administrationClient; private readonly AzureServiceBusSubscriptionConfiguration _subscriptionConfiguration; + private readonly AzureServiceBusSubscription _subscription; + private readonly IServiceBusClientProvider _clientProvider; public ASBConsumerTests() { @@ -34,12 +36,12 @@ public ASBConsumerTests() CommandValue = "Do the things.", CommandNumber = 26 }; - + _channelName = "test-channel"; _topicName = $"Consumer-Tests-{Guid.NewGuid()}"; var routingKey = new RoutingKey(_topicName); - - AzureServiceBusSubscription subscription = new( + + _subscription = new AzureServiceBusSubscription( subscriptionName: new SubscriptionName(_channelName), channelName: new ChannelName(_channelName), routingKey: routingKey @@ -89,28 +91,31 @@ public ASBConsumerTests() SqlFilter = "1=1" }; - var clientProvider = ASBCreds.ASBClientProvider; - _administrationClient = new AdministrationClientWrapper(clientProvider); - _administrationClient.CreateSubscriptionAsync(_topicName, _channelName, _subscriptionConfiguration) - .GetAwaiter() - .GetResult(); + _clientProvider = ASBCreds.ASBClientProvider; + _administrationClient = new AdministrationClientWrapper(_clientProvider); + } + + [Before(Test)] + public async Task Setup() + { + await _administrationClient.CreateSubscriptionAsync(_topicName, _channelName, _subscriptionConfiguration); - _serviceBusClient = clientProvider.GetServiceBusClient(); + _serviceBusClient = _clientProvider.GetServiceBusClient(); var channelFactory = - new AzureServiceBusChannelFactory(new AzureServiceBusConsumerFactory(clientProvider)); - _channel = channelFactory.CreateSyncChannel(subscription); - - _producerRegistry = new AzureServiceBusProducerRegistryFactory( - clientProvider, - [ - new AzureServiceBusPublication { Topic = new RoutingKey(_topicName) } - ] + new AzureServiceBusChannelFactory(new AzureServiceBusConsumerFactory(_clientProvider)); + _channel = channelFactory.CreateSyncChannel(_subscription); + + _producerRegistry = await new AzureServiceBusProducerRegistryFactory( + _clientProvider, + [ + new AzureServiceBusPublication { Topic = new RoutingKey(_topicName) } + ] ) - .Create(); + .CreateAsync(); } - [Fact] + [Test] public async Task When_receiving_a_message_via_the_consumer() { //arrange @@ -122,34 +127,34 @@ public async Task When_receiving_a_message_via_the_consumer() var message = _channel.Receive(TimeSpan.FromMilliseconds(5000)); //assert - Assert.Equal(_message.Id, message.Id); - Assert.Equal(_message.Header.Topic, message.Header.Topic); - Assert.Equal(_message.Header.MessageType, message.Header.MessageType); - Assert.Equal(_message.Header.Source.ToString(), message.Header.Source.ToString()); - Assert.Equal(_message.Header.Type, message.Header.Type); - Assert.Equal(_message.Header.TimeStamp, message.Header.TimeStamp, TimeSpan.FromSeconds(5)); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_message.Header.ReplyTo?.Value, message.Header.ReplyTo?.Value); - Assert.Equal(_message.Header.ContentType, message.Header.ContentType); - Assert.Equal(_message.Header.PartitionKey.Value, message.Header.PartitionKey.Value); - Assert.Equal(_message.Header.DataSchema, message.Header.DataSchema); - Assert.Equal(_message.Header.Subject, message.Header.Subject); - Assert.Equal(_message.Header.HandledCount, message.Header.HandledCount); - Assert.Equal(_message.Header.Delayed.TotalMilliseconds, message.Header.Delayed.TotalMilliseconds) ; - Assert.Equal(_message.Header.TraceParent?.Value, message.Header.TraceParent?.Value); - Assert.Equal(_message.Header.TraceState?.Value, message.Header.TraceState?.Value); - Assert.Equal(MessageHeader.DefaultSpecVersion, message.Header.SpecVersion); - Assert.Equal(_message.Header.Baggage, message.Header.Baggage); + await Assert.That(message.Id).IsEqualTo(_message.Id); + await Assert.That(message.Header.Topic).IsEqualTo(_message.Header.Topic); + await Assert.That(message.Header.MessageType).IsEqualTo(_message.Header.MessageType); + await Assert.That(message.Header.Source.ToString()).IsEqualTo(_message.Header.Source.ToString()); + await Assert.That(message.Header.Type).IsEqualTo(_message.Header.Type); + await Assert.That(message.Header.TimeStamp).IsEqualTo(_message.Header.TimeStamp).Within(TimeSpan.FromSeconds(5)); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo?.Value).IsEqualTo(_message.Header.ReplyTo?.Value); + await Assert.That(message.Header.ContentType).IsEqualTo(_message.Header.ContentType); + await Assert.That(message.Header.PartitionKey.Value).IsEqualTo(_message.Header.PartitionKey.Value); + await Assert.That(message.Header.DataSchema).IsEqualTo(_message.Header.DataSchema); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); + await Assert.That(message.Header.HandledCount).IsEqualTo(_message.Header.HandledCount); + await Assert.That(message.Header.Delayed.TotalMilliseconds).IsEqualTo(_message.Header.Delayed.TotalMilliseconds) ; + await Assert.That(message.Header.TraceParent?.Value).IsEqualTo(_message.Header.TraceParent?.Value); + await Assert.That(message.Header.TraceState?.Value).IsEqualTo(_message.Header.TraceState?.Value); + await Assert.That(message.Header.SpecVersion).IsEqualTo(MessageHeader.DefaultSpecVersion); + await Assert.That(message.Header.Baggage).IsEqualTo(_message.Header.Baggage); - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); - Assert.False(message.Redelivered); + await Assert.That(message.Redelivered).IsFalse(); //clear the channel _channel.Acknowledge(message); } - [Fact] + [Test] public async Task When_rejecting_a_message_via_the_consumer() { //arrange @@ -168,15 +173,15 @@ public async Task When_rejecting_a_message_via_the_consumer() var deadLetter = await deadLetterReceiver.ReceiveMessageAsync(); - Assert.Equal(message.Id, deadLetter.MessageId); - Assert.Equal(_correlationId, deadLetter.CorrelationId); - Assert.Equal(MessageType.MT_COMMAND, _message.Header.MessageType); - Assert.Equal(message.Body.Value, deadLetter.Body.ToString()); - Assert.Equal(_message.Header.Topic.ToString(), _topicName); - Assert.Equal(TimeSpan.Zero, _message.Header.Delayed); + await Assert.That(deadLetter.MessageId).IsEqualTo(message.Id); + await Assert.That(deadLetter.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(_message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(deadLetter.Body.ToString()).IsEqualTo(message.Body.Value); + await Assert.That(_topicName).IsEqualTo(_message.Header.Topic.ToString()); + await Assert.That(_message.Header.Delayed).IsEqualTo(TimeSpan.Zero); } - [Fact] + [Test] public async Task When_requeueing_a_message_via_the_consumer() { //arrange @@ -192,30 +197,31 @@ public async Task When_requeueing_a_message_via_the_consumer() var requeuedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(message.Id, requeuedMessage.Id); - Assert.False(requeuedMessage.Redelivered); - Assert.Equal(new RoutingKey(_topicName), requeuedMessage.Header.Topic); - Assert.Equal(_correlationId, requeuedMessage.Header.CorrelationId); - Assert.Equal(_contentType, requeuedMessage.Header.ContentType); - Assert.Equal(1, requeuedMessage.Header.HandledCount); + await Assert.That(requeuedMessage.Id).IsEqualTo(message.Id); + await Assert.That(requeuedMessage.Redelivered).IsFalse(); + await Assert.That(requeuedMessage.Header.Topic).IsEqualTo(new RoutingKey(_topicName)); + await Assert.That(requeuedMessage.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(requeuedMessage.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(requeuedMessage.Header.HandledCount).IsEqualTo(1); } - [Fact] + [Test] public async Task When_A_Subscription_is_created_the_properties_are_set_as_Expected() { var sub = await _administrationClient.GetSubscriptionAsync(_topicName, _channelName, CancellationToken.None); - Assert.Equal(_subscriptionConfiguration.DeadLetteringOnMessageExpiration, sub.DeadLetteringOnMessageExpiration); - Assert.Equal(_subscriptionConfiguration.DefaultMessageTimeToLive, sub.DefaultMessageTimeToLive); - Assert.Equal(_subscriptionConfiguration.LockDuration, sub.LockDuration); - Assert.Equal(_subscriptionConfiguration.MaxDeliveryCount, sub.MaxDeliveryCount); + await Assert.That(sub.DeadLetteringOnMessageExpiration).IsEqualTo(_subscriptionConfiguration.DeadLetteringOnMessageExpiration); + await Assert.That(sub.DefaultMessageTimeToLive).IsEqualTo(_subscriptionConfiguration.DefaultMessageTimeToLive); + await Assert.That(sub.LockDuration).IsEqualTo(_subscriptionConfiguration.LockDuration); + await Assert.That(sub.MaxDeliveryCount).IsEqualTo(_subscriptionConfiguration.MaxDeliveryCount); //ToDo: Need to Add Test for Filter } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _administrationClient.DeleteTopicAsync(_topicName).GetAwaiter().GetResult(); + await _administrationClient.DeleteTopicAsync(_topicName); _channel?.Dispose(); _producerRegistry?.Dispose(); } diff --git a/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/When_posting_a_large_message_via_the_producer.cs b/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/When_posting_a_large_message_via_the_producer.cs index 2649aa9e95..033115245a 100644 --- a/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/When_posting_a_large_message_via_the_producer.cs +++ b/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/When_posting_a_large_message_via_the_producer.cs @@ -1,30 +1,33 @@ -using System; +using System; using System.Linq; using System.Net.Mime; using System.Text.Json; using System.Threading; using System.Threading.Tasks; -using Xunit; using Paramore.Brighter.AzureServiceBus.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AzureServiceBus; using Paramore.Brighter.MessagingGateway.AzureServiceBus.AzureServiceBusWrappers; +using Paramore.Brighter.MessagingGateway.AzureServiceBus.ClientProvider; namespace Paramore.Brighter.AzureServiceBus.Tests.MessagingGateway { - [Trait("Category", "ASB")] - [Trait("Fragile", "CI")] - public class LargeAsbMessageProducerTests : IDisposable + [Category("ASB")] + [Property("Fragile", "CI")] + public class LargeAsbMessageProducerTests { - private readonly IAmAChannelSync _topicChannel; - private readonly IAmAChannelSync _queueChannel; - private readonly IAmAProducerRegistry _producerRegistry; + private IAmAChannelSync _topicChannel; + private IAmAChannelSync _queueChannel; + private IAmAProducerRegistry _producerRegistry; private ASBTestCommand _command; private readonly string _correlationId; private readonly ContentType _contentType; private readonly string _topicName; private readonly string _queueName; private readonly IAdministrationClientWrapper _administrationClient; + private readonly IServiceBusClientProvider _clientProvider; + private readonly AzureServiceBusSubscription _subscription; + private readonly AzureServiceBusSubscription _queueSubscription; public LargeAsbMessageProducerTests() { @@ -39,7 +42,7 @@ public LargeAsbMessageProducerTests() _topicName = $"Producer-Send-Tests-{Guid.NewGuid()}"; var routingKey = new RoutingKey(_topicName); - AzureServiceBusSubscription subscription = new( + _subscription = new AzureServiceBusSubscription( subscriptionName: new SubscriptionName(channelName), channelName: new ChannelName(channelName), routingKey: routingKey @@ -49,7 +52,7 @@ public LargeAsbMessageProducerTests() _queueName = $"Producer-queue-Send-Tests-{Guid.NewGuid()}"; var queueRoutingKey = new RoutingKey(_queueName); - AzureServiceBusSubscription queueSubscription = new( + _queueSubscription = new AzureServiceBusSubscription( subscriptionName: new SubscriptionName(queueChannelName), channelName: new ChannelName(queueChannelName), routingKey: queueRoutingKey, @@ -61,32 +64,35 @@ public LargeAsbMessageProducerTests() _contentType = new ContentType(MediaTypeNames.Application.Json); - var clientProvider = ASBCreds.ASBClientProvider; - _administrationClient = new AdministrationClientWrapper(clientProvider); - _administrationClient.CreateQueueAsync(_queueName, TimeSpan.FromMinutes(5), 3000).GetAwaiter().GetResult(); - _administrationClient.CreateTopicAsync(_topicName, TimeSpan.FromMinutes(5), 3000).GetAwaiter().GetResult(); - _administrationClient.CreateSubscriptionAsync(_topicName, channelName, new AzureServiceBusSubscriptionConfiguration()) - .GetAwaiter() - .GetResult(); + _clientProvider = ASBCreds.ASBClientProvider; + _administrationClient = new AdministrationClientWrapper(_clientProvider); + } + + [Before(Test)] + public async Task Setup() + { + await _administrationClient.CreateQueueAsync(_queueName, TimeSpan.FromMinutes(5), 3000); + await _administrationClient.CreateTopicAsync(_topicName, TimeSpan.FromMinutes(5), 3000); + await _administrationClient.CreateSubscriptionAsync(_topicName, _subscription.ChannelName.Value, new AzureServiceBusSubscriptionConfiguration()); var channelFactory = - new AzureServiceBusChannelFactory(new AzureServiceBusConsumerFactory(clientProvider)); - _topicChannel = channelFactory.CreateSyncChannel(subscription); - _queueChannel = channelFactory.CreateSyncChannel(queueSubscription); - - _producerRegistry = new AzureServiceBusProducerRegistryFactory( - clientProvider, - [ - new AzureServiceBusPublication { Topic = new RoutingKey(_topicName) }, + new AzureServiceBusChannelFactory(new AzureServiceBusConsumerFactory(_clientProvider)); + _topicChannel = channelFactory.CreateSyncChannel(_subscription); + _queueChannel = channelFactory.CreateSyncChannel(_queueSubscription); + + _producerRegistry = await new AzureServiceBusProducerRegistryFactory( + _clientProvider, + [ + new AzureServiceBusPublication { Topic = new RoutingKey(_topicName) }, new AzureServiceBusPublication { Topic = new RoutingKey(_queueName), UseServiceBusQueue = true} - ] + ] ) - .Create(); + .CreateAsync(); } - [Theory] - [InlineData(true)] - [InlineData(false)] + [Test] + [Arguments(true)] + [Arguments(false)] public async Task When_posting_a_large_message_via_the_bulk_producer(bool testQueues) { //arrange @@ -109,21 +115,21 @@ public async Task When_posting_a_large_message_via_the_bulk_producer(bool testQu //clear the queue channel.Acknowledge(message); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - Assert.Equal(_command.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_command.Id, message.Header.MessageId); - Assert.Contains(testQueues ? _queueName : _topicName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(message.Id).IsEqualTo(_command.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_command.Id); + await Assert.That(message.Header.Topic.Value).Contains(testQueues ? _queueName : _topicName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); //allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True(message.Header.TimeStamp > RoundToSeconds(DateTime.UtcNow.AddMinutes(-1))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That(message.Header.TimeStamp > RoundToSeconds(DateTime.UtcNow.AddMinutes(-1))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); //{"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(commandMessage.Body.Value, message.Body.Value); - Assert.Contains(testHeader, message.Header.Bag.Keys); - Assert.Equal(testHeaderValue, message.Header.Bag[testHeader]); + await Assert.That(message.Body.Value).IsEqualTo(commandMessage.Body.Value); + await Assert.That(message.Header.Bag.Keys).Contains(testHeader); + await Assert.That(message.Header.Bag[testHeader]).IsEqualTo(testHeaderValue); } private Message GenerateMessage(string topicName) => new Message( @@ -134,10 +140,11 @@ public async Task When_posting_a_large_message_via_the_bulk_producer(bool testQu ); - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _administrationClient.DeleteTopicAsync(_topicName).GetAwaiter().GetResult(); - _administrationClient.DeleteQueueAsync(_queueName).GetAwaiter().GetResult(); + await _administrationClient.DeleteTopicAsync(_topicName); + await _administrationClient.DeleteQueueAsync(_queueName); } private DateTime RoundToSeconds(DateTime dateTime) diff --git a/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/When_posting_a_message_via_the_producer.cs b/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/When_posting_a_message_via_the_producer.cs index ccadd8ae3f..c59cd82827 100644 --- a/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/When_posting_a_message_via_the_producer.cs +++ b/tests/Paramore.Brighter.AzureServiceBus.Tests/MessagingGateway/When_posting_a_message_via_the_producer.cs @@ -1,10 +1,9 @@ -using System; +using System; using System.Linq; using System.Net.Mime; using System.Text.Json; using System.Threading; using System.Threading.Tasks; -using Xunit; using Paramore.Brighter.AzureServiceBus.Tests.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.AzureServiceBus; @@ -12,8 +11,8 @@ namespace Paramore.Brighter.AzureServiceBus.Tests.MessagingGateway { - [Trait("Category", "ASB")] - public class ASBProducerTests : IDisposable + [Category("ASB")] + public class ASBProducerTests { private readonly IAmAChannelSync _topicChannel; private readonly IAmAChannelSync _queueChannel; @@ -81,9 +80,9 @@ public ASBProducerTests() .Create(); } - [Theory] - [InlineData(true)] - [InlineData(false)] + [Test] + [Arguments(true)] + [Arguments(false)] public async Task When_posting_a_message_via_the_producer(bool testQueues) { //arrange @@ -104,26 +103,26 @@ public async Task When_posting_a_message_via_the_producer(bool testQueues) //clear the queue channel.Acknowledge(message); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - Assert.Equal(_command.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_command.Id, message.Header.MessageId); - Assert.Contains(testQueues ? _queueName : _topicName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(message.Id).IsEqualTo(_command.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_command.Id); + await Assert.That(message.Header.Topic.Value).Contains(testQueues ? _queueName : _topicName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); //allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True(message.Header.TimeStamp > RoundToSeconds(DateTime.UtcNow.AddMinutes(-1))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That(message.Header.TimeStamp > RoundToSeconds(DateTime.UtcNow.AddMinutes(-1))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); //{"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(commandMessage.Body.Value, message.Body.Value); - Assert.Contains(testHeader, message.Header.Bag.Keys); - Assert.Equal(testHeaderValue, message.Header.Bag[testHeader]); + await Assert.That(message.Body.Value).IsEqualTo(commandMessage.Body.Value); + await Assert.That(message.Header.Bag.Keys).Contains(testHeader); + await Assert.That(message.Header.Bag[testHeader]).IsEqualTo(testHeaderValue); } - [Theory] - [InlineData(true)] - [InlineData(false)] + [Test] + [Arguments(true)] + [Arguments(false)] public async Task When_posting_a_message_via_the_bulk_producer(bool testQueues) { //arrange @@ -145,21 +144,21 @@ public async Task When_posting_a_message_via_the_bulk_producer(bool testQueues) //clear the queue channel.Acknowledge(message); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - Assert.Equal(_command.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_command.Id, message.Header.MessageId); - Assert.Contains(testQueues ? _queueName : _topicName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(message.Id).IsEqualTo(_command.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_command.Id); + await Assert.That(message.Header.Topic.Value).Contains(testQueues ? _queueName : _topicName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); //allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True(message.Header.TimeStamp > RoundToSeconds(DateTime.UtcNow.AddMinutes(-1))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That(message.Header.TimeStamp > RoundToSeconds(DateTime.UtcNow.AddMinutes(-1))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); //{"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(commandMessage.Body.Value, message.Body.Value); - Assert.Contains(testHeader, message.Header.Bag.Keys); - Assert.Equal(testHeaderValue, message.Header.Bag[testHeader]); + await Assert.That(message.Body.Value).IsEqualTo(commandMessage.Body.Value); + await Assert.That(message.Header.Bag.Keys).Contains(testHeader); + await Assert.That(message.Header.Bag[testHeader]).IsEqualTo(testHeaderValue); } private Message GenerateMessage(string topicName) => new Message( @@ -169,10 +168,11 @@ public async Task When_posting_a_message_via_the_bulk_producer(bool testQueues) new MessageBody(JsonSerializer.Serialize(_command, JsonSerialisationOptions.Options)) ); - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _administrationClient.DeleteTopicAsync(_topicName).GetAwaiter().GetResult(); - _administrationClient.DeleteQueueAsync(_queueName).GetAwaiter().GetResult(); + await _administrationClient.DeleteTopicAsync(_topicName); + await _administrationClient.DeleteQueueAsync(_queueName); } private DateTime RoundToSeconds(DateTime dateTime) diff --git a/tests/Paramore.Brighter.AzureServiceBus.Tests/Paramore.Brighter.AzureServiceBus.Tests.csproj b/tests/Paramore.Brighter.AzureServiceBus.Tests/Paramore.Brighter.AzureServiceBus.Tests.csproj index bacf3fbe1f..53cb8b5adb 100644 --- a/tests/Paramore.Brighter.AzureServiceBus.Tests/Paramore.Brighter.AzureServiceBus.Tests.csproj +++ b/tests/Paramore.Brighter.AzureServiceBus.Tests/Paramore.Brighter.AzureServiceBus.Tests.csproj @@ -1,29 +1,12 @@ - $(BrighterTestTargetFrameworks) false - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - + Exe + + - - + - - + \ No newline at end of file diff --git a/tests/Paramore.Brighter.Base.Test/Inbox/InboxAsyncTest.cs b/tests/Paramore.Brighter.Base.Test/Inbox/InboxAsyncTest.cs index 5ac55b73d1..7d8bb14c39 100644 --- a/tests/Paramore.Brighter.Base.Test/Inbox/InboxAsyncTest.cs +++ b/tests/Paramore.Brighter.Base.Test/Inbox/InboxAsyncTest.cs @@ -1,22 +1,23 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Threading.Tasks; using Paramore.Brighter.Base.Test.Requests; using Paramore.Brighter.Inbox.Exceptions; -using Xunit; namespace Paramore.Brighter.Base.Test.Inbox; -public abstract class InboxAsyncTest : IAsyncLifetime +public abstract class InboxAsyncTest { protected abstract IAmAnInboxAsync Inbox { get; } protected List CreatedCommands { get; } = []; - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await BeforeEachTestAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + public async Task Cleanup() { await AfterEachTestAsync(); } @@ -50,7 +51,7 @@ protected virtual MyCommand CreateCommand() return command; } - [Fact] + [Test] public async Task When_Adding_A_Command_To_The_Inbox_It_Can_Be_Retrieved() { // Arrange @@ -62,12 +63,12 @@ public async Task When_Adding_A_Command_To_The_Inbox_It_Can_Be_Retrieved() var loadedCommand = await Inbox.GetAsync(command.Id, contextKey, null); // Assert - Assert.NotNull(loadedCommand); - Assert.Equal(command.Value, loadedCommand.Value); - Assert.Equal(command.Id, loadedCommand.Id); + await Assert.That(loadedCommand).IsNotNull(); + await Assert.That(loadedCommand.Value).IsEqualTo(command.Value); + await Assert.That(loadedCommand.Id).IsEqualTo(command.Id); } - [Fact] + [Test] public async Task When_Adding_A_Duplicate_Command_With_Same_Context_Key_It_Should_Not_Throw() { // Arrange @@ -80,10 +81,10 @@ public async Task When_Adding_A_Duplicate_Command_With_Same_Context_Key_It_Shoul // Assert var exists = await Inbox.ExistsAsync(command.Id, contextKey, null); - Assert.True(exists, $"A command with '{command.Id.Value}' Id should exists"); + await Assert.That(exists).IsTrue(); } - [Fact] + [Test] public async Task When_Adding_A_Duplicate_Command_With_Different_Context_Key_It_Should_Not_Throw() { // Arrange @@ -96,10 +97,10 @@ public async Task When_Adding_A_Duplicate_Command_With_Different_Context_Key_It_ // Assert var exists = await Inbox.ExistsAsync(command.Id, contextKey, null); - Assert.True(exists, $"A command with '{command.Id.Value}' Id should exists"); + await Assert.That(exists).IsTrue(); } - [Fact] + [Test] public async Task When_Getting_A_Non_Existent_Command_It_Should_Throw_RequestNotFoundException() { // Arrange @@ -110,7 +111,7 @@ public async Task When_Getting_A_Non_Existent_Command_It_Should_Throw_RequestNot await Assert.ThrowsAsync>(() => Inbox.GetAsync(commandId, contextKey, null)); } - [Fact] + [Test] public async Task When_Getting_A_Command_With_Wrong_Context_Key_It_Should_Throw_RequestNotFoundException() { // Arrange @@ -121,13 +122,13 @@ public async Task When_Getting_A_Command_With_Wrong_Context_Key_It_Should_Throw_ await Assert.ThrowsAsync>(() => Inbox.GetAsync(command.Id, Uuid.NewAsString(), null)); } - [Fact] + [Test] public async Task When_Checking_If_A_Non_Existent_Command_Exists_It_Should_Return_False() { // Act var exists = await Inbox.ExistsAsync(Uuid.NewAsString(), Uuid.NewAsString(), null); // Assert - Assert.False(exists, "A command should not exists"); + await Assert.That(exists).IsFalse(); } } diff --git a/tests/Paramore.Brighter.Base.Test/Inbox/InboxTests.cs b/tests/Paramore.Brighter.Base.Test/Inbox/InboxTests.cs index ccb8009968..dc90039b62 100644 --- a/tests/Paramore.Brighter.Base.Test/Inbox/InboxTests.cs +++ b/tests/Paramore.Brighter.Base.Test/Inbox/InboxTests.cs @@ -1,8 +1,7 @@ -using System; +using System; using System.Collections.Generic; using Paramore.Brighter.Base.Test.Requests; using Paramore.Brighter.Inbox.Exceptions; -using Xunit; namespace Paramore.Brighter.Base.Test.Inbox; @@ -49,8 +48,8 @@ protected virtual MyCommand CreateCommand() return command; } - [Fact] - public void When_Adding_A_Command_To_The_Inbox_It_Can_Be_Retrieved() + [Test] + public async Task When_Adding_A_Command_To_The_Inbox_It_Can_Be_Retrieved() { // Arrange var contextKey = Uuid.NewAsString(); @@ -61,13 +60,13 @@ public void When_Adding_A_Command_To_The_Inbox_It_Can_Be_Retrieved() var loadedCommand = Inbox.Get(command.Id, contextKey, null); // Assert - Assert.NotNull(loadedCommand); - Assert.Equal(command.Value, loadedCommand.Value); - Assert.Equal(command.Id, loadedCommand.Id); + await Assert.That(loadedCommand).IsNotNull(); + await Assert.That(loadedCommand.Value).IsEqualTo(command.Value); + await Assert.That(loadedCommand.Id).IsEqualTo(command.Id); } - [Fact] - public void When_Adding_A_Duplicate_Command_With_Same_Context_Key_It_Should_Not_Throw() + [Test] + public async Task When_Adding_A_Duplicate_Command_With_Same_Context_Key_It_Should_Not_Throw() { // Arrange var contextKey = Uuid.NewAsString(); @@ -80,11 +79,11 @@ public void When_Adding_A_Duplicate_Command_With_Same_Context_Key_It_Should_Not_ // Assert var exists = Inbox.Exists(command.Id, contextKey, null); - Assert.True(exists, $"A command with '{command.Id.Value}' Id should exists"); + await Assert.That(exists).IsTrue(); } - [Fact] - public void When_Adding_A_Duplicate_Command_With_Different_Context_Key_It_Should_Not_Throw() + [Test] + public async Task When_Adding_A_Duplicate_Command_With_Different_Context_Key_It_Should_Not_Throw() { // Arrange var contextKey = Uuid.NewAsString(); @@ -97,38 +96,40 @@ public void When_Adding_A_Duplicate_Command_With_Different_Context_Key_It_Should // Assert var exists = Inbox.Exists(command.Id, contextKey, null); - Assert.True(exists, $"A command with '{command.Id.Value}' Id should exists"); + await Assert.That(exists).IsTrue(); } - [Fact] - public void When_Getting_A_Non_Existent_Command_It_Should_Throw_RequestNotFoundException() + [Test] + public Task When_Getting_A_Non_Existent_Command_It_Should_Throw_RequestNotFoundException() { // Arrange var contextKey = Uuid.NewAsString(); var commandId = Uuid.NewAsString(); // Act & Assert - Assert.Throws>(() => Inbox.Get(commandId, contextKey, null)); + Assert.ThrowsExactly>(() => Inbox.Get(commandId, contextKey, null)); + return Task.CompletedTask; } - [Fact] - public void When_Getting_A_Command_With_Wrong_Context_Key_It_Should_Throw_RequestNotFoundException() + [Test] + public Task When_Getting_A_Command_With_Wrong_Context_Key_It_Should_Throw_RequestNotFoundException() { // Arrange var command = CreateCommand(); Inbox.Add(command, Uuid.NewAsString(), null); // Act & Assert - Assert.Throws>(() => Inbox.Get(command.Id, Uuid.NewAsString(), null)); + Assert.ThrowsExactly>(() => Inbox.Get(command.Id, Uuid.NewAsString(), null)); + return Task.CompletedTask; } - [Fact] - public void When_Checking_If_A_Non_Existent_Command_Exists_It_Should_Return_False() + [Test] + public async Task When_Checking_If_A_Non_Existent_Command_Exists_It_Should_Return_False() { // Act var exists = Inbox.Exists(Uuid.NewAsString(), Uuid.NewAsString(), null); // Assert - Assert.False(exists, "A command should not exists"); + await Assert.That(exists).IsFalse(); } } diff --git a/tests/Paramore.Brighter.Base.Test/Locking/DistributedLockingAsyncTest.cs b/tests/Paramore.Brighter.Base.Test/Locking/DistributedLockingAsyncTest.cs index 021ac7f173..a4a91cde9b 100644 --- a/tests/Paramore.Brighter.Base.Test/Locking/DistributedLockingAsyncTest.cs +++ b/tests/Paramore.Brighter.Base.Test/Locking/DistributedLockingAsyncTest.cs @@ -1,18 +1,18 @@ using System; using System.Threading; using System.Threading.Tasks; -using Xunit; namespace Paramore.Brighter.Base.Test.Locking; -public abstract class DistributedLockingAsyncTest : IAsyncLifetime +public abstract class DistributedLockingAsyncTest { - public async Task InitializeAsync() + [Before(HookType.Test)] public async Task Setup() { await BeforeEachTestAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + public async Task Cleanup() { await AfterEachTestAsync(); } @@ -32,7 +32,7 @@ protected virtual Task AfterEachTestAsync() protected virtual TimeSpan DelayBetweenTryAcquireLockOnSameResource { get; } = TimeSpan.Zero; - [Fact] + [Test] public async Task When_Obtaining_A_Lock_On_A_Resource_It_Should_Succeed() { // Arrange @@ -43,11 +43,11 @@ public async Task When_Obtaining_A_Lock_On_A_Resource_It_Should_Succeed() var @lock = await provider.ObtainLockAsync(resource, CancellationToken.None); // Assert - Assert.NotNull(@lock); - Assert.NotEmpty(@lock); + await Assert.That(@lock).IsNotNull(); + await Assert.That(@lock).IsNotEmpty(); } - [Fact] + [Test] public async Task When_Trying_To_Obtain_Same_Lock_Twice_With_Same_Instance_It_Should_Fail_Second_Time() { // Arrange @@ -59,12 +59,12 @@ public async Task When_Trying_To_Obtain_Same_Lock_Twice_With_Same_Instance_It_Sh var lock2 = await provider.ObtainLockAsync(resource, CancellationToken.None); // Assert - Assert.NotNull(lock1); - Assert.NotEmpty(lock1); - Assert.Null(lock2); + await Assert.That(lock1).IsNotNull(); + await Assert.That(lock1).IsNotEmpty(); + await Assert.That(lock2).IsNull(); } - [Fact] + [Test] public async Task When_Trying_To_Obtain_Same_Lock_With_Different_Instances_It_Should_Fail_Second_Time() { // Arrange @@ -77,12 +77,12 @@ public async Task When_Trying_To_Obtain_Same_Lock_With_Different_Instances_It_Sh var lock2 = await provider2.ObtainLockAsync(resource, CancellationToken.None); // Assert - Assert.NotNull(lock1); - Assert.NotEmpty(lock1); - Assert.Null(lock2); + await Assert.That(lock1).IsNotNull(); + await Assert.That(lock1).IsNotEmpty(); + await Assert.That(lock2).IsNull(); } - [Fact] + [Test] public async Task When_Lock_Is_Released_It_Can_Be_Obtained_Again() { // Arrange @@ -94,9 +94,9 @@ public async Task When_Lock_Is_Released_It_Can_Be_Obtained_Again() var lock2 = await provider.ObtainLockAsync(resource, CancellationToken.None); // Assert - Initial locks - Assert.NotNull(lock1); - Assert.NotEmpty(lock1); - Assert.Null(lock2); + await Assert.That(lock1).IsNotNull(); + await Assert.That(lock1).IsNotEmpty(); + await Assert.That(lock2).IsNull(); // Act - Release lock await provider.ReleaseLockAsync(resource, lock1, CancellationToken.None); @@ -108,7 +108,7 @@ public async Task When_Lock_Is_Released_It_Can_Be_Obtained_Again() // Assert - Lock can be obtained again var lock3 = await provider.ObtainLockAsync(resource, CancellationToken.None); - Assert.NotNull(lock3); - Assert.NotEmpty(lock3); + await Assert.That(lock3).IsNotNull(); + await Assert.That(lock3).IsNotEmpty(); } } diff --git a/tests/Paramore.Brighter.Base.Test/Outbox/OutboxAsyncTest.cs b/tests/Paramore.Brighter.Base.Test/Outbox/OutboxAsyncTest.cs index acecb07de0..28bb888f8f 100644 --- a/tests/Paramore.Brighter.Base.Test/Outbox/OutboxAsyncTest.cs +++ b/tests/Paramore.Brighter.Base.Test/Outbox/OutboxAsyncTest.cs @@ -1,25 +1,26 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Net.Mime; using System.Threading.Tasks; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Base.Test.Outbox; -public abstract class OutboxAsyncTest : IAsyncLifetime +public abstract class OutboxAsyncTest { protected abstract IAmAnOutboxAsync Outbox { get; } protected List CreatedMessages { get; } = []; - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await BeforeEachTestAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + public async Task Cleanup() { await AfterEachTestAsync(); } @@ -34,11 +35,6 @@ protected virtual Task CreateStoreAsync() return Task.CompletedTask; } - public void Dispose() - { - AfterEachTestAsync().GetAwaiter().GetResult(); - } - protected virtual async Task AfterEachTestAsync() { await DeleteStoreAsync(); @@ -89,7 +85,7 @@ protected virtual Message CreateRandomMessage(DateTimeOffset? timestamp = null) return message; } - [Fact] + [Test] public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() { // Arrange @@ -110,12 +106,12 @@ public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } - [Fact] + [Test] public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() { // Arrange @@ -136,12 +132,12 @@ public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Ou .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Header.MessageId)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Header.MessageId)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Header.MessageId)); + await Assert.That(messages.Select(x => x.Header.MessageId)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Header.MessageId)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Header.MessageId)).DoesNotContain(thirdMessage.Id); } - [Fact] + [Test] public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() { // Arrange @@ -158,13 +154,13 @@ public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_An var messages = (await GetAllMessagesAsync()).ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } - [Fact] + [Test] public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() { // Arrange @@ -183,13 +179,13 @@ public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requeste .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } - [Fact] + [Test] public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() { // Arrange @@ -206,11 +202,11 @@ public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_M var message = await Outbox.GetAsync(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(dispatched.Id, message.Id); + await Assert.That(message).IsNotNull(); + await Assert.That(message.Id).IsEqualTo(dispatched.Id); } - [Fact] + [Test] public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() { // Arrange @@ -229,23 +225,23 @@ public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = (await Outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, $"Expecting at least 2 messages, but it got {allDispatched.Length}"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); - - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); - - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); + + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); + + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } - [Fact] + [Test] public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() { // Arrange @@ -265,22 +261,22 @@ public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = (await Outbox.OutstandingMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allUndispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allUndispatched.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, allUndispatched.Select(x => x.Id)); - Assert.Contains(undispatched.Id, allUndispatched.Select(x => x.Id)); - - Assert.True(allUndispatched.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); - - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(allUndispatched.Length >= 2).IsTrue(); + await Assert.That(allUndispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allUndispatched.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(allUndispatched.Select(x => x.Id)).Contains(undispatched.Id); + + await Assert.That(allUndispatched.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); + + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } - [Fact] + [Test] public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() { // Arrange @@ -290,10 +286,10 @@ public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_ var message = await Outbox.GetAsync(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - [Fact] + [Test] public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw() { // Arrange @@ -306,10 +302,10 @@ public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw() // Assert var storedMessage = await Outbox.GetAsync(message.Id, context); - Assert.Equal(message.Id, storedMessage.Id); + await Assert.That(storedMessage.Id).IsEqualTo(message.Id); } - [Fact] + [Test] public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() { // Arrange @@ -321,41 +317,41 @@ public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties( var storedMessage = await Outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } - [Fact] + [Test] public virtual async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() { // Arrange @@ -373,42 +369,43 @@ public virtual async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_ var storedMessage = await Outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); + // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } - [Fact] + [Test] public virtual async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() { // Arrange @@ -424,6 +421,6 @@ public virtual async Task When_Adding_A_Message_Within_Transaction_And_Rollback_ var storedMessage = await Outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.Base.Test/Outbox/OutboxTest.cs b/tests/Paramore.Brighter.Base.Test/Outbox/OutboxTest.cs index d07533be31..feb5034a0b 100644 --- a/tests/Paramore.Brighter.Base.Test/Outbox/OutboxTest.cs +++ b/tests/Paramore.Brighter.Base.Test/Outbox/OutboxTest.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Net.Mime; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Base.Test.Outbox; @@ -81,8 +80,8 @@ protected virtual Message CreateRandomMessage(DateTimeOffset? timestamp = null) return message; } - [Fact] - public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -102,13 +101,13 @@ public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } - [Fact] - public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -128,13 +127,13 @@ public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } - [Fact] - public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() + [Test] + public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() { // Arrange var context = new RequestContext(); @@ -150,14 +149,14 @@ public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undi var messages = GetAllMessages().ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } - [Fact] - public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() + [Test] + public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() { // Arrange var context = new RequestContext(); @@ -175,14 +174,14 @@ public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Mess .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } - [Fact] - public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() + [Test] + public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() { // Arrange var context = new RequestContext(); @@ -198,12 +197,12 @@ public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message var message = Outbox.Get(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(dispatched.Id, message.Id); + await Assert.That(message).IsNotNull(); + await Assert.That(message.Id).IsEqualTo(dispatched.Id); } - [Fact] - public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -221,24 +220,24 @@ public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = Outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); - - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); - - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); + + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); + + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } - [Fact] - public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -255,23 +254,23 @@ public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = Outbox.OutstandingMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allUndispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allUndispatched.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, allUndispatched.Select(x => x.Id)); - Assert.Contains(undispatched.Id, allUndispatched.Select(x => x.Id)); - - Assert.True(allUndispatched.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); - - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(allUndispatched.Length >= 2).IsTrue(); + await Assert.That(allUndispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allUndispatched.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(allUndispatched.Select(x => x.Id)).Contains(undispatched.Id); + + await Assert.That(allUndispatched.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); + + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } - [Fact] - public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() + [Test] + public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() { // Arrange var context = new RequestContext(); @@ -280,11 +279,11 @@ public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Messag var message = Outbox.Get(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - [Fact] - public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() + [Test] + public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw() { // Arrange var context = new RequestContext(); @@ -296,11 +295,11 @@ public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } - [Fact] - public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() + [Test] + public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() { // Arrange var context = new RequestContext(); @@ -311,46 +310,46 @@ public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() var storedMessage = Outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } - [Fact] - public virtual void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() + [Test] + public virtual async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() { // Arrange var transaction = CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var message = CreateRandomMessage(); var context = new RequestContext(); @@ -358,61 +357,62 @@ public virtual void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored // Act Outbox.Add(message, context, transactionProvider: transaction); - transaction.Commit(); + await transaction.CommitAsync(); var storedMessage = Outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); + // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } - [Fact] - public virtual void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() + [Test] + public virtual async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() { // Arrange var transaction = CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = CreateRandomMessage(); // Act Outbox.Add(message, context, transactionProvider: transaction); - transaction.Rollback(); + await transaction.RollbackAsync(); var storedMessage = Outbox.Get(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.Base.Test/Paramore.Brighter.Base.Test.csproj b/tests/Paramore.Brighter.Base.Test/Paramore.Brighter.Base.Test.csproj index de9129e624..37a623d817 100644 --- a/tests/Paramore.Brighter.Base.Test/Paramore.Brighter.Base.Test.csproj +++ b/tests/Paramore.Brighter.Base.Test/Paramore.Brighter.Base.Test.csproj @@ -1,16 +1,12 @@ - - - - $(BrighterTestTargetFrameworks) - false - - - - - - - - - - - + + + $(BrighterTestTargetFrameworks) + false + Exe + + + + + + + \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Archiving/When_Archiving_Old_Messages_From_The_Outbox.cs b/tests/Paramore.Brighter.Core.Tests/Archiving/When_Archiving_Old_Messages_From_The_Outbox.cs index 3ac0476d6c..121ccae4ae 100644 --- a/tests/Paramore.Brighter.Core.Tests/Archiving/When_Archiving_Old_Messages_From_The_Outbox.cs +++ b/tests/Paramore.Brighter.Core.Tests/Archiving/When_Archiving_Old_Messages_From_The_Outbox.cs @@ -1,129 +1,105 @@ -using System; +using System; using System.Collections.Generic; using System.Transactions; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.Archiving; - public class ServiceBusMessageStoreArchiverTests { private readonly InMemoryOutbox _outbox; private readonly InMemoryArchiveProvider _archiveProvider; private readonly FakeTimeProvider _timeProvider; private readonly RoutingKey _routingKey = new("MyTopic"); - private readonly OutboxArchiver _archiver; - + private readonly OutboxArchiver _archiver; public ServiceBusMessageStoreArchiverTests() { _timeProvider = new FakeTimeProvider(); - var tracer = new BrighterTracer(); - _outbox = new InMemoryOutbox(_timeProvider){Tracer = tracer, EntryTimeToLive = TimeSpan.FromMinutes(30)}; + _outbox = new InMemoryOutbox(_timeProvider) + { + Tracer = tracer, + EntryTimeToLive = TimeSpan.FromMinutes(30) + }; _archiveProvider = new InMemoryArchiveProvider(); - - _archiver = new OutboxArchiver( - _outbox, - _archiveProvider - ); - + _archiver = new OutboxArchiver(_outbox, _archiveProvider); } - [Fact] - public void When_Archiving_All_Messages_From_The_Outbox() + [Test] + public async Task When_Archiving_All_Messages_From_The_Outbox() { //arrange var context = new RequestContext(); - var messageOne = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody("test content")); - _outbox.Add(messageOne, context); - _outbox.MarkDispatched(messageOne.Id, context); - + await _outbox.AddAsync(messageOne, context); + await _outbox.MarkDispatchedAsync(messageOne.Id, context); var messageTwo = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody("test content")); - _outbox.Add(messageTwo, context); - _outbox.MarkDispatched(messageTwo.Id, context); - + await _outbox.AddAsync(messageTwo, context); + await _outbox.MarkDispatchedAsync(messageTwo.Id, context); var messageThree = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody("test content")); - _outbox.Add(messageThree, context); - _outbox.MarkDispatched(messageThree.Id, context); - + await _outbox.AddAsync(messageThree, context); + await _outbox.MarkDispatchedAsync(messageThree.Id, context); //act - Assert.Equal(3, _outbox.EntryCount); - + await Assert.That(_outbox.EntryCount).IsEqualTo(3); _timeProvider.Advance(TimeSpan.FromMinutes(15)); - - _archiver.Archive(TimeSpan.FromMilliseconds(500), context); - + await _archiver.ArchiveAsync(TimeSpan.FromMilliseconds(500), context); //assert - Assert.Equal(0, _outbox.EntryCount); - Assert.Contains(new KeyValuePair(messageOne.Id, messageOne), _archiveProvider.ArchivedMessages); - Assert.Contains(new KeyValuePair(messageTwo.Id, messageTwo), _archiveProvider.ArchivedMessages); - Assert.Contains(new KeyValuePair(messageThree.Id, messageThree), _archiveProvider.ArchivedMessages); + await Assert.That(_outbox.EntryCount).IsEqualTo(0); + await Assert.That(_archiveProvider.ArchivedMessages).Contains(new KeyValuePair(messageOne.Id, messageOne)); + await Assert.That(_archiveProvider.ArchivedMessages).Contains(new KeyValuePair(messageTwo.Id, messageTwo)); + await Assert.That(_archiveProvider.ArchivedMessages).Contains(new KeyValuePair(messageThree.Id, messageThree)); } - [Fact] - public void When_Archiving_Some_Messages_From_The_Outbox() + [Test] + public async Task When_Archiving_Some_Messages_From_The_Outbox() { //arrange var context = new RequestContext(); var messageOne = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody("test content")); - _outbox.Add(messageOne, context); - _outbox.MarkDispatched(messageOne.Id, context); - + await _outbox.AddAsync(messageOne, context); + await _outbox.MarkDispatchedAsync(messageOne.Id, context); var messageTwo = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody("test content")); - _outbox.Add(messageTwo, context); - _outbox.MarkDispatched(messageTwo.Id, context); - + await _outbox.AddAsync(messageTwo, context); + await _outbox.MarkDispatchedAsync(messageTwo.Id, context); var messageThree = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody("test content")); - _outbox.Add(messageThree, context); - + await _outbox.AddAsync(messageThree, context); //act - Assert.Equal(3, _outbox.EntryCount); - + await Assert.That(_outbox.EntryCount).IsEqualTo(3); _timeProvider.Advance(TimeSpan.FromSeconds(30)); - - _archiver.Archive(TimeSpan.FromSeconds(30), context); - + await _archiver.ArchiveAsync(TimeSpan.FromSeconds(30), context); //assert - Assert.Equal(1, _outbox.EntryCount); - Assert.Contains(new KeyValuePair(messageOne.Id, messageOne), _archiveProvider.ArchivedMessages); - Assert.Contains(new KeyValuePair(messageTwo.Id, messageTwo), _archiveProvider.ArchivedMessages); - Assert.DoesNotContain(new KeyValuePair(messageThree.Id, messageThree), _archiveProvider.ArchivedMessages); + await Assert.That(_outbox.EntryCount).IsEqualTo(1); + await Assert.That(_archiveProvider.ArchivedMessages).Contains(new KeyValuePair(messageOne.Id, messageOne)); + await Assert.That(_archiveProvider.ArchivedMessages).Contains(new KeyValuePair(messageTwo.Id, messageTwo)); + await Assert.That(_archiveProvider.ArchivedMessages).DoesNotContain(new KeyValuePair(messageThree.Id, messageThree)); } - [Fact] - public void When_Archiving_No_Messages_From_The_Outbox() + [Test] + public async Task When_Archiving_No_Messages_From_The_Outbox() { var context = new RequestContext(); var messageOne = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody("test content")); - _outbox.Add(messageOne, context); - + await _outbox.AddAsync(messageOne, context); var messageTwo = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody("test content")); - _outbox.Add(messageTwo, context); - + await _outbox.AddAsync(messageTwo, context); var messageThree = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody("test content")); - _outbox.Add(messageThree, context); - + await _outbox.AddAsync(messageThree, context); //act - Assert.Equal(3, _outbox.EntryCount); - - _archiver.Archive(TimeSpan.FromMilliseconds(20000), context); - + await Assert.That(_outbox.EntryCount).IsEqualTo(3); + await _archiver.ArchiveAsync(TimeSpan.FromMilliseconds(20000), context); //assert - Assert.Equal(3, _outbox.EntryCount); - Assert.DoesNotContain(new KeyValuePair(messageOne.Id, messageOne), _archiveProvider.ArchivedMessages); - Assert.DoesNotContain(new KeyValuePair(messageTwo.Id, messageTwo), _archiveProvider.ArchivedMessages); - Assert.DoesNotContain(new KeyValuePair(messageThree.Id, messageThree), _archiveProvider.ArchivedMessages); + await Assert.That(_outbox.EntryCount).IsEqualTo(3); + await Assert.That(_archiveProvider.ArchivedMessages).DoesNotContain(new KeyValuePair(messageOne.Id, messageOne)); + await Assert.That(_archiveProvider.ArchivedMessages).DoesNotContain(new KeyValuePair(messageTwo.Id, messageTwo)); + await Assert.That(_archiveProvider.ArchivedMessages).DoesNotContain(new KeyValuePair(messageThree.Id, messageThree)); } - [Fact] - public void When_Archiving_An_Empty_The_Outbox() + [Test] + public async Task When_Archiving_An_Empty_The_Outbox() { var context = new RequestContext(); - _archiver.Archive(TimeSpan.FromMilliseconds(20000), context); - + await _archiver.ArchiveAsync(TimeSpan.FromMilliseconds(20000), context); //assert - Assert.Equal(0, _outbox.EntryCount); + await Assert.That(_outbox.EntryCount).IsEqualTo(0); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Archiving/When_Archiving_Old_Messages_From_The_Outbox_Async.cs b/tests/Paramore.Brighter.Core.Tests/Archiving/When_Archiving_Old_Messages_From_The_Outbox_Async.cs index 91c1e1b278..f1fdce1f8b 100644 --- a/tests/Paramore.Brighter.Core.Tests/Archiving/When_Archiving_Old_Messages_From_The_Outbox_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Archiving/When_Archiving_Old_Messages_From_The_Outbox_Async.cs @@ -1,33 +1,31 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using System.Transactions; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.Archiving; - public class ServiceBusMessageStoreArchiverTestsAsync { private readonly InMemoryOutbox _outbox; private readonly InMemoryArchiveProvider _archiveProvider; private readonly FakeTimeProvider _timeProvider; private readonly RoutingKey _routingKey = new("MyTopic"); - private readonly OutboxArchiver _archiver; - + private readonly OutboxArchiver _archiver; public ServiceBusMessageStoreArchiverTestsAsync() { _timeProvider = new FakeTimeProvider(); var tracer = new BrighterTracer(); - _outbox = new InMemoryOutbox(_timeProvider){Tracer = tracer}; + _outbox = new InMemoryOutbox(_timeProvider) + { + Tracer = tracer + }; _archiveProvider = new InMemoryArchiveProvider(); - _archiver = new OutboxArchiver(_outbox, _archiveProvider); - } - [Fact] + [Test] public async Task When_Archiving_Old_Messages_From_The_Outbox() { //arrange @@ -35,30 +33,24 @@ public async Task When_Archiving_Old_Messages_From_The_Outbox() var messageOne = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody("test content")); await _outbox.AddAsync(messageOne, context); await _outbox.MarkDispatchedAsync(messageOne.Id, context); - var messageTwo = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody("test content")); await _outbox.AddAsync(messageTwo, context); await _outbox.MarkDispatchedAsync(messageTwo.Id, context); - var messageThree = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody("test content")); await _outbox.AddAsync(messageThree, context); await _outbox.MarkDispatchedAsync(messageThree.Id, context); - //act - Assert.Equal(3, _outbox.EntryCount); - + await Assert.That(_outbox.EntryCount).IsEqualTo(3); _timeProvider.Advance(TimeSpan.FromSeconds(30)); - await _archiver.ArchiveAsync(TimeSpan.FromSeconds(15), context); - //assert - Assert.Equal(0, _outbox.EntryCount); - Assert.Contains(new KeyValuePair(messageOne.Id, messageOne), _archiveProvider.ArchivedMessages); - Assert.Contains(new KeyValuePair(messageTwo.Id, messageTwo), _archiveProvider.ArchivedMessages); - Assert.Contains(new KeyValuePair(messageThree.Id, messageThree), _archiveProvider.ArchivedMessages); + await Assert.That(_outbox.EntryCount).IsEqualTo(0); + await Assert.That(_archiveProvider.ArchivedMessages).Contains(new KeyValuePair(messageOne.Id, messageOne)); + await Assert.That(_archiveProvider.ArchivedMessages).Contains(new KeyValuePair(messageTwo.Id, messageTwo)); + await Assert.That(_archiveProvider.ArchivedMessages).Contains(new KeyValuePair(messageThree.Id, messageThree)); } - [Fact] + [Test] public async Task When_Archiving_Some_Messages_From_The_Outbox() { //arrange @@ -66,64 +58,51 @@ public async Task When_Archiving_Some_Messages_From_The_Outbox() var messageOne = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody("test content")); await _outbox.AddAsync(messageOne, context); await _outbox.MarkDispatchedAsync(messageOne.Id, context); - var messageTwo = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody("test content")); await _outbox.AddAsync(messageTwo, context); await _outbox.MarkDispatchedAsync(messageTwo.Id, context); - var messageThree = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody("test content")); await _outbox.AddAsync(messageThree, context); - //act - Assert.Equal(3, _outbox.EntryCount); - + await Assert.That(_outbox.EntryCount).IsEqualTo(3); _timeProvider.Advance(TimeSpan.FromSeconds(30)); - await _archiver.ArchiveAsync(TimeSpan.FromSeconds(15), context); - //assert - Assert.Equal(1, _outbox.EntryCount); - Assert.Contains(new KeyValuePair(messageOne.Id, messageOne), _archiveProvider.ArchivedMessages); - Assert.Contains(new KeyValuePair(messageTwo.Id, messageTwo), _archiveProvider.ArchivedMessages); - Assert.DoesNotContain(new KeyValuePair(messageThree.Id, messageThree), _archiveProvider.ArchivedMessages); + await Assert.That(_outbox.EntryCount).IsEqualTo(1); + await Assert.That(_archiveProvider.ArchivedMessages).Contains(new KeyValuePair(messageOne.Id, messageOne)); + await Assert.That(_archiveProvider.ArchivedMessages).Contains(new KeyValuePair(messageTwo.Id, messageTwo)); + await Assert.That(_archiveProvider.ArchivedMessages).DoesNotContain(new KeyValuePair(messageThree.Id, messageThree)); } - [Fact] + [Test] public async Task When_Archiving_No_Messages_From_The_Outbox() { //arrange var context = new RequestContext(); var messageOne = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody("test content")); await _outbox.AddAsync(messageOne, context); - var messageTwo = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody("test content")); await _outbox.AddAsync(messageTwo, context); - var messageThree = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody("test content")); await _outbox.AddAsync(messageThree, context); - //act - Assert.Equal(3, _outbox.EntryCount); - + await Assert.That(_outbox.EntryCount).IsEqualTo(3); await _archiver.ArchiveAsync(TimeSpan.FromMilliseconds(20000), context); - //assert - Assert.Equal(3, _outbox.EntryCount); - Assert.DoesNotContain(new KeyValuePair(messageOne.Id, messageOne), _archiveProvider.ArchivedMessages); - Assert.DoesNotContain(new KeyValuePair(messageTwo.Id, messageTwo), _archiveProvider.ArchivedMessages); - Assert.DoesNotContain(new KeyValuePair(messageThree.Id, messageThree), _archiveProvider.ArchivedMessages); + await Assert.That(_outbox.EntryCount).IsEqualTo(3); + await Assert.That(_archiveProvider.ArchivedMessages).DoesNotContain(new KeyValuePair(messageOne.Id, messageOne)); + await Assert.That(_archiveProvider.ArchivedMessages).DoesNotContain(new KeyValuePair(messageTwo.Id, messageTwo)); + await Assert.That(_archiveProvider.ArchivedMessages).DoesNotContain(new KeyValuePair(messageThree.Id, messageThree)); } - [Fact] + [Test] public async Task When_Archiving_An_Empty_Outbox() { //arrange var context = new RequestContext(); - //act await _archiver.ArchiveAsync(TimeSpan.FromMilliseconds(20000), context); - //assert - Assert.Equal(0, _outbox.EntryCount); + await Assert.That(_outbox.EntryCount).IsEqualTo(0); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Archiving/When_archiving_with_async_only_outbox_should_call_async_archive.cs b/tests/Paramore.Brighter.Core.Tests/Archiving/When_archiving_with_async_only_outbox_should_call_async_archive.cs index cde93ba74c..3ee015621a 100644 --- a/tests/Paramore.Brighter.Core.Tests/Archiving/When_archiving_with_async_only_outbox_should_call_async_archive.cs +++ b/tests/Paramore.Brighter.Core.Tests/Archiving/When_archiving_with_async_only_outbox_should_call_async_archive.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.Core.Tests.Archiving.TestDoubles; using Paramore.Brighter.Observability; using Paramore.Brighter.Outbox.Hosting; -using Xunit; namespace Paramore.Brighter.Core.Tests.Archiving; public class TimedOutboxArchiverAsyncOnlyTests { - [Fact] + [Test] public async Task When_archiving_with_async_only_outbox_should_call_async_archive() { //Arrange @@ -48,12 +47,11 @@ public async Task When_archiving_with_async_only_outbox_should_call_async_archiv await timedArchiver.StopAsync(cts.Token); //Assert - Assert.True(archiver.HasAsyncOutbox(), "Should have an async outbox"); - Assert.False(archiver.HasOutbox(), "Should not have a sync outbox"); - Assert.Equal(0, innerOutbox.EntryCount); - Assert.Contains( - new KeyValuePair(message.Id, message), + await Assert.That(archiver.HasAsyncOutbox()).IsTrue().Because("Should have an async outbox"); + await Assert.That(archiver.HasOutbox()).IsFalse().Because("Should not have a sync outbox"); + await Assert.That(innerOutbox.EntryCount).IsZero(); + await Assert.That( archiveProvider.ArchivedMessages - ); + ).Contains(new KeyValuePair(message.Id, message)); } } diff --git a/tests/Paramore.Brighter.Core.Tests/Archiving/When_archiving_with_both_sync_and_async_outbox_should_prefer_async.cs b/tests/Paramore.Brighter.Core.Tests/Archiving/When_archiving_with_both_sync_and_async_outbox_should_prefer_async.cs index e5a8b2b475..e8730e5c6c 100644 --- a/tests/Paramore.Brighter.Core.Tests/Archiving/When_archiving_with_both_sync_and_async_outbox_should_prefer_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Archiving/When_archiving_with_both_sync_and_async_outbox_should_prefer_async.cs @@ -6,13 +6,12 @@ using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Observability; using Paramore.Brighter.Outbox.Hosting; -using Xunit; namespace Paramore.Brighter.Core.Tests.Archiving; public class TimedOutboxArchiverPrefersAsyncTests { - [Fact] + [Test] public async Task When_archiving_with_both_sync_and_async_outbox_should_prefer_async() { //Arrange — InMemoryOutbox implements both IAmAnOutboxSync and IAmAnOutboxAsync @@ -46,12 +45,11 @@ public async Task When_archiving_with_both_sync_and_async_outbox_should_prefer_a await timedArchiver.StopAsync(cts.Token); //Assert - Assert.True(archiver.HasAsyncOutbox(), "Should have an async outbox"); - Assert.True(archiver.HasOutbox(), "Should have a sync outbox"); - Assert.Equal(0, outbox.EntryCount); - Assert.Contains( - new KeyValuePair(message.Id, message), + await Assert.That(archiver.HasAsyncOutbox()).IsTrue().Because("Should have an async outbox"); + await Assert.That(archiver.HasOutbox()).IsTrue().Because("Should have a sync outbox"); + await Assert.That(outbox.EntryCount).IsZero(); + await Assert.That( archiveProvider.ArchivedMessages - ); + ).Contains(new KeyValuePair(message.Id, message)); } } diff --git a/tests/Paramore.Brighter.Core.Tests/Archiving/When_archiving_with_no_outbox_configured_should_log_warning.cs b/tests/Paramore.Brighter.Core.Tests/Archiving/When_archiving_with_no_outbox_configured_should_log_warning.cs index 7afb1eac0f..da95b43592 100644 --- a/tests/Paramore.Brighter.Core.Tests/Archiving/When_archiving_with_no_outbox_configured_should_log_warning.cs +++ b/tests/Paramore.Brighter.Core.Tests/Archiving/When_archiving_with_no_outbox_configured_should_log_warning.cs @@ -4,13 +4,12 @@ using System.Transactions; using Paramore.Brighter.Core.Tests.Archiving.TestDoubles; using Paramore.Brighter.Outbox.Hosting; -using Xunit; namespace Paramore.Brighter.Core.Tests.Archiving; public class TimedOutboxArchiverNoOutboxTests { - [Fact] + [Test] public async Task When_archiving_with_no_outbox_configured_should_not_throw() { //Arrange — NullOutbox implements only IAmAnOutbox (neither sync nor async) @@ -32,8 +31,8 @@ public async Task When_archiving_with_no_outbox_configured_should_not_throw() await timedArchiver.StopAsync(cts.Token); //Assert - Assert.False(archiver.HasAsyncOutbox(), "Should not have an async outbox"); - Assert.False(archiver.HasOutbox(), "Should not have a sync outbox"); - Assert.Empty(archiveProvider.ArchivedMessages); + await Assert.That(archiver.HasAsyncOutbox()).IsFalse().Because("Should not have an async outbox"); + await Assert.That(archiver.HasOutbox()).IsFalse().Because("Should not have a sync outbox"); + await Assert.That(archiveProvider.ArchivedMessages).IsEmpty(); } } diff --git a/tests/Paramore.Brighter.Core.Tests/Archiving/When_archiving_with_sync_only_outbox_should_call_sync_archive.cs b/tests/Paramore.Brighter.Core.Tests/Archiving/When_archiving_with_sync_only_outbox_should_call_sync_archive.cs index c1ee06ceb4..86d6c6d002 100644 --- a/tests/Paramore.Brighter.Core.Tests/Archiving/When_archiving_with_sync_only_outbox_should_call_sync_archive.cs +++ b/tests/Paramore.Brighter.Core.Tests/Archiving/When_archiving_with_sync_only_outbox_should_call_sync_archive.cs @@ -7,13 +7,12 @@ using Paramore.Brighter.Core.Tests.Archiving.TestDoubles; using Paramore.Brighter.Observability; using Paramore.Brighter.Outbox.Hosting; -using Xunit; namespace Paramore.Brighter.Core.Tests.Archiving; public class TimedOutboxArchiverSyncFallbackTests { - [Fact] + [Test] public async Task When_archiving_with_sync_only_outbox_should_call_sync_archive() { //Arrange @@ -48,12 +47,11 @@ public async Task When_archiving_with_sync_only_outbox_should_call_sync_archive( await timedArchiver.StopAsync(cts.Token); //Assert - Assert.True(archiver.HasOutbox(), "Should have a sync outbox"); - Assert.False(archiver.HasAsyncOutbox(), "Should not have an async outbox"); - Assert.Equal(0, innerOutbox.EntryCount); - Assert.Contains( - new KeyValuePair(message.Id, message), + await Assert.That(archiver.HasOutbox()).IsTrue().Because("Should have a sync outbox"); + await Assert.That(archiver.HasAsyncOutbox()).IsFalse().Because("Should not have an async outbox"); + await Assert.That(innerOutbox.EntryCount).IsZero(); + await Assert.That( archiveProvider.ArchivedMessages - ); + ).Contains(new KeyValuePair(message.Id, message)); } } diff --git a/tests/Paramore.Brighter.Core.Tests/CircuitBreaker/When_Cooldown_On_TrippedTopic.cs b/tests/Paramore.Brighter.Core.Tests/CircuitBreaker/When_Cooldown_On_TrippedTopic.cs index 6c09bb1aad..745d26e70c 100644 --- a/tests/Paramore.Brighter.Core.Tests/CircuitBreaker/When_Cooldown_On_TrippedTopic.cs +++ b/tests/Paramore.Brighter.Core.Tests/CircuitBreaker/When_Cooldown_On_TrippedTopic.cs @@ -1,40 +1,33 @@ -using Paramore.Brighter.CircuitBreaker; -using Xunit; +using Paramore.Brighter.CircuitBreaker; namespace Paramore.Brighter.Core.Tests.CircuitBreaker { public class CircuitBreakerTests { - [Fact] - public void When_TripTopic_Then_TrippedTopics_Must_Contain_Topic() + [Test] + public async Task When_TripTopic_Then_TrippedTopics_Must_Contain_Topic() { // Arrange var trippedTopic = new RoutingKey("topic"); - var circuitBreaker = new InMemoryOutboxCircuitBreaker( - new OutboxCircuitBreakerOptions() { CooldownCount = 1 }); - + var circuitBreaker = new InMemoryOutboxCircuitBreaker(new OutboxCircuitBreakerOptions() { CooldownCount = 1 }); // Act circuitBreaker.TripTopic(trippedTopic); - // Assert - Assert.Contains(trippedTopic, circuitBreaker.TrippedTopics); + await Assert.That(circuitBreaker.TrippedTopics).Contains(trippedTopic); } - [Fact] - public void When_Cooldown_Decrements_CooldownCount_Then_TrippedTopicRemoved() + [Test] + public async Task When_Cooldown_Decrements_CooldownCount_Then_TrippedTopicRemoved() { // Arrange var trippedTopic = new RoutingKey("topic"); - var circuitBreaker = new InMemoryOutboxCircuitBreaker( - new OutboxCircuitBreakerOptions() { CooldownCount = 1 }); + var circuitBreaker = new InMemoryOutboxCircuitBreaker(new OutboxCircuitBreakerOptions() { CooldownCount = 1 }); circuitBreaker.TripTopic(trippedTopic); - // Act circuitBreaker.CoolDown(); circuitBreaker.CoolDown(); - // Assert - Assert.Empty(circuitBreaker.TrippedTopics); + await Assert.That(circuitBreaker.TrippedTopics).IsEmpty(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_creating_luggagestore_missing_parameters.cs b/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_creating_luggagestore_missing_parameters.cs index c25bc40b96..bc249065ef 100644 --- a/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_creating_luggagestore_missing_parameters.cs +++ b/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_creating_luggagestore_missing_parameters.cs @@ -1,21 +1,18 @@ -using System; +using System; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Transforms.Storage; -using Xunit; namespace Paramore.Brighter.Core.Tests.Claims.FileSystem; - public class LuggageUploadMissingParametersTests { - [Theory] - [InlineData("")] - [InlineData(null)] - public void When_creating_luggagestore_missing_pathName(string? bucketName) + [Test] + [Arguments("")] + [Arguments(null)] + public async Task When_creating_luggagestore_missing_pathName(string? bucketName) { //arrange var exception = Catch.Exception(() => new FileSystemStorageProvider(new FileSystemOptions(bucketName!))); - - Assert.NotNull(exception); - Assert.True(exception is ArgumentException); + await Assert.That(exception).IsNotNull(); + await Assert.That(exception is ArgumentException).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_unwrapping_a_large_message.cs b/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_unwrapping_a_large_message.cs index d4aeeb5ade..ba1993abf6 100644 --- a/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_unwrapping_a_large_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_unwrapping_a_large_message.cs @@ -1,88 +1,65 @@ -using System; +using System; using System.IO; using System.Text.Json; using Paramore.Brighter.Core.Tests.Claims.Test_Doubles; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Transforms.Storage; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Claims.FileSystem; - -public class LargeMessagePayloadUnwrapTests : IDisposable +public class LargeMessagePayloadUnwrapTests { private readonly TransformPipelineBuilder _pipelineBuilder; private readonly string _bucketName; private readonly FileSystemStorageProvider _luggageStore; - public LargeMessagePayloadUnwrapTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyLargeCommandMessageMapper()), - null - ); - + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyLargeCommandMessageMapper()), null); mapperRegistry.Register(); - _bucketName = $"brightertestbucket-{Guid.NewGuid()}"; _luggageStore = new FileSystemStorageProvider(new FileSystemOptions($"./{_bucketName}")); - _luggageStore.EnsureStoreExists(); - - var messageTransformerFactory = - new SimpleMessageTransformerFactory(_ => new ClaimCheckTransformer(_luggageStore, _luggageStore)); - + var messageTransformerFactory = new SimpleMessageTransformerFactory(_ => new ClaimCheckTransformer(_luggageStore, _luggageStore)); _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, messageTransformerFactory); } - [Fact] - public void When_unwrapping_a_large_message() + [Test] + public async Task When_unwrapping_a_large_message() { //arrange - //store our luggage and get the claim check var contents = DataGenerator.CreateString(6000); - var myCommand = new MyLargeCommand(1) { Value = contents }; - var commandAsJson = - JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)); - + var myCommand = new MyLargeCommand(1) + { + Value = contents + }; + var commandAsJson = JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)); using var stream = new MemoryStream(); using var writer = new StreamWriter(stream); - writer.Write(commandAsJson); - writer.Flush(); + await writer.WriteAsync(commandAsJson); + await writer.FlushAsync(); stream.Position = 0; - var id = _luggageStore.Store(stream); - + var id = await _luggageStore.StoreAsync(stream); //pretend we ran through the claim check myCommand.Value = $"Claim Check {id}"; - //set the headers, so that we have a claim check listed - var message = new Message( - new MessageHeader(myCommand.Id, new RoutingKey("MyLargeCommand"), MessageType.MT_COMMAND, - timeStamp: DateTime.UtcNow), - new MessageBody(JsonSerializer.Serialize(myCommand, - new JsonSerializerOptions(JsonSerializerDefaults.General))) - ); - + var message = new Message(new MessageHeader(myCommand.Id, new RoutingKey("MyLargeCommand"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)))); message.Header.DataRef = id; message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK] = id; - //act var transformPipeline = _pipelineBuilder.BuildUnwrapPipeline(); var transformedMessage = transformPipeline.Unwrap(message, new RequestContext()); - //assert //contents should be from storage - Assert.Equal(contents, transformedMessage.Value); - Assert.False(_luggageStore.HasClaim(id)); + await Assert.That(transformedMessage.Value).IsEqualTo(contents); + await Assert.That(await _luggageStore.HasClaimAsync(id)).IsFalse(); } + [After(Test)] public void Dispose() { //The bucket should be empty, allowing us to delete it Directory.Delete($"./{_bucketName}", true); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_unwrapping_a_large_message_async.cs b/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_unwrapping_a_large_message_async.cs index 92fe7fcdf5..9077fa8202 100644 --- a/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_unwrapping_a_large_message_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_unwrapping_a_large_message_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Text.Json; using System.Threading.Tasks; @@ -7,84 +7,61 @@ using Paramore.Brighter.Observability; using Paramore.Brighter.Transforms.Storage; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Claims.FileSystem; - -public class LargeMessagePayloadAsyncUnwrapTests : IDisposable +public class LargeMessagePayloadAsyncUnwrapTests { private readonly TransformPipelineBuilderAsync _pipelineBuilder; private readonly string _bucketName; private readonly FileSystemStorageProvider _luggageStore; - public LargeMessagePayloadAsyncUnwrapTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyLargeCommandMessageMapperAsync()) - ); - + var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyLargeCommandMessageMapperAsync())); mapperRegistry.RegisterAsync(); - _bucketName = $"brightertestbucket-{Guid.NewGuid()}"; _luggageStore = new FileSystemStorageProvider(new FileSystemOptions($"./{_bucketName}")); - _luggageStore.EnsureStoreExists(); - - var messageTransformerFactory = - new SimpleMessageTransformerFactoryAsync(_ => new ClaimCheckTransformer(_luggageStore, _luggageStore)); - + var messageTransformerFactory = new SimpleMessageTransformerFactoryAsync(_ => new ClaimCheckTransformer(_luggageStore, _luggageStore)); _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.All); } - [Fact] + [Test] public async Task When_unwrapping_a_large_message_async() { //arrange - //store our luggage and get the claim check var contents = DataGenerator.CreateString(6000); - var myCommand = new MyLargeCommand(1) { Value = contents }; - var commandAsJson = - JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)); - + var myCommand = new MyLargeCommand(1) + { + Value = contents + }; + var commandAsJson = JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)); using var stream = new MemoryStream(); using var writer = new StreamWriter(stream); await writer.WriteAsync(commandAsJson); await writer.FlushAsync(); stream.Position = 0; string id = await _luggageStore.StoreAsync(stream); - - //pretend we ran through the claim check - myCommand.Value = $"Claim Check {id}"; - + //pretend we ran through the claim check + myCommand.Value = $"Claim Check {id}"; //set the headers, so that we have a claim check listed - var message = new Message( - new MessageHeader(myCommand.Id, new RoutingKey("MyLargeCommand"), MessageType.MT_COMMAND, - timeStamp: DateTime.UtcNow), - new MessageBody(JsonSerializer.Serialize(myCommand, - new JsonSerializerOptions(JsonSerializerDefaults.General))) - ); - + var message = new Message(new MessageHeader(myCommand.Id, new RoutingKey("MyLargeCommand"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)))); message.Header.DataRef = id; message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK] = id; - //act var transformPipeline = _pipelineBuilder.BuildUnwrapPipeline(); var transformedMessage = await transformPipeline.UnwrapAsync(message, new RequestContext()); - //assert //contents should be from storage - Assert.Equal(contents, transformedMessage.Value); - Assert.False(await _luggageStore.HasClaimAsync(id)); + await Assert.That(transformedMessage.Value).IsEqualTo(contents); + await Assert.That(await _luggageStore.HasClaimAsync(id)).IsFalse(); } + [After(Test)] public void Dispose() { //The bucket should be empty, allowing us to delete it Directory.Delete($"./{_bucketName}", true); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_validating_a_luggage_store_exists.cs b/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_validating_a_luggage_store_exists.cs index 4df444aac0..5cc66562b0 100644 --- a/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_validating_a_luggage_store_exists.cs +++ b/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_validating_a_luggage_store_exists.cs @@ -1,50 +1,36 @@ -using System; +using System; using System.IO; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Transforms.Storage; -using Xunit; namespace Paramore.Brighter.Core.Tests.Claims.FileSystem; - -public class LuggageStoreExistsTests +public class LuggageStoreExistsTests { - [Fact] - public void When_checking_store_that_exists() + [Test] + public async Task When_checking_store_that_exists() { var pathName = $"brightertestbucket-{Guid.NewGuid()}"; - //arrange var luggageStore = new FileSystemStorageProvider(new FileSystemOptions($"./{pathName}")); - - luggageStore.EnsureStoreExists(); - + await luggageStore.EnsureStoreExistsAsync(); //act luggageStore = new FileSystemStorageProvider(new FileSystemOptions($"./{pathName}")); - - Assert.NotNull(luggageStore); - + await Assert.That(luggageStore).IsNotNull(); //teardown Directory.Delete($"./{pathName}"); } - - [Fact] - public void When_checking_store_that_does_not_exist_async() + + [Test] + public async Task When_checking_store_that_does_not_exist_async() { - var pathName = $"brightertestbucket-{Guid.NewGuid()}"; - //act - var doesNotExist = Catch.Exception(() => - { - var luggageStore = new FileSystemStorageProvider(new FileSystemOptions($"./{pathName}") - { - Strategy = StorageStrategy.Validate - }); - - luggageStore.EnsureStoreExists(); - }); - - Assert.NotNull(doesNotExist); - Assert.True(doesNotExist is InvalidOperationException); + var doesNotExist = Catch.Exception(() => + { + var luggageStore = new FileSystemStorageProvider(new FileSystemOptions($"./{pathName}") { Strategy = StorageStrategy.Validate }); + luggageStore.EnsureStoreExists(); + }); + await Assert.That(doesNotExist).IsNotNull(); + await Assert.That(doesNotExist is InvalidOperationException).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_validating_a_luggage_store_exists_async.cs b/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_validating_a_luggage_store_exists_async.cs index 60fb4717c6..a93b8f614d 100644 --- a/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_validating_a_luggage_store_exists_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_validating_a_luggage_store_exists_async.cs @@ -1,50 +1,37 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Transforms.Storage; -using Xunit; namespace Paramore.Brighter.Core.Tests.Claims.FileSystem; - -public class LuggageStoreExistsAsyncTests +public class LuggageStoreExistsAsyncTests { - [Fact] + [Test] public async Task When_checking_store_that_exists_async() { var pathName = $"brightertestbucket-{Guid.NewGuid()}"; - //arrange var luggageStore = new FileSystemStorageProvider(new FileSystemOptions($"./{pathName}")); - await luggageStore.EnsureStoreExistsAsync(); - //act luggageStore = new FileSystemStorageProvider(new FileSystemOptions($"./{pathName}")); - - Assert.NotNull(luggageStore); - + await Assert.That(luggageStore).IsNotNull(); //teardown Directory.Delete($"./{pathName}"); } - - [Fact] + + [Test] public async Task When_checking_store_that_does_not_exist_async() { - var pathName = $"brightertestbucket-{Guid.NewGuid()}"; - //act - var doesNotExist = await Catch.ExceptionAsync(async () => - { - var luggageStore = new FileSystemStorageProvider(new FileSystemOptions($"./{pathName}") - { - Strategy = StorageStrategy.Validate - }); - await luggageStore.EnsureStoreExistsAsync(); - }); - - Assert.NotNull(doesNotExist); - Assert.True(doesNotExist is InvalidOperationException); + var doesNotExist = await Catch.ExceptionAsync(async () => + { + var luggageStore = new FileSystemStorageProvider(new FileSystemOptions($"./{pathName}") { Strategy = StorageStrategy.Validate }); + await luggageStore.EnsureStoreExistsAsync(); + }); + await Assert.That(doesNotExist).IsNotNull(); + await Assert.That(doesNotExist is InvalidOperationException).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_wrapping_a_large_message.cs b/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_wrapping_a_large_message.cs index 0edbc3164b..8676603d39 100644 --- a/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_wrapping_a_large_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_wrapping_a_large_message.cs @@ -1,13 +1,11 @@ -using System; +using System; using System.IO; using Paramore.Brighter.Core.Tests.Claims.Test_Doubles; using Paramore.Brighter.Transforms.Storage; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Claims.FileSystem; - -public class LargeMessagePayloadWrapTests : IDisposable +public class LargeMessagePayloadWrapTests { private string? _id; private WrapPipeline? _transformPipeline; @@ -16,50 +14,39 @@ public class LargeMessagePayloadWrapTests : IDisposable private readonly FileSystemStorageProvider _luggageStore; private readonly string _bucketName; private readonly Publication _publication; - public LargeMessagePayloadWrapTests() { //arrange - TransformPipelineBuilderAsync.ClearPipelineCache(); - - var mapperRegistry = - new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyLargeCommandMessageMapper()), - null - ); - + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyLargeCommandMessageMapper()), null); mapperRegistry.Register(); - _myCommand = new MyLargeCommand(6000); - _bucketName = $"brightertestbucket-{Guid.NewGuid()}"; _luggageStore = new FileSystemStorageProvider(new FileSystemOptions($"./{_bucketName}")); - _luggageStore.EnsureStoreExists(); - var transformerFactoryAsync = new SimpleMessageTransformerFactory(_ => new ClaimCheckTransformer(_luggageStore, _luggageStore)); - - _publication = new Publication { Topic = new RoutingKey("MyLargeCommand"), RequestType = typeof(MyLargeCommand) }; - + _publication = new Publication + { + Topic = new RoutingKey("MyLargeCommand"), + RequestType = typeof(MyLargeCommand) + }; _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, transformerFactoryAsync); } - [Fact] - public void When_wrapping_a_large_message() + [Test] + public async Task When_wrapping_a_large_message() { //act _transformPipeline = _pipelineBuilder.BuildWrapPipeline(); var message = _transformPipeline.Wrap(_myCommand, new RequestContext(), _publication); - //assert - Assert.True(message.Header.Bag.ContainsKey(ClaimCheckTransformer.CLAIM_CHECK)); - Assert.NotNull(message.Header.DataRef); + await Assert.That(message.Header.Bag.ContainsKey(ClaimCheckTransformer.CLAIM_CHECK)).IsTrue(); + await Assert.That(message.Header.DataRef).IsNotNull(); _id = (string)message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK]; - Assert.Equal($"Claim Check {_id}", message.Body.Value); - - Assert.True(_luggageStore.HasClaim(_id)); + await Assert.That(message.Body.Value).IsEqualTo($"Claim Check {_id}"); + await Assert.That(await _luggageStore.HasClaimAsync(_id)).IsTrue(); } + [After(Test)] public void Dispose() { //We have to empty objects from a bucket before deleting it @@ -67,7 +54,7 @@ public void Dispose() { _luggageStore.Delete(_id); } - + Directory.Delete($"./{_bucketName}"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_wrapping_a_large_message_async.cs b/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_wrapping_a_large_message_async.cs index f17ee96eae..213676c322 100644 --- a/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_wrapping_a_large_message_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Claims/FileSystem/When_wrapping_a_large_message_async.cs @@ -1,15 +1,13 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.Claims.Test_Doubles; using Paramore.Brighter.Observability; using Paramore.Brighter.Transforms.Storage; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Claims.FileSystem; - -public class LargeMessagePayloadAsyncWrapTests : IAsyncDisposable +public class LargeMessagePayloadAsyncWrapTests { private string? _id; private WrapPipelineAsync? _transformPipeline; @@ -18,57 +16,47 @@ public class LargeMessagePayloadAsyncWrapTests : IAsyncDisposable private readonly FileSystemStorageProvider _luggageStore; private readonly string _bucketName; private readonly Publication _publication; - public LargeMessagePayloadAsyncWrapTests() { //arrange - TransformPipelineBuilderAsync.ClearPipelineCache(); - - var mapperRegistry = - new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync( - _ => new MyLargeCommandMessageMapperAsync()) - ); - + var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyLargeCommandMessageMapperAsync())); mapperRegistry.RegisterAsync(); - _myCommand = new MyLargeCommand(6000); - _bucketName = $"brightertestbucket-{Guid.NewGuid()}"; _luggageStore = new FileSystemStorageProvider(new FileSystemOptions($"./{_bucketName}")); - _luggageStore.EnsureStoreExists(); - var transformerFactoryAsync = new SimpleMessageTransformerFactoryAsync(_ => new ClaimCheckTransformer(_luggageStore, _luggageStore)); - - _publication = new Publication { Topic = new RoutingKey("MyLargeCommand"), RequestType = typeof(MyLargeCommand) }; - + _publication = new Publication + { + Topic = new RoutingKey("MyLargeCommand"), + RequestType = typeof(MyLargeCommand) + }; _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, transformerFactoryAsync, InstrumentationOptions.All); } - [Fact] + [Test] public async Task When_wrapping_a_large_message_async() { //act _transformPipeline = _pipelineBuilder.BuildWrapPipeline(); var message = await _transformPipeline.WrapAsync(_myCommand, new RequestContext(), _publication); - //assert - Assert.True(message.Header.Bag.ContainsKey(ClaimCheckTransformer.CLAIM_CHECK)); - Assert.NotNull(message.Header.DataRef); + await Assert.That(message.Header.Bag.ContainsKey(ClaimCheckTransformer.CLAIM_CHECK)).IsTrue(); + await Assert.That(message.Header.DataRef).IsNotNull(); _id = (string)message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK]; - Assert.Equal($"Claim Check {_id}", message.Body.Value); - - Assert.True(await _luggageStore.HasClaimAsync(_id)); + await Assert.That(message.Body.Value).IsEqualTo($"Claim Check {_id}"); + await Assert.That(await _luggageStore.HasClaimAsync(_id)).IsTrue(); } - public async ValueTask DisposeAsync() + [After(Test)] + public async Task DisposeAsync() { - //We have to empty objects from a bucket before deleting it + //We have to empty objects from a bucket before deleting it if (_id != null) { await _luggageStore.DeleteAsync(_id); } - + Directory.Delete($"./{_bucketName}"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_is_under_the_threshold.cs b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_is_under_the_threshold.cs index 68fa6895b1..ec22c891f6 100644 --- a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_is_under_the_threshold.cs +++ b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_is_under_the_threshold.cs @@ -1,41 +1,33 @@ -using System; +using System; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Transforms.Storage; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Claims.InMemory; - public class ClaimCheckSmallPayloadTests { private readonly ClaimCheckTransformer _transformer; private readonly Message _message; private readonly RoutingKey _topic = new("test_topic"); - public ClaimCheckSmallPayloadTests() { //arrange InMemoryStorageProvider store = new(); _transformer = new ClaimCheckTransformer(store, store); - //set the threshold to 5K _transformer.InitializeWrapFromAttributeParams(5); - //but create a string that is just under 5K long - assuming string is 26 + length *2 to allow for 64-bit platform string body = DataGenerator.CreateString(2485); - _message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _topic, MessageType.MT_EVENT, timeStamp: DateTime.UtcNow), - new MessageBody(body)); + _message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _topic, MessageType.MT_EVENT, timeStamp: DateTime.UtcNow), new MessageBody(body)); } - [Fact] - public void When_a_message_is_under_the_threshold() + [Test] + public async Task When_a_message_is_under_the_threshold() { - var luggageCheckedMessage = _transformer.Wrap(_message, new Publication{Topic = new RoutingKey(_topic)}); - + var luggageCheckedMessage = await _transformer.WrapAsync(_message, new Publication { Topic = new RoutingKey(_topic) }); //assert bool hasLuggage = luggageCheckedMessage.Header.Bag.TryGetValue(ClaimCheckTransformer.CLAIM_CHECK, out object _); - Assert.False(hasLuggage); - Assert.Null(luggageCheckedMessage.Header.DataRef); + await Assert.That(hasLuggage).IsFalse(); + await Assert.That(luggageCheckedMessage.Header.DataRef).IsNull(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_is_under_the_threshold_async.cs b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_is_under_the_threshold_async.cs index 4166fde306..86fc335b7d 100644 --- a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_is_under_the_threshold_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_is_under_the_threshold_async.cs @@ -1,42 +1,33 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Transforms.Storage; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Claims.InMemory; - public class AsyncClaimCheckSmallPayloadTests { private readonly ClaimCheckTransformer _transformerAsync; private readonly Message _message; private readonly RoutingKey _topic = new("test_topic"); - public AsyncClaimCheckSmallPayloadTests() { //arrange InMemoryStorageProvider store = new(); _transformerAsync = new ClaimCheckTransformer(store, store); - //set the threshold to 5K _transformerAsync.InitializeWrapFromAttributeParams(5); - //but create a string that is just under 5K long - assuming string is 26 + length *2 to allow for 64-bit platform string body = DataGenerator.CreateString(2485); - _message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _topic, MessageType.MT_EVENT, timeStamp: DateTime.UtcNow), - new MessageBody(body)); + _message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _topic, MessageType.MT_EVENT, timeStamp: DateTime.UtcNow), new MessageBody(body)); } - [Fact] + [Test] public async Task When_a_message_is_under_the_threshold() { - var luggageCheckedMessage = await _transformerAsync.WrapAsync(_message, new Publication{Topic = new RoutingKey(_topic)}); - + var luggageCheckedMessage = await _transformerAsync.WrapAsync(_message, new Publication { Topic = new RoutingKey(_topic) }); //assert bool hasLuggage = luggageCheckedMessage.Header.Bag.TryGetValue(ClaimCheckTransformer.CLAIM_CHECK, out object _); - - Assert.False(hasLuggage); + await Assert.That(hasLuggage).IsFalse(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_unwraps_a_large_payload.cs b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_unwraps_a_large_payload.cs index 104a23ce26..9c571eb04a 100644 --- a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_unwraps_a_large_payload.cs +++ b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_unwraps_a_large_payload.cs @@ -1,18 +1,15 @@ -using System; +using System; using System.IO; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Transforms.Storage; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Claims.InMemory; - public class RetrieveClaimLargePayloadTests { private readonly InMemoryStorageProvider _store; private readonly ClaimCheckTransformer _transformerAsync; private readonly string _contents; - public RetrieveClaimLargePayloadTests() { _store = new InMemoryStorageProvider(); @@ -22,32 +19,25 @@ public RetrieveClaimLargePayloadTests() _contents = DataGenerator.CreateString(6000); } - [Fact] - public void When_a_message_unwraps_a_large_payload() + [Test] + public async Task When_a_message_unwraps_a_large_payload() { //arrange var stream = new MemoryStream(); var writer = new StreamWriter(stream); - writer.Write(_contents); - writer.Flush(); + await writer.WriteAsync(_contents); + await writer.FlushAsync(); stream.Position = 0; - - var id = _store.Store(stream); - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey("test_topic"), MessageType.MT_EVENT, timeStamp: DateTime.UtcNow), - new MessageBody($"Claim Check {id}")); + var id = await _store.StoreAsync(stream); + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey("test_topic"), MessageType.MT_EVENT, timeStamp: DateTime.UtcNow), new MessageBody($"Claim Check {id}")); message.Header.DataRef = id; - //act - var unwrappedMessage = _transformerAsync.Unwrap(message); - + var unwrappedMessage = await _transformerAsync.UnwrapAsync(message); //assert - Assert.Equal(_contents, unwrappedMessage.Body.Value); - + await Assert.That(unwrappedMessage.Body.Value).IsEqualTo(_contents); //clean up - Assert.Null(message.Header.DataRef); - Assert.False(message.Header.Bag.TryGetValue(ClaimCheckTransformer.CLAIM_CHECK, out object _)); - Assert.False(_store.HasClaim(id)); + await Assert.That(message.Header.DataRef).IsNull(); + await Assert.That(message.Header.Bag.TryGetValue(ClaimCheckTransformer.CLAIM_CHECK, out object _)).IsFalse(); + await Assert.That(await _store.HasClaimAsync(id)).IsFalse(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_unwraps_a_large_payload_async.cs b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_unwraps_a_large_payload_async.cs index 58326cc034..a77c8684cb 100644 --- a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_unwraps_a_large_payload_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_unwraps_a_large_payload_async.cs @@ -1,19 +1,16 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Transforms.Storage; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Claims.InMemory; - public class AsyncRetrieveClaimLargePayloadTests { private readonly InMemoryStorageProvider _store; private readonly ClaimCheckTransformer _transformerAsync; private readonly string _contents; - public AsyncRetrieveClaimLargePayloadTests() { _store = new InMemoryStorageProvider(); @@ -23,7 +20,7 @@ public AsyncRetrieveClaimLargePayloadTests() _contents = DataGenerator.CreateString(6000); } - [Fact] + [Test] public async Task When_a_message_unwraps_a_large_payload() { //arrange @@ -32,24 +29,17 @@ public async Task When_a_message_unwraps_a_large_payload() await writer.WriteAsync(_contents); await writer.FlushAsync(); stream.Position = 0; - var id = await _store.StoreAsync(stream); - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey("test_topic"), MessageType.MT_EVENT, timeStamp: DateTime.UtcNow), - new MessageBody("Claim Check {id}")); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey("test_topic"), MessageType.MT_EVENT, timeStamp: DateTime.UtcNow), new MessageBody("Claim Check {id}")); message.Header.DataRef = id; message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK] = id; - //act var unwrappedMessage = await _transformerAsync.UnwrapAsync(message); - //assert - Assert.Equal(_contents, unwrappedMessage.Body.Value); + await Assert.That(unwrappedMessage.Body.Value).IsEqualTo(_contents); //clean up - Assert.Null(message.Header.DataRef); - Assert.False(message.Header.Bag.TryGetValue(ClaimCheckTransformer.CLAIM_CHECK, out object _)); - Assert.False(await _store.HasClaimAsync(id)); + await Assert.That(message.Header.DataRef).IsNull(); + await Assert.That(message.Header.Bag.TryGetValue(ClaimCheckTransformer.CLAIM_CHECK, out object _)).IsFalse(); + await Assert.That(await _store.HasClaimAsync(id)).IsFalse(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_wraps_a_large_payload.cs b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_wraps_a_large_payload.cs index 433ce5d62e..058092f714 100644 --- a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_wraps_a_large_payload.cs +++ b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_wraps_a_large_payload.cs @@ -1,12 +1,10 @@ -using System; +using System; using System.IO; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Transforms.Storage; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Claims.InMemory; - public class ClaimCheckLargePayloadTests { private readonly ClaimCheckTransformer _transformer; @@ -14,36 +12,26 @@ public class ClaimCheckLargePayloadTests private readonly string _body; private readonly InMemoryStorageProvider _store; private readonly RoutingKey _topic = new("test_topic"); - public ClaimCheckLargePayloadTests() { //arrange _store = new InMemoryStorageProvider(); _transformer = new ClaimCheckTransformer(_store, new InMemoryStorageProvider()); _transformer.InitializeWrapFromAttributeParams(5); - _body = DataGenerator.CreateString(6000); - _message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _topic, MessageType.MT_EVENT, timeStamp: DateTime.UtcNow), - new MessageBody(_body)); - + _message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _topic, MessageType.MT_EVENT, timeStamp: DateTime.UtcNow), new MessageBody(_body)); } - [Fact] - public void When_a_message_wraps_a_large_payload() + [Test] + public async Task When_a_message_wraps_a_large_payload() { //act - var luggageCheckedMessage = _transformer.Wrap(_message, new Publication{Topic = new RoutingKey(_topic)}); - + var luggageCheckedMessage = await _transformer.WrapAsync(_message, new Publication { Topic = new RoutingKey(_topic) }); //assert bool hasLuggage = !string.IsNullOrEmpty(luggageCheckedMessage.Header.DataRef); - - Assert.True(hasLuggage); - + await Assert.That(hasLuggage).IsTrue(); var claimCheck = luggageCheckedMessage.Header.DataRef; - - var luggage = new StreamReader(_store.Retrieve(claimCheck)).ReadToEnd(); - - Assert.Equal(_body, luggage); + var luggage = await new StreamReader(await _store.RetrieveAsync(claimCheck)).ReadToEndAsync(); + await Assert.That(luggage).IsEqualTo(_body); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_wraps_a_large_payload_async.cs b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_wraps_a_large_payload_async.cs index 5ac942dd7d..d5bfb79146 100644 --- a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_wraps_a_large_payload_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_a_message_wraps_a_large_payload_async.cs @@ -1,13 +1,11 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Transforms.Storage; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Claims.InMemory; - public class AsyncClaimCheckLargePayloadTests { private readonly ClaimCheckTransformer _transformerAsync; @@ -15,36 +13,27 @@ public class AsyncClaimCheckLargePayloadTests private readonly string _body; private readonly InMemoryStorageProvider _store; private readonly RoutingKey _topic = new("test_topic"); - public AsyncClaimCheckLargePayloadTests() { //arrange _store = new InMemoryStorageProvider(); _transformerAsync = new ClaimCheckTransformer(_store, _store); _transformerAsync.InitializeWrapFromAttributeParams(5); - _body = DataGenerator.CreateString(6000); - _message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _topic, MessageType.MT_EVENT, timeStamp: DateTime.UtcNow), - new MessageBody(_body)); + _message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _topic, MessageType.MT_EVENT, timeStamp: DateTime.UtcNow), new MessageBody(_body)); } - [Fact] + [Test] public async Task When_a_message_wraps_a_large_payload() { //act - var luggageCheckedMessage = await _transformerAsync.WrapAsync(_message, new Publication{Topic = new RoutingKey(_topic)}); - + var luggageCheckedMessage = await _transformerAsync.WrapAsync(_message, new Publication { Topic = new RoutingKey(_topic) }); //assert bool hasLuggage = luggageCheckedMessage.Header.Bag.TryGetValue(ClaimCheckTransformer.CLAIM_CHECK, out var storedData); - - Assert.True(hasLuggage); - Assert.Equal(luggageCheckedMessage.Header.DataRef, storedData); - + await Assert.That(hasLuggage).IsTrue(); + await Assert.That(storedData).IsEqualTo(luggageCheckedMessage.Header.DataRef); var claimCheck = (string)storedData!; - var luggage = await new StreamReader(await _store.RetrieveAsync(claimCheck)).ReadToEndAsync(); - - Assert.Equal(_body, luggage); + await Assert.That(luggage).IsEqualTo(_body); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_luggage_should_be_kept_in_the_store.cs b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_luggage_should_be_kept_in_the_store.cs index ee736a5502..6245764a23 100644 --- a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_luggage_should_be_kept_in_the_store.cs +++ b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_luggage_should_be_kept_in_the_store.cs @@ -1,29 +1,25 @@ -using System; +using System; using System.IO; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Transforms.Storage; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Claims.InMemory; - public class RetrieveClaimLeaveLuggage { private readonly InMemoryStorageProvider _store; private readonly ClaimCheckTransformer _transformer; private readonly string _contents; - public RetrieveClaimLeaveLuggage() { _store = new InMemoryStorageProvider(); _transformer = new ClaimCheckTransformer(_store, _store); _transformer.InitializeUnwrapFromAttributeParams(true); - _contents = DataGenerator.CreateString(6000); } - [Fact] - public void When_luggage_should_be_kept_in_the_store() + [Test] + public async Task When_luggage_should_be_kept_in_the_store() { //arrange var stream = new MemoryStream(); @@ -31,21 +27,15 @@ public void When_luggage_should_be_kept_in_the_store() writer.WriteAsync(_contents); writer.FlushAsync(); stream.Position = 0; - - var id = _store.Store(stream); - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), new("test_topic"), MessageType.MT_EVENT, timeStamp: DateTime.UtcNow), - new MessageBody($"Claim Check {id}")); + var id = await _store.StoreAsync(stream); + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), new("test_topic"), MessageType.MT_EVENT, timeStamp: DateTime.UtcNow), new MessageBody($"Claim Check {id}")); message.Header.DataRef = id; message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK] = id; - //act - _ = _transformer.Unwrap(message); - + _ = await _transformer.UnwrapAsync(message); //assert bool hasLuggage = message.Header.Bag.TryGetValue(ClaimCheckTransformer.CLAIM_CHECK, out object _); - Assert.True(hasLuggage); - Assert.True(_store.HasClaim(id)); + await Assert.That(hasLuggage).IsTrue(); + await Assert.That(await _store.HasClaimAsync(id)).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_luggage_should_be_kept_in_the_store_async.cs b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_luggage_should_be_kept_in_the_store_async.cs index 202969244c..43cc909d97 100644 --- a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_luggage_should_be_kept_in_the_store_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_luggage_should_be_kept_in_the_store_async.cs @@ -1,29 +1,25 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Transforms.Storage; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Claims.InMemory; - public class AsyncRetrieveClaimLeaveLuggage { private readonly InMemoryStorageProvider _store; private readonly ClaimCheckTransformer _transformerAsync; private readonly string _contents; - public AsyncRetrieveClaimLeaveLuggage() { _store = new InMemoryStorageProvider(); _transformerAsync = new ClaimCheckTransformer(_store, _store); _transformerAsync.InitializeUnwrapFromAttributeParams(true); - _contents = DataGenerator.CreateString(6000); } - [Fact] + [Test] public async Task When_luggage_should_be_kept_in_the_store() { //arrange @@ -32,21 +28,15 @@ public async Task When_luggage_should_be_kept_in_the_store() await writer.WriteAsync(_contents); await writer.FlushAsync(); stream.Position = 0; - var id = await _store.StoreAsync(stream); - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), new("test_topic"), MessageType.MT_EVENT, timeStamp: DateTime.UtcNow), - new MessageBody("Claim Check {id}")); + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), new("test_topic"), MessageType.MT_EVENT, timeStamp: DateTime.UtcNow), new MessageBody("Claim Check {id}")); message.Header.DataRef = id; message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK] = id; - //act var unwrappedMessage = await _transformerAsync.UnwrapAsync(message); - //assert bool hasLuggage = message.Header.Bag.TryGetValue(ClaimCheckTransformer.CLAIM_CHECK, out object _); - Assert.True(hasLuggage); - Assert.True(await _store.HasClaimAsync(id)); + await Assert.That(hasLuggage).IsTrue(); + await Assert.That(await _store.HasClaimAsync(id)).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_unwrapping_a_large_message.cs b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_unwrapping_a_large_message.cs index 953699d2e3..5c010547d2 100644 --- a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_unwrapping_a_large_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_unwrapping_a_large_message.cs @@ -1,69 +1,54 @@ -using System; +using System; using System.IO; using System.Text.Json; using Paramore.Brighter.Core.Tests.Claims.Test_Doubles; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Transforms.Storage; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Claims.InMemory; - public class LargeMessagePaylodUnwrapTests { private readonly TransformPipelineBuilder _pipelineBuilder; private readonly InMemoryStorageProvider _inMemoryStorageProvider; - public LargeMessagePaylodUnwrapTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyLargeCommandMessageMapper()), - null); + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyLargeCommandMessageMapper()), null); mapperRegistry.Register(); - _inMemoryStorageProvider = new InMemoryStorageProvider(); var messageTransformerFactory = new SimpleMessageTransformerFactory(_ => new ClaimCheckTransformer(_inMemoryStorageProvider, _inMemoryStorageProvider)); - _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, messageTransformerFactory); } - [Fact] - public void When_unwrapping_a_large_message() + [Test] + public async Task When_unwrapping_a_large_message() { //arrange //store our luggage and get the claim check var contents = DataGenerator.CreateString(6000); - var myCommand = new MyLargeCommand(1) { Value = contents }; + var myCommand = new MyLargeCommand(1) + { + Value = contents + }; var commandAsJson = JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)); - var stream = new MemoryStream(); var writer = new StreamWriter(stream); - writer.Write(commandAsJson); - writer.Flush(); + await writer.WriteAsync(commandAsJson); + await writer.FlushAsync(); stream.Position = 0; - var id = _inMemoryStorageProvider.Store(stream); - + var id = await _inMemoryStorageProvider.StoreAsync(stream); //pretend we ran through the claim check myCommand.Value = $"Claim Check {id}"; - //set the headers, so that we have a claim check listed - var message = new Message( - new MessageHeader(myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), - new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General))) - ); - + var message = new Message(new MessageHeader(myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)))); message.Header.DataRef = id; - //act var transformPipeline = _pipelineBuilder.BuildUnwrapPipeline(); var transformedMessage = transformPipeline.Unwrap(message, new RequestContext()); - //assert //contents should be from storage - Assert.Equal(contents, transformedMessage.Value); - Assert.False(_inMemoryStorageProvider.HasClaim(id)); + await Assert.That(transformedMessage.Value).IsEqualTo(contents); + await Assert.That(await _inMemoryStorageProvider.HasClaimAsync(id)).IsFalse(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_unwrapping_a_large_message_async.cs b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_unwrapping_a_large_message_async.cs index 50eac06b41..ce14263588 100644 --- a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_unwrapping_a_large_message_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_unwrapping_a_large_message_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Text.Json; using System.Threading.Tasks; @@ -7,67 +7,51 @@ using Paramore.Brighter.Observability; using Paramore.Brighter.Transforms.Storage; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Claims.InMemory; - public class AsyncLargeMessagePaylodUnwrapTests { private readonly TransformPipelineBuilderAsync _pipelineBuilder; private readonly InMemoryStorageProvider _inMemoryStorageProviderAsync; - public AsyncLargeMessagePaylodUnwrapTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyLargeCommandMessageMapperAsync()) - ); + var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyLargeCommandMessageMapperAsync())); mapperRegistry.RegisterAsync(); - _inMemoryStorageProviderAsync = new InMemoryStorageProvider(); var messageTransformerFactory = new SimpleMessageTransformerFactoryAsync(_ => new ClaimCheckTransformer(_inMemoryStorageProviderAsync, _inMemoryStorageProviderAsync)); - _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.All); } - [Fact] + [Test] public async Task When_unwrapping_a_large_message() { //arrange //store our luggage and get the claim check var contents = DataGenerator.CreateString(6000); - var myCommand = new MyLargeCommand(1) { Value = contents }; + var myCommand = new MyLargeCommand(1) + { + Value = contents + }; var commandAsJson = JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)); - var stream = new MemoryStream(); var writer = new StreamWriter(stream); await writer.WriteAsync(commandAsJson); await writer.FlushAsync(); stream.Position = 0; var id = await _inMemoryStorageProviderAsync.StoreAsync(stream); - //pretend we ran through the claim check myCommand.Value = $"Claim Check {id}"; - //set the headers, so that we have a claim check listed - var message = new Message( - new MessageHeader(myCommand.Id, new RoutingKey("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), - new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General))) - ); - + var message = new Message(new MessageHeader(myCommand.Id, new RoutingKey("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)))); message.Header.DataRef = id; message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK] = id; - //act var transformPipeline = _pipelineBuilder.BuildUnwrapPipeline(); var transformedMessage = await transformPipeline.UnwrapAsync(message, new RequestContext()); - //assert //contents should be from storage - Assert.Equal(contents, transformedMessage.Value); - Assert.False(await _inMemoryStorageProviderAsync.HasClaimAsync(id)); + await Assert.That(transformedMessage.Value).IsEqualTo(contents); + await Assert.That(await _inMemoryStorageProviderAsync.HasClaimAsync(id)).IsFalse(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_wrapping_a_large_message.cs b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_wrapping_a_large_message.cs index 1ef2c07778..925e89eb2b 100644 --- a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_wrapping_a_large_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_wrapping_a_large_message.cs @@ -1,10 +1,8 @@ -using Paramore.Brighter.Core.Tests.Claims.Test_Doubles; +using Paramore.Brighter.Core.Tests.Claims.Test_Doubles; using Paramore.Brighter.Transforms.Storage; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Claims.InMemory; - public class LargeMessagePayloadWrapTests { private WrapPipeline _transformPipeline; @@ -12,39 +10,31 @@ public class LargeMessagePayloadWrapTests private readonly MyLargeCommand _myCommand; private InMemoryStorageProvider _inMemoryStorageProvider; private readonly Publication _publication; - public LargeMessagePayloadWrapTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyLargeCommandMessageMapper()), - null); + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyLargeCommandMessageMapper()), null); mapperRegistry.Register(); - - _publication = new Publication{Topic = new RoutingKey("transform.event")}; - + _publication = new Publication + { + Topic = new RoutingKey("transform.event") + }; _myCommand = new MyLargeCommand(6000); - _inMemoryStorageProvider = new InMemoryStorageProvider(); - var messageTransformerFactory = new SimpleMessageTransformerFactory( - _ => new ClaimCheckTransformer(_inMemoryStorageProvider, _inMemoryStorageProvider)); - + var messageTransformerFactory = new SimpleMessageTransformerFactory(_ => new ClaimCheckTransformer(_inMemoryStorageProvider, _inMemoryStorageProvider)); _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, messageTransformerFactory); } - [Fact] - public void When_wrapping_a_large_message() + [Test] + public async Task When_wrapping_a_large_message() { //act _transformPipeline = _pipelineBuilder.BuildWrapPipeline(); var message = _transformPipeline.Wrap(_myCommand, new RequestContext(), _publication); - //assert var id = message.Header.DataRef; - Assert.False(string.IsNullOrEmpty(id)); - Assert.Equal($"Claim Check {id}", message.Body.Value); - Assert.True(_inMemoryStorageProvider.HasClaim(id)); + await Assert.That(string.IsNullOrEmpty(id)).IsFalse(); + await Assert.That(message.Body.Value).IsEqualTo($"Claim Check {id}"); + await Assert.That(await _inMemoryStorageProvider.HasClaimAsync(id)).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_wrapping_a_large_message_async.cs b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_wrapping_a_large_message_async.cs index cdd0bd95c3..e84b95ddf4 100644 --- a/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_wrapping_a_large_message_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Claims/InMemory/When_wrapping_a_large_message_async.cs @@ -1,12 +1,10 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.Claims.Test_Doubles; using Paramore.Brighter.Observability; using Paramore.Brighter.Transforms.Storage; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Claims.InMemory; - public class AsyncLargeMessagePayloadWrapTests { private WrapPipelineAsync _transformPipeline; @@ -14,40 +12,32 @@ public class AsyncLargeMessagePayloadWrapTests private readonly MyLargeCommand _myCommand; private readonly InMemoryStorageProvider _inMemoryStorageProviderAsync; private readonly Publication _publication; - public AsyncLargeMessagePayloadWrapTests() { //arrange - TransformPipelineBuilderAsync.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyLargeCommandMessageMapperAsync())); + var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyLargeCommandMessageMapperAsync())); mapperRegistry.RegisterAsync(); - _myCommand = new MyLargeCommand(6000); - _inMemoryStorageProviderAsync = new InMemoryStorageProvider(); - var messageTransformerFactory = new SimpleMessageTransformerFactoryAsync( - _ => new ClaimCheckTransformer(_inMemoryStorageProviderAsync, _inMemoryStorageProviderAsync)); - - _publication = new Publication { Topic = new RoutingKey("MyLargeCommand") }; - + var messageTransformerFactory = new SimpleMessageTransformerFactoryAsync(_ => new ClaimCheckTransformer(_inMemoryStorageProviderAsync, _inMemoryStorageProviderAsync)); + _publication = new Publication + { + Topic = new RoutingKey("MyLargeCommand") + }; _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.All); } - [Fact] + [Test] public async Task When_wrapping_a_large_message() { //act _transformPipeline = _pipelineBuilder.BuildWrapPipeline(); var message = await _transformPipeline.WrapAsync(_myCommand, new RequestContext(), _publication); - //assert - Assert.True(message.Header.Bag.ContainsKey(ClaimCheckTransformer.CLAIM_CHECK)); - Assert.Equal(message.Header.DataRef, message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK]); - var id = (string) message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK]; - Assert.Equal($"Claim Check {id}", message.Body.Value); - Assert.True(await _inMemoryStorageProviderAsync.HasClaimAsync(id)); + await Assert.That(message.Header.Bag.ContainsKey(ClaimCheckTransformer.CLAIM_CHECK)).IsTrue(); + await Assert.That(message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK]).IsEqualTo(message.Header.DataRef); + var id = (string)message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK]; + await Assert.That(message.Body.Value).IsEqualTo($"Claim Check {id}"); + await Assert.That(await _inMemoryStorageProviderAsync.HasClaimAsync(id)).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CloudEvents/CloudEventJsonMessageMapperTests.cs b/tests/Paramore.Brighter.Core.Tests/CloudEvents/CloudEventJsonMessageMapperTests.cs index 9c32adfc87..e0de6e5aae 100644 --- a/tests/Paramore.Brighter.Core.Tests/CloudEvents/CloudEventJsonMessageMapperTests.cs +++ b/tests/Paramore.Brighter.Core.Tests/CloudEvents/CloudEventJsonMessageMapperTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Net.Mime; using System.Text.Json; @@ -6,214 +6,232 @@ using Paramore.Brighter.Core.Tests.JsonMapper.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessageMappers; -using Xunit; namespace Paramore.Brighter.Core.Tests.CloudEvents; - public class CloudEventJsonMessageMapperTests { - [Fact] - public void When_mapping_command_to_message() + [Test] + public async Task When_mapping_command_to_message() { var mapper = new CloudEventJsonMessageMapper(); - var command = new MyCommand { Value = Guid.NewGuid().ToString() }; - var publication = new Publication { Topic = new RoutingKey(Guid.NewGuid().ToString()) }; - var message = mapper.MapToMessage(command, publication); - - Assert.NotNull(message); - Assert.Equal(new ContentType("application/cloudevents+json"), message.Header.ContentType); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - Assert.Equal(publication.Topic, message.Header.Topic); - Assert.Equal(message.Id, command.Id); - Assert.NotNull(message.Body); - - var body = JsonSerializer.Deserialize.CloudEventMessage>( - message.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(body); - Assert.Equal(message.Id, body.Id); - Assert.Equal("application/json", body.DataContentType); - Assert.Equal(command.Value, body.Data.Value); + var command = new MyCommand + { + Value = Guid.NewGuid().ToString() + }; + var publication = new Publication + { + Topic = new RoutingKey(Guid.NewGuid().ToString()) + }; + var message = await mapper.MapToMessageAsync(command, publication); + await Assert.That(message).IsNotNull(); + await Assert.That(message.Header.ContentType).IsEqualTo(new ContentType("application/cloudevents+json")); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(message.Header.Topic).IsEqualTo(publication.Topic); + await Assert.That(command.Id).IsEqualTo(message.Id); + await Assert.That(message.Body).IsNotNull(); + var body = JsonSerializer.Deserialize.CloudEventMessage>(message.Body.Bytes, JsonSerialisationOptions.Options); + await Assert.That(body).IsNotNull(); + await Assert.That(body.Id).IsEqualTo(message.Id); + await Assert.That(body.DataContentType).IsEqualTo("application/json"); + await Assert.That(body.Data.Value).IsEqualTo(command.Value); } - [Fact] + [Test] public async Task When_mapping_command_to_message_async() { var mapper = new CloudEventJsonMessageMapper(); - var command = new MyCommand { Value = Guid.NewGuid().ToString() }; - var publication = new Publication { Topic = new RoutingKey(Guid.NewGuid().ToString()) }; + var command = new MyCommand + { + Value = Guid.NewGuid().ToString() + }; + var publication = new Publication + { + Topic = new RoutingKey(Guid.NewGuid().ToString()) + }; var message = await mapper.MapToMessageAsync(command, publication); - - Assert.NotNull(message); - Assert.Equal(new ContentType("application/cloudevents+json"), message.Header.ContentType); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - Assert.Equal(publication.Topic, message.Header.Topic); - Assert.Equal(message.Id, command.Id); - Assert.NotNull(message.Body); - - var body = JsonSerializer.Deserialize.CloudEventMessage>( - message.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(body); - Assert.Equal(message.Id, body.Id); - Assert.Equal("application/json", body.DataContentType); - Assert.Equal(command.Value, body.Data.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(message.Header.ContentType).IsEqualTo(new ContentType("application/cloudevents+json")); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(message.Header.Topic).IsEqualTo(publication.Topic); + await Assert.That(command.Id).IsEqualTo(message.Id); + await Assert.That(message.Body).IsNotNull(); + var body = JsonSerializer.Deserialize.CloudEventMessage>(message.Body.Bytes, JsonSerialisationOptions.Options); + await Assert.That(body).IsNotNull(); + await Assert.That(body.Id).IsEqualTo(message.Id); + await Assert.That(body.DataContentType).IsEqualTo("application/json"); + await Assert.That(body.Data.Value).IsEqualTo(command.Value); } - [Fact] - public void When_mapping_event_to_message() + [Test] + public async Task When_mapping_event_to_message() { var mapper = new CloudEventJsonMessageMapper(); - var @event = new MyEvent { Value = Guid.NewGuid().ToString() }; - var publication = new Publication { Topic = new RoutingKey(Guid.NewGuid().ToString()) }; - var message = mapper.MapToMessage(@event, publication); - - Assert.NotNull(message); - Assert.Equal(new ContentType("application/cloudevents+json"), message.Header.ContentType); - Assert.Equal(MessageType.MT_EVENT, message.Header.MessageType); - Assert.Equal(publication.Topic, message.Header.Topic); - Assert.Equal(message.Id, @event.Id); - Assert.NotNull(message.Body); - - var body = JsonSerializer.Deserialize.CloudEventMessage>( - message.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(body); - Assert.Equal(message.Id, body.Id); - Assert.Equal("application/json", body.DataContentType); - Assert.Equal(@event.Value, body.Data.Value); + var @event = new MyEvent + { + Value = Guid.NewGuid().ToString() + }; + var publication = new Publication + { + Topic = new RoutingKey(Guid.NewGuid().ToString()) + }; + var message = await mapper.MapToMessageAsync(@event, publication); + await Assert.That(message).IsNotNull(); + await Assert.That(message.Header.ContentType).IsEqualTo(new ContentType("application/cloudevents+json")); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_EVENT); + await Assert.That(message.Header.Topic).IsEqualTo(publication.Topic); + await Assert.That(@event.Id).IsEqualTo(message.Id); + await Assert.That(message.Body).IsNotNull(); + var body = JsonSerializer.Deserialize.CloudEventMessage>(message.Body.Bytes, JsonSerialisationOptions.Options); + await Assert.That(body).IsNotNull(); + await Assert.That(body.Id).IsEqualTo(message.Id); + await Assert.That(body.DataContentType).IsEqualTo("application/json"); + await Assert.That(body.Data.Value).IsEqualTo(@event.Value); } - [Fact] + [Test] public async Task When_mapping_event_to_message_async() { var mapper = new CloudEventJsonMessageMapper(); - var @event = new MyEvent { Value = Guid.NewGuid().ToString() }; - var publication = new Publication { Topic = new RoutingKey(Guid.NewGuid().ToString()) }; + var @event = new MyEvent + { + Value = Guid.NewGuid().ToString() + }; + var publication = new Publication + { + Topic = new RoutingKey(Guid.NewGuid().ToString()) + }; var message = await mapper.MapToMessageAsync(@event, publication); - - Assert.NotNull(message); - Assert.Equal(new ContentType("application/cloudevents+json"), message.Header.ContentType); - Assert.Equal(MessageType.MT_EVENT, message.Header.MessageType); - Assert.Equal(publication.Topic, message.Header.Topic); - Assert.Equal(message.Id, @event.Id); - Assert.NotNull(message.Body); - - var body = JsonSerializer.Deserialize.CloudEventMessage>( - message.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(body); - Assert.Equal(message.Id, body.Id); - Assert.Equal("application/json", body.DataContentType); - Assert.Equal(@event.Value, body.Data.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(message.Header.ContentType).IsEqualTo(new ContentType("application/cloudevents+json")); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_EVENT); + await Assert.That(message.Header.Topic).IsEqualTo(publication.Topic); + await Assert.That(@event.Id).IsEqualTo(message.Id); + await Assert.That(message.Body).IsNotNull(); + var body = JsonSerializer.Deserialize.CloudEventMessage>(message.Body.Bytes, JsonSerialisationOptions.Options); + await Assert.That(body).IsNotNull(); + await Assert.That(body.Id).IsEqualTo(message.Id); + await Assert.That(body.DataContentType).IsEqualTo("application/json"); + await Assert.That(body.Data.Value).IsEqualTo(@event.Value); } - [Fact] - public void When_mapping_request_to_message_should_throw_ArgumentNullException() + [Test] + public async Task When_mapping_request_to_message_should_throw_ArgumentNullException() { var mapper = new CloudEventJsonMessageMapper(); - var request = new MyRequest { Value = Guid.NewGuid().ToString() }; - var publication = new Publication { Topic = new RoutingKey(Guid.NewGuid().ToString()) }; - - Assert.Throws(() => mapper.MapToMessage(request, publication)); + var request = new MyRequest + { + Value = Guid.NewGuid().ToString() + }; + var publication = new Publication + { + Topic = new RoutingKey(Guid.NewGuid().ToString()) + }; + await Assert.That(() => mapper.MapToMessage(request, publication)).ThrowsExactly(); } - [Fact] + [Test] public async Task When_mapping_request_to_message_should_throw_ArgumentNullException_async() { var mapper = new CloudEventJsonMessageMapper(); - var request = new MyRequest { Value = Guid.NewGuid().ToString() }; - var publication = new Publication { Topic = new RoutingKey(Guid.NewGuid().ToString()) }; - - await Assert.ThrowsAsync(() => mapper.MapToMessageAsync(request, publication)); + var request = new MyRequest + { + Value = Guid.NewGuid().ToString() + }; + var publication = new Publication + { + Topic = new RoutingKey(Guid.NewGuid().ToString()) + }; + await Assert.That(() => mapper.MapToMessageAsync(request, publication)).ThrowsExactly(); } - [Fact] - public void When_mapping_command_to_message_with_additional_properties() + [Test] + public async Task When_mapping_command_to_message_with_additional_properties() { var mapper = new CloudEventJsonMessageMapper(); - var command = new MyCommand { Value = Guid.NewGuid().ToString() }; - var extraProperty = new Dictionary { ["test"] = Guid.NewGuid().ToString() }; + var command = new MyCommand + { + Value = Guid.NewGuid().ToString() + }; + var extraProperty = new Dictionary + { + ["test"] = Guid.NewGuid().ToString() + }; var publication = new Publication { Topic = new RoutingKey(Guid.NewGuid().ToString()), CloudEventsAdditionalProperties = extraProperty }; - - var message = mapper.MapToMessage(command, publication); - - Assert.NotNull(message); - Assert.Equal(new ContentType("application/cloudevents+json"), message.Header.ContentType); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - Assert.Equal(publication.Topic, message.Header.Topic); - Assert.Equal(message.Id, command.Id); - Assert.NotNull(message.Body); - - var body = JsonSerializer.Deserialize.CloudEventMessage>( - message.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(body); - Assert.Equal(message.Id, body.Id); - Assert.Equal("application/json", body.DataContentType); - Assert.Equal(command.Value, body.Data.Value); - Assert.NotNull(body.AdditionalProperties); - Assert.Single(body.AdditionalProperties); - Assert.Equal(extraProperty["test"], body.AdditionalProperties["test"]); + var message = await mapper.MapToMessageAsync(command, publication); + await Assert.That(message).IsNotNull(); + await Assert.That(message.Header.ContentType).IsEqualTo(new ContentType("application/cloudevents+json")); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(message.Header.Topic).IsEqualTo(publication.Topic); + await Assert.That(command.Id).IsEqualTo(message.Id); + await Assert.That(message.Body).IsNotNull(); + var body = JsonSerializer.Deserialize.CloudEventMessage>(message.Body.Bytes, JsonSerialisationOptions.Options); + await Assert.That(body).IsNotNull(); + await Assert.That(body.Id).IsEqualTo(message.Id); + await Assert.That(body.DataContentType).IsEqualTo("application/json"); + await Assert.That(body.Data.Value).IsEqualTo(command.Value); + await Assert.That(body.AdditionalProperties).IsNotNull(); + await Assert.That(body.AdditionalProperties).HasSingleItem(); + await Assert.That(body.AdditionalProperties["test"]).IsEqualTo(extraProperty["test"]); } - - [Fact] - public void When_mapping_command_to_message_with_duplicated_additional_properties() + + [Test] + public async Task When_mapping_command_to_message_with_duplicated_additional_properties() { var mapper = new CloudEventJsonMessageMapper(); - var command = new MyCommand { Value = Guid.NewGuid().ToString() }; - var extraProperty = new Dictionary { ["id"] = "test-id" }; + var command = new MyCommand + { + Value = Guid.NewGuid().ToString() + }; + var extraProperty = new Dictionary + { + ["id"] = "test-id" + }; var publication = new Publication { Topic = new RoutingKey(Guid.NewGuid().ToString()), CloudEventsAdditionalProperties = extraProperty }; - - var message = mapper.MapToMessage(command, publication); - - Assert.NotNull(message); - Assert.Equal(new ContentType("application/cloudevents+json"), message.Header.ContentType); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - Assert.Equal(publication.Topic, message.Header.Topic); - Assert.Equal(message.Id, command.Id); - Assert.NotNull(message.Body); - - var body = JsonSerializer.Deserialize.CloudEventMessage>( - message.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(body); - Assert.Equal("test-id", body.Id); - Assert.Equal("application/json", body.DataContentType); - Assert.Equal(command.Value, body.Data.Value); + var message = await mapper.MapToMessageAsync(command, publication); + await Assert.That(message).IsNotNull(); + await Assert.That(message.Header.ContentType).IsEqualTo(new ContentType("application/cloudevents+json")); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(message.Header.Topic).IsEqualTo(publication.Topic); + await Assert.That(command.Id).IsEqualTo(message.Id); + await Assert.That(message.Body).IsNotNull(); + var body = JsonSerializer.Deserialize.CloudEventMessage>(message.Body.Bytes, JsonSerialisationOptions.Options); + await Assert.That(body).IsNotNull(); + await Assert.That(body.Id).IsEqualTo("test-id"); + await Assert.That(body.DataContentType).IsEqualTo("application/json"); + await Assert.That(body.Data.Value).IsEqualTo(command.Value); } - [Fact] - public void When_mapping_message_to_command() + [Test] + public async Task When_mapping_message_to_command() { - var command = new MyCommand { Value = Guid.NewGuid().ToString() }; + var command = new MyCommand + { + Value = Guid.NewGuid().ToString() + }; var mapper = new CloudEventJsonMessageMapper(); - - var request = - mapper.MapToRequest(new Message(new MessageHeader(), - new MessageBody( - JsonSerializer.Serialize(new CloudEventJsonMessageMapper.CloudEventMessage - { - Data = command - })))); - Assert.NotNull(request); - Assert.Equal(command.Value, request.Value); + var request = await mapper.MapToRequestAsync(new Message(new MessageHeader(), new MessageBody(JsonSerializer.Serialize(new CloudEventJsonMessageMapper.CloudEventMessage { Data = command })))); + await Assert.That(request).IsNotNull(); + await Assert.That(request.Value).IsEqualTo(command.Value); } - [Fact] + [Test] public async Task When_mapping_message_to_command_async() { - var command = new MyCommand { Value = Guid.NewGuid().ToString() }; + var command = new MyCommand + { + Value = Guid.NewGuid().ToString() + }; var mapper = new CloudEventJsonMessageMapper(); - - var request = await mapper.MapToRequestAsync(new Message(new MessageHeader(), - new MessageBody( - JsonSerializer.Serialize( - new CloudEventJsonMessageMapper.CloudEventMessage { Data = command })))); - - Assert.NotNull(request); - Assert.Equal(command.Value, request.Value); + var request = await mapper.MapToRequestAsync(new Message(new MessageHeader(), new MessageBody(JsonSerializer.Serialize(new CloudEventJsonMessageMapper.CloudEventMessage { Data = command })))); + await Assert.That(request).IsNotNull(); + await Assert.That(request.Value).IsEqualTo(command.Value); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CloudEvents/When_a_message_uses_cloud_events.cs b/tests/Paramore.Brighter.Core.Tests/CloudEvents/When_a_message_uses_cloud_events.cs index 5607f9309b..f849d35498 100644 --- a/tests/Paramore.Brighter.Core.Tests/CloudEvents/When_a_message_uses_cloud_events.cs +++ b/tests/Paramore.Brighter.Core.Tests/CloudEvents/When_a_message_uses_cloud_events.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Mime; using System.Collections.Generic; using System.Text.Json; @@ -6,11 +6,9 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.CloudEvents; - -public class CloudEventsTransformerTests +public class CloudEventsTransformerTests { private readonly CloudEventsTransformer _transformer = new(); private readonly Uri _source = new("http://goparamore.io/CloudEventsTransformerTests"); @@ -18,155 +16,107 @@ public class CloudEventsTransformerTests private readonly Uri _dataSchema = new Uri("http://goparamore.io/CloudEventsTransformerTests/schema"); private readonly string _subject = "CloudEventsTransformerTests"; private Message _message; - public CloudEventsTransformerTests() { - _message = new( - new MessageHeader(Id.Random(), new RoutingKey("Test Topic"), MessageType.MT_COMMAND, contentType: new ContentType(MediaTypeNames.Text.Plain), - source: _source, subject: _subject, type: _type, dataSchema: _dataSchema), new MessageBody("test content", contentType: new ContentType(MediaTypeNames.Text.Plain)) - ); + _message = new(new MessageHeader(Id.Random(), new RoutingKey("Test Topic"), MessageType.MT_COMMAND, contentType: new ContentType(MediaTypeNames.Text.Plain), source: _source, subject: _subject, type: _type, dataSchema: _dataSchema), new MessageBody("test content", contentType: new ContentType(MediaTypeNames.Text.Plain))); } - [Fact] - public void When_a_message_uses_cloud_events_via_attribute() + [Test] + public async Task When_a_message_uses_cloud_events_via_attribute() { //act var body = _message.Body; _transformer.InitializeWrapFromAttributeParams(_source.ToString(), _type, null, _dataSchema.ToString(), _subject, CloudEventFormat.Binary); - var cloudEvents = _transformer.Wrap(_message, new Publication - { - DataSchema = _dataSchema, - Source = _source, - Type = _type, - Subject = _subject - }); - + var cloudEvents = _transformer.Wrap(_message, new Publication { DataSchema = _dataSchema, Source = _source, Type = _type, Subject = _subject }); //assert - Assert.Equal(_source, cloudEvents.Header.Source); - Assert.Equal(_type, cloudEvents.Header.Type); - Assert.Equal(_message.Header.ContentType, cloudEvents.Header.ContentType!); - Assert.Equal(_dataSchema, cloudEvents.Header.DataSchema); - Assert.Equal(_subject, cloudEvents.Header.Subject); - Assert.Equal(body.Bytes, cloudEvents.Body.Bytes); + await Assert.That(cloudEvents.Header.Source).IsEqualTo(_source); + await Assert.That(cloudEvents.Header.Type).IsEqualTo(_type); + await Assert.That(cloudEvents.Header.ContentType!).IsEqualTo(_message.Header.ContentType); + await Assert.That(cloudEvents.Header.DataSchema).IsEqualTo(_dataSchema); + await Assert.That(cloudEvents.Header.Subject).IsEqualTo(_subject); + await Assert.That(cloudEvents.Body.Bytes).IsEquivalentTo(body.Bytes); } - - [Fact] - public void When_a_message_uses_cloud_events_via_attribute_and_format_as_json() + + [Test] + public async Task When_a_message_uses_cloud_events_via_attribute_and_format_as_json() { //act var body = _message.Body; _transformer.InitializeWrapFromAttributeParams(_source.AbsoluteUri, _type, null, _dataSchema.ToString(), _subject, CloudEventFormat.Json); - var cloudEvents = _transformer.Wrap(_message, new Publication - { - DataSchema = _dataSchema, - Source = _source, - Type = _type, - Subject = _subject - }); - + var cloudEvents = _transformer.Wrap(_message, new Publication { DataSchema = _dataSchema, Source = _source, Type = _type, Subject = _subject }); //assert - Assert.Equal(_source, cloudEvents.Header.Source); - Assert.Equal(_type, cloudEvents.Header.Type); - Assert.Equal(new ContentType("application/cloudevents+json"), cloudEvents.Header.ContentType); - Assert.Equal(_dataSchema, cloudEvents.Header.DataSchema); - Assert.Equal(_subject, cloudEvents.Header.Subject); - Assert.NotEqual(body.Bytes, cloudEvents.Body.Bytes); - + await Assert.That(cloudEvents.Header.Source).IsEqualTo(_source); + await Assert.That(cloudEvents.Header.Type).IsEqualTo(_type); + await Assert.That(cloudEvents.Header.ContentType).IsEqualTo(new ContentType("application/cloudevents+json")); + await Assert.That(cloudEvents.Header.DataSchema).IsEqualTo(_dataSchema); + await Assert.That(cloudEvents.Header.Subject).IsEqualTo(_subject); + await Assert.That(cloudEvents.Body.Bytes).IsNotEqualTo(body.Bytes); var json = JsonSerializer.Deserialize(cloudEvents.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(json); - Assert.Equal(_source, json.Source); - Assert.Equal(_type, json.Type); - Assert.Equal(new ContentType(MediaTypeNames.Text.Plain).MediaType, json.DataContentType); - Assert.Equal(_dataSchema, json.DataSchema); - Assert.Equal(_subject, json.Subject); - Assert.Equal(body.Value, json.Data?.GetString()); + await Assert.That(json).IsNotNull(); + await Assert.That(json.Source).IsEqualTo(_source); + await Assert.That(json.Type).IsEqualTo(_type); + await Assert.That(json.DataContentType).IsEqualTo(new ContentType(MediaTypeNames.Text.Plain).MediaType); + await Assert.That(json.DataSchema).IsEqualTo(_dataSchema); + await Assert.That(json.Subject).IsEqualTo(_subject); + await Assert.That(json.Data?.GetString()).IsEqualTo(body.Value); } - - [Fact] - public void When_a_empty_message_uses_cloud_events_via_attribute_and_format_as_json() + + [Test] + public async Task When_a_empty_message_uses_cloud_events_via_attribute_and_format_as_json() { //act - _message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey("Test Topic"), MessageType.MT_COMMAND), - new MessageBody([]) ); - + _message = new Message(new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey("Test Topic"), MessageType.MT_COMMAND), new MessageBody([])); var body = _message.Body; - _transformer.InitializeWrapFromAttributeParams(_source.AbsoluteUri, _type, null, _dataSchema.ToString(), _subject, CloudEventFormat.Json); - var cloudEvents = _transformer.Wrap(_message, new Publication - { - DataSchema = _dataSchema, - Source = _source, - Type = _type, - Subject = _subject - }); - + _transformer.InitializeWrapFromAttributeParams(_source.AbsoluteUri, _type, null, _dataSchema.ToString(), _subject, CloudEventFormat.Json); + var cloudEvents = _transformer.Wrap(_message, new Publication { DataSchema = _dataSchema, Source = _source, Type = _type, Subject = _subject }); //assert - Assert.Equal(_source, cloudEvents.Header.Source); - Assert.Equal(_type, cloudEvents.Header.Type); - Assert.Equal(new ContentType("application/cloudevents+json"), cloudEvents.Header.ContentType); - Assert.Equal(_dataSchema, cloudEvents.Header.DataSchema); - Assert.Equal(_subject, cloudEvents.Header.Subject); - Assert.NotEqual(body.Bytes, cloudEvents.Body.Bytes); - + await Assert.That(cloudEvents.Header.Source).IsEqualTo(_source); + await Assert.That(cloudEvents.Header.Type).IsEqualTo(_type); + await Assert.That(cloudEvents.Header.ContentType).IsEqualTo(new ContentType("application/cloudevents+json")); + await Assert.That(cloudEvents.Header.DataSchema).IsEqualTo(_dataSchema); + await Assert.That(cloudEvents.Header.Subject).IsEqualTo(_subject); + await Assert.That(cloudEvents.Body.Bytes).IsNotEqualTo(body.Bytes); var json = JsonSerializer.Deserialize(cloudEvents.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(json); - Assert.Equal(_source, json.Source); - Assert.Equal(_type, json.Type); - Assert.Equal(new ContentType(MediaTypeNames.Application.Json){CharSet = CharacterEncoding.UTF8.FromCharacterEncoding()}.ToString(), json.DataContentType); - Assert.Equal(_dataSchema, json.DataSchema); - Assert.Equal(_subject, json.Subject); - Assert.Null(json.Data); + await Assert.That(json).IsNotNull(); + await Assert.That(json.Source).IsEqualTo(_source); + await Assert.That(json.Type).IsEqualTo(_type); + await Assert.That(json.DataContentType).IsEqualTo(new ContentType(MediaTypeNames.Application.Json) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }.ToString()); + await Assert.That(json.DataSchema).IsEqualTo(_dataSchema); + await Assert.That(json.Subject).IsEqualTo(_subject); + await Assert.That(json.Data).IsNull(); } - - [Fact] - public void When_a_non_json_message_uses_cloud_events_via_attribute_and_format_as_json() + + [Test] + public async Task When_a_non_json_message_uses_cloud_events_via_attribute_and_format_as_json() { //act - _message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey("Test Topic"), MessageType.MT_COMMAND), - new MessageBody("teste")); - + _message = new Message(new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey("Test Topic"), MessageType.MT_COMMAND), new MessageBody("teste")); var body = _message.Body; _transformer.InitializeWrapFromAttributeParams(_source.AbsoluteUri, _type, null, _dataSchema.ToString(), _subject, CloudEventFormat.Json); - var cloudEvents = _transformer.Wrap(_message, new Publication - { - DataSchema = _dataSchema, - Source = _source, - Type = _type, - Subject = _subject - }); - + var cloudEvents = _transformer.Wrap(_message, new Publication { DataSchema = _dataSchema, Source = _source, Type = _type, Subject = _subject }); //assert - Assert.Equal(_source, cloudEvents.Header.Source); - Assert.Equal(_type, cloudEvents.Header.Type); - Assert.Equal(_message.Header.ContentType, cloudEvents.Header.ContentType); - Assert.Equal(_dataSchema, cloudEvents.Header.DataSchema); - Assert.Equal(_subject, cloudEvents.Header.Subject); - Assert.Equal(body.Bytes, cloudEvents.Body.Bytes); + await Assert.That(cloudEvents.Header.Source).IsEqualTo(_source); + await Assert.That(cloudEvents.Header.Type).IsEqualTo(_type); + await Assert.That(cloudEvents.Header.ContentType).IsEqualTo(_message.Header.ContentType); + await Assert.That(cloudEvents.Header.DataSchema).IsEqualTo(_dataSchema); + await Assert.That(cloudEvents.Header.Subject).IsEqualTo(_subject); + await Assert.That(cloudEvents.Body.Bytes).IsEquivalentTo(body.Bytes); } - - [Fact] - public void When_a_message_uses_cloud_events_via_a_publication() + + [Test] + public async Task When_a_message_uses_cloud_events_via_a_publication() { //act - var cloudEvents = _transformer.Wrap(_message, new Publication - { - Source = _source, - Type = _type, - DataSchema = _dataSchema, - Subject = _subject - }); - + var cloudEvents = _transformer.Wrap(_message, new Publication { Source = _source, Type = _type, DataSchema = _dataSchema, Subject = _subject }); //assert - Assert.Equal(_source, cloudEvents.Header.Source); - Assert.Equal(_type, cloudEvents.Header.Type); - Assert.Equal(_dataSchema.AbsoluteUri, cloudEvents.Header.DataSchema!.AbsoluteUri); - Assert.Equal(_subject, cloudEvents.Header.Subject); - + await Assert.That(cloudEvents.Header.Source).IsEqualTo(_source); + await Assert.That(cloudEvents.Header.Type).IsEqualTo(_type); + await Assert.That(cloudEvents.Header.DataSchema!.AbsoluteUri).IsEqualTo(_dataSchema.AbsoluteUri); + await Assert.That(cloudEvents.Header.Subject).IsEqualTo(_subject); } - - [Fact] - public void When_a_message_uses_cloud_events_and_a_publication_and_format_as_binary() + + [Test] + public async Task When_a_message_uses_cloud_events_and_a_publication_and_format_as_binary() { //arrange var publication = new Publication @@ -176,34 +126,27 @@ public void When_a_message_uses_cloud_events_and_a_publication_and_format_as_bin DataSchema = _dataSchema, Subject = _subject }; - //These attributes override the publication values above const string source = "http://goparamore.io/OverrideSource"; const string type = "goparamore.io/OverrideType"; //Should use a string, as we want to pass these as constants in the attribute string dataSchema = "http://goparamore.io/CloudEventsTransformerOverride/schema"; - const string subject = "CloudEventsTransformerAlternative"; - + const string subject = "CloudEventsTransformerAlternative"; //act - _transformer.InitializeWrapFromAttributeParams(source, type, null, dataSchema, subject, CloudEventFormat.Binary); - + _transformer.InitializeWrapFromAttributeParams(source, type, null, dataSchema, subject, CloudEventFormat.Binary); var cloudEvents = _transformer.Wrap(_message, publication); - //assert - Assert.Equal(source, cloudEvents.Header.Source.ToString()); - Assert.Equal(type, cloudEvents.Header.Type); - Assert.Equal(_message.Header.ContentType, cloudEvents.Header.ContentType); - Assert.Equal(dataSchema, cloudEvents.Header.DataSchema!.AbsoluteUri); - Assert.Equal(subject, cloudEvents.Header.Subject); - + await Assert.That(cloudEvents.Header.Source.ToString()).IsEqualTo(source); + await Assert.That(cloudEvents.Header.Type.Value).IsEqualTo(type); + await Assert.That(cloudEvents.Header.ContentType).IsEqualTo(_message.Header.ContentType); + await Assert.That(cloudEvents.Header.DataSchema!.AbsoluteUri).IsEqualTo(dataSchema); + await Assert.That(cloudEvents.Header.Subject).IsEqualTo(subject); } - - - [Fact] - public void When_a_message_uses_cloud_events_and_a_publication_and_format_as_json() + + [Test] + public async Task When_a_message_uses_cloud_events_and_a_publication_and_format_as_json() { //arrange - var publication = new Publication { Source = _source, @@ -211,189 +154,151 @@ public void When_a_message_uses_cloud_events_and_a_publication_and_format_as_jso DataSchema = _dataSchema, Subject = _subject }; - //These attributes override the publication values above const string source = "http://goparamore.io/OverrideSource"; const string type = "goparamore.io/OverrideType"; const string dataContentType = MediaTypeNames.Text.Plain; var cloudEventDataContentType = new ContentType("application/cloudevents+json"); const string dataSchema = "http://goparamore.io/CloudEventsTransformerOverride/schema"; - const string subject = "CloudEventsTransformerAlternative"; + const string subject = "CloudEventsTransformerAlternative"; var body = _message.Body; - //act - _transformer.InitializeWrapFromAttributeParams(source, type, null, dataSchema, subject, CloudEventFormat.Json); - + _transformer.InitializeWrapFromAttributeParams(source, type, null, dataSchema, subject, CloudEventFormat.Json); var cloudEvents = _transformer.Wrap(_message, publication); - //assert - Assert.Equal(source, cloudEvents.Header.Source.ToString()); - Assert.Equal(type, cloudEvents.Header.Type); - Assert.Equal(cloudEventDataContentType, cloudEvents.Header.ContentType); - Assert.Equal(dataSchema, cloudEvents.Header.DataSchema!.ToString()); - Assert.Equal(subject, cloudEvents.Header.Subject); - Assert.NotEqual(body.Bytes, cloudEvents.Body.Bytes); - + await Assert.That(cloudEvents.Header.Source.ToString()).IsEqualTo(source); + await Assert.That(cloudEvents.Header.Type.Value).IsEqualTo(type); + await Assert.That(cloudEvents.Header.ContentType).IsEqualTo(cloudEventDataContentType); + await Assert.That(cloudEvents.Header.DataSchema!.ToString()).IsEqualTo(dataSchema); + await Assert.That(cloudEvents.Header.Subject).IsEqualTo(subject); + await Assert.That(cloudEvents.Body.Bytes).IsNotEqualTo(body.Bytes); var json = JsonSerializer.Deserialize(cloudEvents.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(json); - Assert.Equal(source, json.Source.ToString()); - Assert.Equal(type, json.Type); - Assert.Equal(dataContentType, json.DataContentType); - Assert.Equal(dataSchema, json.DataSchema!.ToString()); - Assert.Equal(subject, json.Subject); - Assert.Equal(body.Value, json.Data?.GetString()); + await Assert.That(json).IsNotNull(); + await Assert.That(json.Source.ToString()).IsEqualTo(source); + await Assert.That(json.Type).IsEqualTo(type); + await Assert.That(json.DataContentType).IsEqualTo(dataContentType); + await Assert.That(json.DataSchema!.ToString()).IsEqualTo(dataSchema); + await Assert.That(json.Subject).IsEqualTo(subject); + await Assert.That(json.Data?.GetString()).IsEqualTo(body.Value); } - - [Fact] - public void When_a_message_uses_cloud_events_but_no_publication_or_arguments() + + [Test] + public async Task When_a_message_uses_cloud_events_but_no_publication_or_arguments() { //arrange var publication = new Publication { - //no cloud events properties set + //no cloud events properties set }; - //These attributes override the publication values above - //act var cloudEvents = _transformer.Wrap(_message, publication); - //assert - Assert.Equal(new Uri("http://goparamore.io"), cloudEvents.Header.Source); - Assert.Equal( CloudEventsType.Empty, cloudEvents.Header.Type); - Assert.Equal(new ContentType(MediaTypeNames.Text.Plain), cloudEvents.Header.ContentType); - Assert.Null(cloudEvents.Header.DataSchema); - Assert.Null(cloudEvents.Header.Subject); + await Assert.That(cloudEvents.Header.Source).IsEqualTo(new Uri("http://goparamore.io")); + await Assert.That(cloudEvents.Header.Type).IsEqualTo(CloudEventsType.Empty); + await Assert.That(cloudEvents.Header.ContentType).IsEqualTo(new ContentType(MediaTypeNames.Text.Plain)); + await Assert.That(cloudEvents.Header.DataSchema).IsNull(); + await Assert.That(cloudEvents.Header.Subject).IsNull(); } - - [Fact] - public void When_unwrap_a_message_with_binary_format() + + [Test] + public async Task When_unwrap_a_message_with_binary_format() { //arrange - _transformer.InitializeWrapFromAttributeParams(_source.AbsoluteUri, _type, null, _dataSchema.ToString(), _subject, CloudEventFormat.Binary); - + _transformer.InitializeWrapFromAttributeParams(_source.AbsoluteUri, _type, null, _dataSchema.ToString(), _subject, CloudEventFormat.Binary); // act var message = _transformer.Unwrap(_message); - - Assert.Equal(_message.Header.Source, message.Header.Source); - Assert.Equal(_message.Header.Type, message.Header.Type); - Assert.Equal(_message.Header.ContentType, message.Header.ContentType); - Assert.Equal(_message.Header.DataSchema, message.Header.DataSchema); - Assert.Equal(_message.Header.Subject, message.Header.Subject); - Assert.Equal(_message.Body.Bytes, message.Body.Bytes); + await Assert.That(message.Header.Source).IsEqualTo(_message.Header.Source); + await Assert.That(message.Header.Type).IsEqualTo(_message.Header.Type); + await Assert.That(message.Header.ContentType).IsEqualTo(_message.Header.ContentType); + await Assert.That(message.Header.DataSchema).IsEqualTo(_message.Header.DataSchema); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); + await Assert.That(message.Body.Bytes).IsEquivalentTo(_message.Body.Bytes); } - - [Fact] - public void When_unwrap_a_message_with_binary_format_and_wrap_before() + + [Test] + public async Task When_unwrap_a_message_with_binary_format_and_wrap_before() { //arrange var publication = new Publication { - //no cloud events properties set + //no cloud events properties set }; - - _transformer.InitializeWrapFromAttributeParams(_source.AbsoluteUri, _type, null, _dataSchema.ToString(), _subject, CloudEventFormat.Binary); - var cloudEvents = _transformer.Wrap(_message, publication); - - // act - var message = _transformer.Unwrap(cloudEvents); - - Assert.Equal(_source, message.Header.Source); - Assert.Equal(CloudEventsType.Empty, message.Header.Type); - Assert.Equal(_dataSchema, message.Header.DataSchema); - Assert.Equal(_subject, message.Header.Subject); - Assert.Equal(_message.Body.Bytes, message.Body.Bytes); + _transformer.InitializeWrapFromAttributeParams(_source.AbsoluteUri, _type, null, _dataSchema.ToString(), _subject, CloudEventFormat.Binary); + var cloudEvents = _transformer.Wrap(_message, publication); + // act + var message = _transformer.Unwrap(cloudEvents); + await Assert.That(message.Header.Source).IsEqualTo(_source); + await Assert.That(message.Header.Type).IsEqualTo(CloudEventsType.Empty); + await Assert.That(message.Header.DataSchema).IsEqualTo(_dataSchema); + await Assert.That(message.Header.Subject).IsEqualTo(_subject); + await Assert.That(message.Body.Bytes).IsEquivalentTo(_message.Body.Bytes); } - - [Fact] - public void When_unwrap_a_message_with_json_format_and_provided_message_is_not_json() + + [Test] + public async Task When_unwrap_a_message_with_json_format_and_provided_message_is_not_json() { //arrange - _transformer.InitializeWrapFromAttributeParams(_source.AbsoluteUri, _type, null, _dataSchema.ToString(), _subject, CloudEventFormat.Json); - _message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey("Test Topic"), MessageType.MT_COMMAND), - new MessageBody("teste")); - + _transformer.InitializeWrapFromAttributeParams(_source.AbsoluteUri, _type, null, _dataSchema.ToString(), _subject, CloudEventFormat.Json); + _message = new Message(new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey("Test Topic"), MessageType.MT_COMMAND), new MessageBody("teste")); // act var message = _transformer.Unwrap(_message); - - Assert.Equal(_message.Header.Source, message.Header.Source); - Assert.Equal(_message.Header.Type, message.Header.Type); - Assert.Equal(_message.Header.ContentType, message.Header.ContentType); - Assert.Equal(_message.Header.DataSchema, message.Header.DataSchema); - Assert.Equal(_message.Header.Subject, message.Header.Subject); - Assert.Equal(_message.Body.Bytes, message.Body.Bytes); + await Assert.That(message.Header.Source).IsEqualTo(_message.Header.Source); + await Assert.That(message.Header.Type).IsEqualTo(_message.Header.Type); + await Assert.That(message.Header.ContentType).IsEqualTo(_message.Header.ContentType); + await Assert.That(message.Header.DataSchema).IsEqualTo(_message.Header.DataSchema); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); + await Assert.That(message.Body.Bytes).IsEquivalentTo(_message.Body.Bytes); } - - [Fact] - public void When_unwrap_a_message_with_json_format_and_provided_message_is_not_cloud_event_json() + + [Test] + public async Task When_unwrap_a_message_with_json_format_and_provided_message_is_not_cloud_event_json() { //arrange _transformer.InitializeWrapFromAttributeParams(_source.AbsoluteUri, _type, null, _dataSchema.ToString(), _subject, CloudEventFormat.Json); - // act var message = _transformer.Unwrap(_message); - - Assert.Equal(_message.Header.Source, message.Header.Source); - Assert.Equal(_message.Header.Type, message.Header.Type); - Assert.Equal(_message.Header.ContentType, message.Header.ContentType); - Assert.Equal(_message.Header.DataSchema, message.Header.DataSchema); - Assert.Equal(_message.Header.Subject, message.Header.Subject); - Assert.Equal(_message.Body.Bytes, message.Body.Bytes); + await Assert.That(message.Header.Source).IsEqualTo(_message.Header.Source); + await Assert.That(message.Header.Type).IsEqualTo(_message.Header.Type); + await Assert.That(message.Header.ContentType).IsEqualTo(_message.Header.ContentType); + await Assert.That(message.Header.DataSchema).IsEqualTo(_message.Header.DataSchema); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); + await Assert.That(message.Body.Bytes).IsEquivalentTo(_message.Body.Bytes); } - - [Fact] - public void When_unwrap_a_message_with_json_format_and_provided_message_has_no_body() + + [Test] + public async Task When_unwrap_a_message_with_json_format_and_provided_message_has_no_body() { //arrange - _transformer.InitializeWrapFromAttributeParams(_source.AbsoluteUri, _type, null, _dataSchema.ToString(), _subject, CloudEventFormat.Json); - _message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey("Test Topic"), MessageType.MT_COMMAND), - new MessageBody([]) ); - - var cloudEventsMessage = _transformer.Wrap(_message, new Publication - { - DataSchema = _dataSchema, - Source = _source, - Type = _type, - Subject = _subject - }); - + _transformer.InitializeWrapFromAttributeParams(_source.AbsoluteUri, _type, null, _dataSchema.ToString(), _subject, CloudEventFormat.Json); + _message = new Message(new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey("Test Topic"), MessageType.MT_COMMAND), new MessageBody([])); + var cloudEventsMessage = _transformer.Wrap(_message, new Publication { DataSchema = _dataSchema, Source = _source, Type = _type, Subject = _subject }); // act var unwrap = _transformer.Unwrap(cloudEventsMessage); - - Assert.Equal(_message.Header.Source, unwrap.Header.Source); - Assert.Equal(_message.Header.Type, unwrap.Header.Type); - Assert.Equal(new ContentType(MediaTypeNames.Application.Json){CharSet = CharacterEncoding.UTF8.FromCharacterEncoding()}, unwrap.Header.ContentType); - Assert.Equal(_message.Header.DataSchema, unwrap.Header.DataSchema); - Assert.Equal(_message.Header.Subject, unwrap.Header.Subject); - Assert.Equal([], unwrap.Body.Bytes); + await Assert.That(unwrap.Header.Source).IsEqualTo(_message.Header.Source); + await Assert.That(unwrap.Header.Type).IsEqualTo(_message.Header.Type); + await Assert.That(unwrap.Header.ContentType).IsEqualTo(new ContentType(MediaTypeNames.Application.Json) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }); + await Assert.That(unwrap.Header.DataSchema).IsEqualTo(_message.Header.DataSchema); + await Assert.That(unwrap.Header.Subject).IsEqualTo(_message.Header.Subject); + await Assert.That(unwrap.Body.Bytes).IsEquivalentTo(Array.Empty()); } - - [Fact] - public void When_unwrap_a_message_with_json_format() + + [Test] + public async Task When_unwrap_a_message_with_json_format() { //arrange _transformer.InitializeWrapFromAttributeParams(_source.AbsoluteUri, _type, null, _dataSchema.ToString(), _subject, CloudEventFormat.Json); var body = _message.Body; - var cloudEventsMessage = _transformer.Wrap(_message, new Publication - { - CloudEventsAdditionalProperties = new Dictionary - { - ["test"] = "test-header" - } - }); - + var cloudEventsMessage = _transformer.Wrap(_message, new Publication { CloudEventsAdditionalProperties = new Dictionary { ["test"] = "test-header" } }); // act var unwrap = _transformer.Unwrap(cloudEventsMessage); - - Assert.Equal(_message.Header.Source, unwrap.Header.Source); - Assert.Equal(_message.Header.Type, unwrap.Header.Type); - Assert.Equal(new ContentType(MediaTypeNames.Text.Plain), unwrap.Header.ContentType); - Assert.Equal(_message.Header.DataSchema, unwrap.Header.DataSchema); - Assert.Equal(_message.Header.Subject, unwrap.Header.Subject); - Assert.Equal(body.Bytes, unwrap.Body.Bytes); - Assert.Single(unwrap.Header.Bag); - Assert.Equal("test-header", unwrap.Header.Bag["test"]); + await Assert.That(unwrap.Header.Source).IsEqualTo(_message.Header.Source); + await Assert.That(unwrap.Header.Type).IsEqualTo(_message.Header.Type); + await Assert.That(unwrap.Header.ContentType).IsEqualTo(new ContentType(MediaTypeNames.Text.Plain)); + await Assert.That(unwrap.Header.DataSchema).IsEqualTo(_message.Header.DataSchema); + await Assert.That(unwrap.Header.Subject).IsEqualTo(_message.Header.Subject); + await Assert.That(unwrap.Body.Bytes).IsEquivalentTo(body.Bytes); + await Assert.That(unwrap.Header.Bag).HasSingleItem(); + await Assert.That(unwrap.Header.Bag["test"]).IsEqualTo("test-header"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Call/When_Calling_A_Server_Via_The_Command_Processor.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Call/When_Calling_A_Server_Via_The_Command_Processor.cs index 44a4d8d651..b12f3418a2 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Call/When_Calling_A_Server_Via_The_Command_Processor.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Call/When_Calling_A_Server_Via_The_Command_Processor.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using System.Transactions; @@ -9,7 +9,6 @@ using Paramore.Brighter.ServiceActivator; using Polly.Registry; using Polly.Retry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Call { @@ -17,100 +16,56 @@ public class CommandProcessorCallTests { private readonly CommandProcessor _commandProcessor; private readonly MyRequest _myRequest = new(); - private readonly InternalBus _bus = new() ; + private readonly InternalBus _bus = new(); private readonly MessageMapperRegistry _messageMapperRegistry; private readonly RoutingKey _routingKey; - public CommandProcessorCallTests() { - var timeProvider = new FakeTimeProvider(); _routingKey = new RoutingKey("MyRequest"); - var messageProducer = new InMemoryMessageProducer(_bus, new Publication{Topic = _routingKey, RequestType = typeof(MyRequest)}); - + var messageProducer = new InMemoryMessageProducer(_bus, new Publication { Topic = _routingKey, RequestType = typeof(MyRequest) }); _messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((type) => { if (type == typeof(MyRequestMessageMapper)) return new MyRequestMessageMapper(); if (type == typeof(MyResponseMessageMapper)) return new MyResponseMessageMapper(); - throw new ConfigurationException($"No mapper found for {type.Name}"); }), null); _messageMapperRegistry.Register(); _messageMapperRegistry.Register(); - var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.Register(); var handlerFactory = new SimpleHandlerFactorySync(_ => new MyResponseHandler()); - var internalBus = new InternalBus(); InMemoryChannelFactory inMemoryChannelFactory = new(internalBus, TimeProvider.System); - var replySubs = new List { new Subscription() }; - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - - var producerRegistry = - new ProducerRegistry(new Dictionary - { - { _routingKey, messageProducer }, - }); - + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); + var producerRegistry = new ProducerRegistry(new Dictionary { { _routingKey, messageProducer }, }); var tracer = new BrighterTracer(); - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - _messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - new InMemoryOutbox(timeProvider){Tracer = tracer}); - - _commandProcessor = new CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - replySubscriptions:replySubs, - responseChannelFactory: inMemoryChannelFactory, - requestSchedulerFactory: new InMemorySchedulerFactory() - ); - - PipelineBuilder.ClearPipelineCache(); - + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, _messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), new InMemoryOutbox(timeProvider) { Tracer = tracer }); + _commandProcessor = new CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, replySubscriptions: replySubs, responseChannelFactory: inMemoryChannelFactory, requestSchedulerFactory: new InMemorySchedulerFactory()); _myRequest.RequestValue = "Hello World"; } - [Fact] - public void When_Calling_A_Server_Via_The_Command_Processor() + [Test] + public async Task When_Calling_A_Server_Via_The_Command_Processor() { //start a message pump on a new thread, to recieve the Call message - Channel channel = new( - new("MyChannel"), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, TimeProvider.System, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - - var messagePump = new Reactor(_commandProcessor, (message) => typeof(MyRequest),_messageMapperRegistry, - new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel) - { Channel = channel, TimeOut = TimeSpan.FromMilliseconds(5000) }; - + Channel channel = new(new("MyChannel"), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, TimeProvider.System, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messagePump = new Reactor(_commandProcessor, (message) => typeof(MyRequest), _messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel) + { + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(5000) + }; //RunAsync the pump on a new thread Task.Factory.StartNew(() => messagePump.Run()); - _commandProcessor.Call(_myRequest, timeOut: TimeSpan.FromMilliseconds(500)); - - MyResponseHandler.ShouldReceive(new MyResponse(_myRequest.ReplyAddress) {Id = _myRequest.Id}); - + MyResponseHandler.ShouldReceive(new MyResponse(_myRequest.ReplyAddress) { Id = _myRequest.Id }); channel.Stop(_routingKey); - } - } -} + } +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Call/When_Calling_A_Server_Via_The_Command_Processor_With_No_In_Mapper.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Call/When_Calling_A_Server_Via_The_Command_Processor_With_No_In_Mapper.cs index bcc88d3a45..fb64bdeebc 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Call/When_Calling_A_Server_Via_The_Command_Processor_With_No_In_Mapper.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Call/When_Calling_A_Server_Via_The_Command_Processor_With_No_In_Mapper.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Transactions; using Microsoft.Extensions.Time.Testing; @@ -7,7 +7,6 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Call { @@ -15,67 +14,29 @@ public class CommandProcessorNoInMapperTests { private readonly CommandProcessor _commandProcessor; private readonly MyRequest _myRequest = new MyRequest(); - public CommandProcessorNoInMapperTests() { - _myRequest.RequestValue = "Hello World"; - + _myRequest.RequestValue = "Hello World"; var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyRequestMessageMapper()), null); - messageMapperRegistry.Register(); - var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.Register(); var handlerFactory = new SimpleHandlerFactorySync(_ => new MyResponseHandler()); - var timeProvider = new FakeTimeProvider(); var routingKey = new RoutingKey("MyRequest"); - - var producerRegistry = new ProducerRegistry(new Dictionary - { - { - routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication{Topic = routingKey, RequestType = typeof(MyRequest)}) - }, - }); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyRequest) }) }, }); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(); - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - new InMemoryOutbox( timeProvider) {Tracer = tracer} - ); - - _commandProcessor = new CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - replySubscriptions:new List(), - responseChannelFactory: new InMemoryChannelFactory(new InternalBus(), TimeProvider.System), - requestSchedulerFactory: new InMemorySchedulerFactory() - ); - - PipelineBuilder.ClearPipelineCache(); + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), new InMemoryOutbox(timeProvider) { Tracer = tracer }); + _commandProcessor = new CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, replySubscriptions: new List(), responseChannelFactory: new InMemoryChannelFactory(new InternalBus(), TimeProvider.System), requestSchedulerFactory: new InMemorySchedulerFactory()); } - [Fact] - public void When_Calling_A_Server_Via_The_Command_Processor_With_No_Out_Mapper() + [Test] + public async Task When_Calling_A_Server_Via_The_Command_Processor_With_No_Out_Mapper() { var exception = Catch.Exception(() => _commandProcessor.Call(_myRequest, new RequestContext(), TimeSpan.FromMilliseconds(500))); - //should throw an exception as we require a mapper for the outgoing request - Assert.IsType(exception); + await Assert.That(exception).IsTypeOf(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Call/When_Calling_A_Server_Via_The_Command_Processor_With_No_Out_Mapper.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Call/When_Calling_A_Server_Via_The_Command_Processor_With_No_Out_Mapper.cs index 8b1308d5de..edacaea1e5 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Call/When_Calling_A_Server_Via_The_Command_Processor_With_No_Out_Mapper.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Call/When_Calling_A_Server_Via_The_Command_Processor_With_No_Out_Mapper.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Transactions; using Microsoft.Extensions.Time.Testing; @@ -9,7 +9,6 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Call { @@ -17,67 +16,33 @@ public class CommandProcessorMissingOutMapperTests { private readonly CommandProcessor _commandProcessor; private readonly MyRequest _myRequest = new MyRequest(); - public CommandProcessorMissingOutMapperTests() { - _myRequest.RequestValue = "Hello World"; - + _myRequest.RequestValue = "Hello World"; var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyResponseMessageMapper()), null); - messageMapperRegistry.Register(); - var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.Register(); var handlerFactory = new SimpleHandlerFactorySync(_ => new MyResponseHandler()); - var replySubs = new List { new Subscription() }; - var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); - var timeProvider = new FakeTimeProvider(); var routingKey = new RoutingKey("MyRequest"); - var producerRegistry = new ProducerRegistry(new Dictionary - { - { routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication{Topic =routingKey } ) }, - }); - + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication { Topic = routingKey }) }, }); var tracer = new BrighterTracer(timeProvider); - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - new InMemoryOutbox(timeProvider){Tracer = tracer} - ); - - _commandProcessor = new CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - replySubscriptions:replySubs, - responseChannelFactory: new InMemoryChannelFactory(new InternalBus(), TimeProvider.System), - requestSchedulerFactory: new InMemorySchedulerFactory() - ); - - PipelineBuilder.ClearPipelineCache(); + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), new InMemoryOutbox(timeProvider) { Tracer = tracer }); + _commandProcessor = new CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, replySubscriptions: replySubs, responseChannelFactory: new InMemoryChannelFactory(new InternalBus(), TimeProvider.System), requestSchedulerFactory: new InMemorySchedulerFactory()); } - [Fact] - public void When_Calling_A_Server_Via_The_Command_Processor_With_No_Out_Mapper() + [Test] + public async Task When_Calling_A_Server_Via_The_Command_Processor_With_No_Out_Mapper() { var exception = Catch.Exception(() => _commandProcessor.Call(_myRequest, timeOut: TimeSpan.FromMilliseconds(500))); - //should throw an exception as we require a mapper for the outgoing request - Assert.IsType(exception); + await Assert.That(exception).IsTypeOf(); } - } -} + } +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Call/When_Calling_A_Server_Via_The_Command_Processor_With_No_Timeout.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Call/When_Calling_A_Server_Via_The_Command_Processor_With_No_Timeout.cs index af3ac787d7..f8b5456702 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Call/When_Calling_A_Server_Via_The_Command_Processor_With_No_Timeout.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Call/When_Calling_A_Server_Via_The_Command_Processor_With_No_Timeout.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Transactions; using Microsoft.Extensions.Time.Testing; @@ -7,7 +7,6 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Call { @@ -15,84 +14,42 @@ public class CommandProcessorCallTestsNoTimeout { private readonly CommandProcessor _commandProcessor; private readonly MyRequest _myRequest = new(); - public CommandProcessorCallTestsNoTimeout() { _myRequest.RequestValue = "Hello World"; - var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((type) => { if (type == typeof(MyRequestMessageMapper)) return new MyRequestMessageMapper(); if (type == typeof(MyResponseMessageMapper)) return new MyResponseMessageMapper(); - throw new ConfigurationException($"No mapper found for {type.Name}"); }), null); - messageMapperRegistry.Register(); messageMapperRegistry.Register(); - var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.Register(); var handlerFactory = new SimpleHandlerFactorySync(_ => new MyResponseHandler()); - var replySubs = new List { new Subscription() }; - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); const string topic = "MyRequest"; var routingKey = new RoutingKey(topic); var fakeTimeProvider = new FakeTimeProvider(); - - var producerRegistry = new ProducerRegistry(new Dictionary - { - { - routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication {Topic = routingKey, RequestType = typeof(MyRequest)}) - } - }); - + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyRequest) }) } }); var tracer = new BrighterTracer(fakeTimeProvider); - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - new InMemoryOutbox( fakeTimeProvider) {Tracer = tracer} - ); - - _commandProcessor = new CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - replySubscriptions:replySubs, - responseChannelFactory: new InMemoryChannelFactory(new InternalBus(), TimeProvider.System), - requestSchedulerFactory: new InMemorySchedulerFactory() - ); - - PipelineBuilder.ClearPipelineCache(); + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), new InMemoryOutbox(fakeTimeProvider) { Tracer = tracer }); + _commandProcessor = new CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, replySubscriptions: replySubs, responseChannelFactory: new InMemoryChannelFactory(new InternalBus(), TimeProvider.System), requestSchedulerFactory: new InMemorySchedulerFactory()); } - - [Fact] - public void When_Calling_A_Server_Via_The_Command_Processor_With_No_Timeout() + [Test] + public async Task When_Calling_A_Server_Via_The_Command_Processor_With_No_Timeout() { - var exception = Catch.Exception(() => _commandProcessor.Call( - _myRequest, timeOut: TimeSpan.FromMilliseconds(0)) - ); - + var exception = Catch.Exception(() => _commandProcessor.Call(_myRequest, timeOut: TimeSpan.FromMilliseconds(0))); //should throw an exception as we require a timeout to be set - Assert.IsType(exception); + await Assert.That(exception).IsTypeOf(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Clear/When_Bulk_Clearing_The_PostBox_On_The_Command_Processor_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Clear/When_Bulk_Clearing_The_PostBox_On_The_Command_Processor_Async.cs index 470d0b9eec..157aba8cb5 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Clear/When_Bulk_Clearing_The_PostBox_On_The_Command_Processor_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Clear/When_Bulk_Clearing_The_PostBox_On_The_Command_Processor_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -10,7 +10,6 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Clear { @@ -22,98 +21,59 @@ public class CommandProcessorPostBoxBulkClearAsyncTests private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); private readonly IAmAnOutboxProducerMediator _mediator; - public CommandProcessorPostBoxBulkClearAsyncTests() { - var myCommand = new MyCommand{ Value = "Hello World"}; - var myCommand2 = new MyCommand { Value = "Hello World 2" }; - + var myCommand = new MyCommand + { + Value = "Hello World" + }; + var myCommand2 = new MyCommand + { + Value = "Hello World 2" + }; var timeProvider = new FakeTimeProvider(); - var routingKey = new RoutingKey("MyCommand"); - - InMemoryMessageProducer messageProducer = new(_internalBus, new Publication{Topic = routingKey, RequestType = typeof(MyCommand)}); - - var routingKeyTwo = new RoutingKey("MyCommand2"); - InMemoryMessageProducer messageProducerTwo = new(_internalBus, new Publication {Topic = routingKeyTwo, RequestType = typeof(MyCommand)}); - - _messageOne = new Message( - new MessageHeader(myCommand.Id, routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(myCommand, JsonSerialisationOptions.Options)) - ); - - _messageTwo = new Message( - new MessageHeader(myCommand.Id, routingKeyTwo, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(myCommand2, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), - null); + InMemoryMessageProducer messageProducer = new(_internalBus, new Publication { Topic = routingKey, RequestType = typeof(MyCommand) }); + var routingKeyTwo = new RoutingKey("MyCommand2"); + InMemoryMessageProducer messageProducerTwo = new(_internalBus, new Publication { Topic = routingKeyTwo, RequestType = typeof(MyCommand) }); + _messageOne = new Message(new MessageHeader(myCommand.Id, routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(myCommand, JsonSerialisationOptions.Options))); + _messageTwo = new Message(new MessageHeader(myCommand.Id, routingKeyTwo, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(myCommand2, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - - var producerRegistry = new ProducerRegistry(new Dictionary - { - { routingKey, messageProducer }, - { routingKeyTwo, messageProducerTwo } - }); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, messageProducer }, { routingKeyTwo, messageProducerTwo } }); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(); - _outbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - - _mediator = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox - ); - - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - _mediator, - requestSchedulerFactory: new InMemorySchedulerFactory() - ); + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + _mediator = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, _mediator, requestSchedulerFactory: new InMemorySchedulerFactory()); } - - [Fact(Skip = "Erratic due to timing")] + [Test, Skip("Erratic due to timing")] public async Task When_Clearing_The_PostBox_On_The_Command_Processor_Async() { var context = new RequestContext(); await _outbox.AddAsync(_messageOne, context); await _outbox.AddAsync(_messageTwo, context); - await _mediator.ClearOutstandingFromOutboxAsync(2, TimeSpan.FromMilliseconds(1), true, context); - await Task.Delay(3000); - //_should_send_a_message_via_the_messaging_gateway var routingKeyOne = new RoutingKey(_messageOne.Header.Topic); - Assert.True(_internalBus.Stream(routingKeyOne).Any()); - + await Assert.That(_internalBus.Stream(routingKeyOne).Any()).IsTrue(); var sentMessage = _internalBus.Dequeue(routingKeyOne); - Assert.NotNull(sentMessage); - Assert.Equal(_messageOne.Id, sentMessage.Id); - Assert.Equal(_messageOne.Header.Topic, sentMessage.Header.Topic); - Assert.Equal(_messageOne.Body.Value, sentMessage.Body.Value); - + await Assert.That(sentMessage).IsNotNull(); + await Assert.That(sentMessage.Id).IsEqualTo(_messageOne.Id); + await Assert.That(sentMessage.Header.Topic).IsEqualTo(_messageOne.Header.Topic); + await Assert.That(sentMessage.Body.Value).IsEqualTo(_messageOne.Body.Value); var routingKeyTwo = new RoutingKey(_messageTwo.Header.Topic); - Assert.True(_internalBus.Stream(routingKeyOne).Any()); - + await Assert.That(_internalBus.Stream(routingKeyOne).Any()).IsTrue(); var sentMessage2 = _internalBus.Dequeue(routingKeyTwo); - Assert.NotNull(sentMessage2); - Assert.Equal(_messageTwo.Id, sentMessage2.Id); - Assert.Equal(_messageTwo.Header.Topic, sentMessage2.Header.Topic); - Assert.Equal(_messageTwo.Body.Value, sentMessage2.Body.Value); + await Assert.That(sentMessage2).IsNotNull(); + await Assert.That(sentMessage2.Id).IsEqualTo(_messageTwo.Id); + await Assert.That(sentMessage2.Header.Topic).IsEqualTo(_messageTwo.Header.Topic); + await Assert.That(sentMessage2.Body.Value).IsEqualTo(_messageTwo.Body.Value); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Clear/When_Clearing_The_PostBox_On_The_Command_Processor _Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Clear/When_Clearing_The_PostBox_On_The_Command_Processor _Async.cs index 6494358ee6..c20ac35516 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Clear/When_Clearing_The_PostBox_On_The_Command_Processor _Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Clear/When_Clearing_The_PostBox_On_The_Command_Processor _Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -10,7 +10,6 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Clear { @@ -21,77 +20,42 @@ public class CommandProcessorPostBoxClearAsyncTests private readonly Message _message; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); - public CommandProcessorPostBoxClearAsyncTests() { - var myCommand = new MyCommand{ Value = "Hello World"}; - + var myCommand = new MyCommand + { + Value = "Hello World" + }; var timeProvider = new FakeTimeProvider(); InMemoryMessageProducer messageProducer = new(_internalBus, new Publication { Topic = _routingKey, RequestType = typeof(MyCommand) }); - - _message = new Message( - new MessageHeader(myCommand.Id, _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(myCommand, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), - null); + _message = new Message(new MessageHeader(myCommand.Id, _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(myCommand, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - - var producerRegistry = - new ProducerRegistry(new Dictionary - { - { _routingKey, messageProducer }, - }); - - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var producerRegistry = new ProducerRegistry(new Dictionary { { _routingKey, messageProducer }, }); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(timeProvider); - _outbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox - ); - - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - requestSchedulerFactory: new InMemorySchedulerFactory() - ); - - PipelineBuilder.ClearPipelineCache(); + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, requestSchedulerFactory: new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task When_Clearing_The_PostBox_On_The_Command_Processor_Async() { var context = new RequestContext(); await _outbox.AddAsync(_message, context); - - await _commandProcessor.ClearOutboxAsync(new []{_message.Id}); - + await _commandProcessor.ClearOutboxAsync(new[] { _message.Id }); //_should_send_a_message_via_the_messaging_gateway var topic = new RoutingKey(_routingKey); - - Assert.True(_internalBus.Stream(topic).Any()); - + await Assert.That(_internalBus.Stream(topic).Any()).IsTrue(); var sentMessage = _internalBus.Dequeue(topic); - Assert.NotNull(sentMessage); - Assert.Equal(_message.Id, sentMessage.Id); - Assert.Equal(_message.Header.Topic, sentMessage.Header.Topic); - Assert.Equal(_message.Body.Value, sentMessage.Body.Value); + await Assert.That(sentMessage).IsNotNull(); + await Assert.That(sentMessage.Id).IsEqualTo(_message.Id); + await Assert.That(sentMessage.Header.Topic).IsEqualTo(_message.Header.Topic); + await Assert.That(sentMessage.Body.Value).IsEqualTo(_message.Body.Value); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Clear/When_Clearing_The_PostBox_On_The_Command_Processor.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Clear/When_Clearing_The_PostBox_On_The_Command_Processor.cs index e47257b400..67e3e10c0d 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Clear/When_Clearing_The_PostBox_On_The_Command_Processor.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Clear/When_Clearing_The_PostBox_On_The_Command_Processor.cs @@ -1,10 +1,8 @@ -#region Licence +#region Licence /* The MIT License (MIT) ... */ - #endregion - using System; using System.Collections.Generic; using System.Linq; @@ -17,7 +15,6 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Clear { @@ -28,88 +25,56 @@ public class CommandProcessorPostBoxClearTests private readonly Message _message; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); - public CommandProcessorPostBoxClearTests() { - var myCommand = new MyCommand{ Value = "Hello World"}; - + var myCommand = new MyCommand + { + Value = "Hello World" + }; var timeProvider = new FakeTimeProvider(); InMemoryMessageProducer messageProducer = new(_internalBus, new Publication { Topic = _routingKey, RequestType = typeof(MyCommand) }); - - _message = new Message( - new MessageHeader(myCommand.Id, _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(myCommand, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), - null); + _message = new Message(new MessageHeader(myCommand.Id, _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(myCommand, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - - var retryPolicy = Policy - .Handle() - .Retry(); - - var circuitBreakerPolicy = Policy - .Handle() - .CircuitBreaker(1, TimeSpan.FromMilliseconds(1)); - - var producerRegistry = - new ProducerRegistry(new Dictionary - { - { _routingKey, messageProducer }, - }); - + var retryPolicy = Policy.Handle().Retry(); + var circuitBreakerPolicy = Policy.Handle().CircuitBreaker(1, TimeSpan.FromMilliseconds(1)); + var producerRegistry = new ProducerRegistry(new Dictionary { { _routingKey, messageProducer }, }); var policyRegistry = new PolicyRegistry { - { CommandProcessor.RETRYPOLICY, retryPolicy }, - { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy } + { + CommandProcessor.RETRYPOLICY, + retryPolicy + }, + { + CommandProcessor.CIRCUITBREAKER, + circuitBreakerPolicy + } }; - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(timeProvider); - _outbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox - ); - - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - policyRegistry, - resiliencePipelineRegistry, - bus, - requestSchedulerFactory: new InMemorySchedulerFactory() - ); + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), policyRegistry, resiliencePipelineRegistry, bus, requestSchedulerFactory: new InMemorySchedulerFactory()); } - [Fact] - public void When_Clearing_The_PostBox_On_The_Command_Processor() + [Test] + public async Task When_Clearing_The_PostBox_On_The_Command_Processor() { //arrange var context = new RequestContext(); - _outbox.Add(_message, context); - - _commandProcessor.ClearOutbox(new []{_message.Id}); - + await _outbox.AddAsync(_message, context); + _commandProcessor.ClearOutbox(new[] { _message.Id }); //_should_send_a_message_via_the_messaging_gateway var topic = new RoutingKey(_routingKey); - Assert.True(_internalBus.Stream(topic).Any()); - + await Assert.That(_internalBus.Stream(topic).Any()).IsTrue(); var sentMessage = _internalBus.Dequeue(topic); - Assert.NotNull(sentMessage); - Assert.Equal(_message.Id, sentMessage.Id); - Assert.Equal(_message.Header.Topic, sentMessage.Header.Topic); - Assert.Equal(_message.Body.Value, sentMessage.Body.Value); + await Assert.That(sentMessage).IsNotNull(); + await Assert.That(sentMessage.Id).IsEqualTo(_message.Id); + await Assert.That(sentMessage.Header.Topic).IsEqualTo(_message.Header.Topic); + await Assert.That(sentMessage.Body.Value).IsEqualTo(_message.Body.Value); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Clear/When_Implicit_Clearing_The_PostBox_On_The_Command_Processor.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Clear/When_Implicit_Clearing_The_PostBox_On_The_Command_Processor.cs index 4ee4fd64ac..14f618a830 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Clear/When_Implicit_Clearing_The_PostBox_On_The_Command_Processor.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Clear/When_Implicit_Clearing_The_PostBox_On_The_Command_Processor.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -11,7 +11,6 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Clear { @@ -24,69 +23,36 @@ public class CommandProcessorPostBoxImplicitClearTests private readonly InMemoryOutbox _outbox; private readonly InternalBus _bus = new(); private readonly IAmAnOutboxProducerMediator _mediator; - public CommandProcessorPostBoxImplicitClearTests() { - var myCommand = new MyCommand{ Value = "Hello World"}; - + var myCommand = new MyCommand + { + Value = "Hello World" + }; var timeProvider = new FakeTimeProvider(); InMemoryMessageProducer messageProducer = new(_bus, new Publication { Topic = new RoutingKey(Topic), RequestType = typeof(MyCommand) }); - - _message = new Message( - new MessageHeader(myCommand.Id, Topic, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(myCommand, JsonSerialisationOptions.Options)) - ); - - _message2 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), Topic, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(myCommand, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), - null); + _message = new Message(new MessageHeader(myCommand.Id, Topic, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(myCommand, JsonSerialisationOptions.Options))); + _message2 = new Message(new MessageHeader(Guid.NewGuid().ToString(), Topic, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(myCommand, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - - var producerRegistry = new ProducerRegistry(new Dictionary - { - { Topic, messageProducer }, - }); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var producerRegistry = new ProducerRegistry(new Dictionary { { Topic, messageProducer }, }); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(); - _outbox = new InMemoryOutbox(timeProvider){Tracer = tracer}; - - _mediator = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox - ); - - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - _mediator, - requestSchedulerFactory: new InMemorySchedulerFactory() - ); + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + _mediator = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, _mediator, requestSchedulerFactory: new InMemorySchedulerFactory()); } - [Fact(Skip = "Erratic due to timing")] + [Test, Skip("Erratic due to timing")] public async Task When_Implicit_Clearing_The_PostBox_On_The_Command_Processor() { var context = new RequestContext(); - _outbox.Add(_message, context); - _outbox.Add(_message2, context); - - await _mediator.ClearOutstandingFromOutboxAsync(1,TimeSpan.Zero, true, context); - + await _outbox.AddAsync(_message, context); + await _outbox.AddAsync(_message2, context); + await _mediator.ClearOutstandingFromOutboxAsync(1, TimeSpan.Zero, true, context); var topic = new RoutingKey(Topic); for (var i = 1; i <= 10; i++) { @@ -105,19 +71,17 @@ public async Task When_Implicit_Clearing_The_PostBox_On_The_Command_Processor() } //_should_send_a_message_via_the_messaging_gateway - Assert.True(_bus.Stream(topic).Any()); - + await Assert.That(_bus.Stream(topic).Any()).IsTrue(); var sentMessage = _bus.Stream(topic).FirstOrDefault(m => m.Id == _message.Id); - Assert.NotNull(sentMessage); - Assert.Equal(_message.Id, sentMessage.Id); - Assert.Equal(_message.Header.Topic, sentMessage.Header.Topic); - Assert.Equal(_message.Body.Value, sentMessage.Body.Value); - + await Assert.That(sentMessage).IsNotNull(); + await Assert.That(sentMessage.Id).IsEqualTo(_message.Id); + await Assert.That(sentMessage.Header.Topic).IsEqualTo(_message.Header.Topic); + await Assert.That(sentMessage.Body.Value).IsEqualTo(_message.Body.Value); var sentMessage2 = _bus.Stream(topic).FirstOrDefault(m => m.Id == _message2.Id); - Assert.NotNull(sentMessage2); - Assert.Equal(_message2.Id, sentMessage2.Id); - Assert.Equal(_message2.Header.Topic, sentMessage2.Header.Topic); - Assert.Equal(_message2.Body.Value, sentMessage2.Body.Value); + await Assert.That(sentMessage2).IsNotNull(); + await Assert.That(sentMessage2.Id).IsEqualTo(_message2.Id); + await Assert.That(sentMessage2.Header.Topic).IsEqualTo(_message2.Header.Topic); + await Assert.That(sentMessage2.Body.Value).IsEqualTo(_message2.Body.Value); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Clear/When_Implicit_Clearing_The_PostBox_On_The_Command_Processor_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Clear/When_Implicit_Clearing_The_PostBox_On_The_Command_Processor_Async.cs index 9f0765b8a7..868eff3c4e 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Clear/When_Implicit_Clearing_The_PostBox_On_The_Command_Processor_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Clear/When_Implicit_Clearing_The_PostBox_On_The_Command_Processor_Async.cs @@ -1,10 +1,8 @@ -#region Licence +#region Licence /* The MIT License (MIT) ... */ - #endregion - using System; using System.Collections.Generic; using System.Linq; @@ -17,7 +15,6 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Clear { @@ -30,77 +27,40 @@ public class CommandProcessorPostBoxImplicitClearAsyncTests private readonly InternalBus _bus = new(); private readonly RoutingKey _routingKey = new("MyCommand"); private readonly IAmAnOutboxProducerMediator _mediator; - public CommandProcessorPostBoxImplicitClearAsyncTests() { - var myCommand = new MyCommand{ Value = "Hello World"}; - + var myCommand = new MyCommand + { + Value = "Hello World" + }; var timeProvider = new FakeTimeProvider(); - - InMemoryMessageProducer messageProducer = new(_bus, new Publication{Topic = _routingKey, RequestType = typeof(MyCommand)}); - - _message = new Message( - new MessageHeader(myCommand.Id, _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(myCommand, JsonSerialisationOptions.Options)) - ); - - _message2 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(myCommand, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), - null); + InMemoryMessageProducer messageProducer = new(_bus, new Publication { Topic = _routingKey, RequestType = typeof(MyCommand) }); + _message = new Message(new MessageHeader(myCommand.Id, _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(myCommand, JsonSerialisationOptions.Options))); + _message2 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(myCommand, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - - var producerRegistry = new ProducerRegistry(new Dictionary - { - { _routingKey, messageProducer }, - }); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var producerRegistry = new ProducerRegistry(new Dictionary { { _routingKey, messageProducer }, }); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); _outbox = new InMemoryOutbox(timeProvider); - - _mediator = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - new BrighterTracer(timeProvider), - new FindPublicationByPublicationTopicOrRequestType(), - _outbox - ); - - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - _mediator, - requestSchedulerFactory: new InMemorySchedulerFactory() - ); + _mediator = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), new BrighterTracer(timeProvider), new FindPublicationByPublicationTopicOrRequestType(), _outbox); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, _mediator, requestSchedulerFactory: new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task When_Implicit_Clearing_The_PostBox_On_The_Command_Processor_Async() { var context = new RequestContext(); await _outbox.AddAsync(_message, context); await _outbox.AddAsync(_message2, context); - - await _mediator.ClearOutstandingFromOutboxAsync(1,TimeSpan.Zero, true, context); - + await _mediator.ClearOutstandingFromOutboxAsync(1, TimeSpan.Zero, true, context); for (var i = 1; i <= 10; i++) { - if (_bus.Stream(_routingKey).Count() == 1) break; + if (_bus.Stream(_routingKey).Count() == 1) + break; await Task.Delay(i * 100); } await _mediator.ClearOutstandingFromOutboxAsync(1, TimeSpan.Zero, true, context); - //Try again and kick off another background thread for (var i = 1; i <= 10; i++) { @@ -112,19 +72,17 @@ public async Task When_Implicit_Clearing_The_PostBox_On_The_Command_Processor_As //_should_send_a_message_via_the_messaging_gateway var messages = _bus.Stream(_routingKey).ToArray(); - Assert.True(messages.Any()); - + await Assert.That(messages.Any()).IsTrue(); var sentMessage = messages.FirstOrDefault(m => m.Id == _message.Id); - Assert.NotNull(sentMessage); - Assert.Equal(_message.Id, sentMessage.Id); - Assert.Equal(_message.Header.Topic, sentMessage.Header.Topic); - Assert.Equal(_message.Body.Value, sentMessage.Body.Value); - + await Assert.That(sentMessage).IsNotNull(); + await Assert.That(sentMessage.Id).IsEqualTo(_message.Id); + await Assert.That(sentMessage.Header.Topic).IsEqualTo(_message.Header.Topic); + await Assert.That(sentMessage.Body.Value).IsEqualTo(_message.Body.Value); var sentMessage2 = messages.FirstOrDefault(m => m.Id == _message2.Id); - Assert.NotNull(sentMessage2); - Assert.Equal(_message2.Id, sentMessage2.Id); - Assert.Equal(_message2.Header.Topic, sentMessage2.Header.Topic); - Assert.Equal(_message2.Body.Value, sentMessage2.Body.Value); + await Assert.That(sentMessage2).IsNotNull(); + await Assert.That(sentMessage2.Id).IsEqualTo(_message2.Id); + await Assert.That(sentMessage2.Header.Topic).IsEqualTo(_message2.Header.Topic); + await Assert.That(sentMessage2.Body.Value).IsEqualTo(_message2.Body.Value); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Context/When_Putting_A_Variable_Into_The_Bag_Should_Be_Accessible_In_The_Handler.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Context/When_Putting_A_Variable_Into_The_Bag_Should_Be_Accessible_In_The_Handler.cs index ed474f221b..bb852df526 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Context/When_Putting_A_Variable_Into_The_Bag_Should_Be_Accessible_In_The_Handler.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Context/When_Putting_A_Variable_Into_The_Bag_Should_Be_Accessible_In_The_Handler.cs @@ -1,7 +1,6 @@ -using System; +using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Context { @@ -10,29 +9,25 @@ public class ContextBagVisibilityTests private const string I_AM_A_TEST_OF_THE_CONTEXT_BAG = "I am a test of the context bag"; private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand; - + private readonly MyContextAwareCommandHandler _handler; public ContextBagVisibilityTests() { var registry = new SubscriberRegistry(); registry.Register(); - var handlerFactory = new SimpleHandlerFactorySync(_ => new MyContextAwareCommandHandler()); + _handler = new MyContextAwareCommandHandler(); + var handlerFactory = new SimpleHandlerFactorySync(_ => _handler); _myCommand = new MyCommand(); - MyContextAwareCommandHandler.TestString = null; - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_Putting_A_Variable_Into_The_Bag_Should_Be_Accessible_In_The_Handler() + [Test] + public async Task When_Putting_A_Variable_Into_The_Bag_Should_Be_Accessible_In_The_Handler() { var requestContext = new RequestContext(); requestContext.Bag["TestString"] = I_AM_A_TEST_OF_THE_CONTEXT_BAG; - _commandProcessor.Send(_myCommand, requestContext); - - Assert.Equal(I_AM_A_TEST_OF_THE_CONTEXT_BAG, MyContextAwareCommandHandler.TestString); - Assert.Equal("I was called and set the context", requestContext.Bag["MyContextAwareCommandHandler"]); + await Assert.That(_handler.TestString).IsEqualTo(I_AM_A_TEST_OF_THE_CONTEXT_BAG); + await Assert.That(requestContext.Bag["MyContextAwareCommandHandler"]).IsEqualTo("I was called and set the context"); } } } diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_Store.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_Store.cs index 265acf2370..df0de47a4b 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_Store.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_Store.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -9,93 +9,55 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Deposit { public class CommandProcessorDepositPostTests { private readonly RoutingKey _routingKey = new("MyCommand"); - private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private readonly Message _message; private readonly InMemoryOutbox _fakeOutbox; private readonly InternalBus _internalBus = new(); - public CommandProcessorDepositPostTests() { _myCommand.Value = "Hello World"; - var timeProvider = new FakeTimeProvider(); - InMemoryMessageProducer messageProducer = new(_internalBus, new Publication {Topic = _routingKey, RequestType = typeof(MyCommand)}); - - _message = new Message( - new MessageHeader(_myCommand.Id, _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), - null); + InMemoryMessageProducer messageProducer = new(_internalBus, new Publication { Topic = _routingKey, RequestType = typeof(MyCommand) }); + _message = new Message(new MessageHeader(_myCommand.Id, _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - - var producerRegistry = - new ProducerRegistry(new Dictionary - { - { _routingKey, messageProducer }, - }); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var producerRegistry = new ProducerRegistry(new Dictionary { { _routingKey, messageProducer }, }); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(); - _fakeOutbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _fakeOutbox - ); - - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - requestSchedulerFactory: new InMemorySchedulerFactory() - ); + _fakeOutbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _fakeOutbox); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, requestSchedulerFactory: new InMemorySchedulerFactory()); } - - [Fact] - public void When_depositing_a_message_in_the_outbox() + [Test] + public async Task When_depositing_a_message_in_the_outbox() { //act var postedMessageId = _commandProcessor.DepositPost(_myCommand); var context = new RequestContext(); - //assert - //message should not be posted - Assert.False(_internalBus.Stream(new RoutingKey(_routingKey)).Any()); - + await Assert.That(_internalBus.Stream(new RoutingKey(_routingKey)).Any()).IsFalse(); //message should correspond to the command - var depositedPost = _fakeOutbox.Get(postedMessageId, context); - Assert.Equal(_message.Id, depositedPost.Id); - Assert.Equal(_message.Body.Value, depositedPost.Body.Value); - Assert.Equal(_message.Header.Topic, depositedPost.Header.Topic); - Assert.Equal(_message.Header.MessageType, depositedPost.Header.MessageType); - + var depositedPost = await _fakeOutbox.GetAsync(postedMessageId, context); + await Assert.That(depositedPost.Id).IsEqualTo(_message.Id); + await Assert.That(depositedPost.Body.Value).IsEqualTo(_message.Body.Value); + await Assert.That(depositedPost.Header.Topic).IsEqualTo(_message.Header.Topic); + await Assert.That(depositedPost.Header.MessageType).IsEqualTo(_message.Header.MessageType); //message should be marked as outstanding if not sent - var outstandingMessages = _fakeOutbox.OutstandingMessages(TimeSpan.Zero, context); + var outstandingMessages = await _fakeOutbox.OutstandingMessagesAsync(TimeSpan.Zero, context); var outstandingMessage = outstandingMessages.Single(); - Assert.Equal(_message.Id, outstandingMessage.Id); + await Assert.That(outstandingMessage.Id).IsEqualTo(_message.Id); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_StoreAsync.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_StoreAsync.cs index d52acd365e..673ad82511 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_StoreAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_StoreAsync.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -10,97 +10,57 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Deposit { public class CommandProcessorDepositPostTestsAsync { private readonly RoutingKey _routingKey = new("MyCommand"); - private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private readonly Message _message; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); - public CommandProcessorDepositPostTestsAsync() { _myCommand.Value = "Hello World"; - var timeProvider = new FakeTimeProvider(); - InMemoryMessageProducer messageProducer = new(_internalBus, new Publication{ Topic = _routingKey, RequestType = typeof(MyCommand) }); - - _message = new Message( - new MessageHeader(_myCommand.Id, _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyCommandMessageMapperAsync()) - ); + InMemoryMessageProducer messageProducer = new(_internalBus, new Publication { Topic = _routingKey, RequestType = typeof(MyCommand) }); + _message = new Message(new MessageHeader(_myCommand.Id, _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyCommandMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - var producerRegistry = new ProducerRegistry(new Dictionary - { - { _routingKey, messageProducer }, - }); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var producerRegistry = new ProducerRegistry(new Dictionary { { _routingKey, messageProducer }, }); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(); - _outbox = new InMemoryOutbox(timeProvider) { Tracer = tracer }; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox - ); - - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - new InMemorySchedulerFactory() - ); + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task When_depositing_a_message_in_the_outbox_async() { //act await _commandProcessor.DepositPostAsync(_myCommand); - var context = new RequestContext(); - + var context = new RequestContext(); //assert //message should not be posted - Assert.False(_internalBus.Stream(_routingKey).Any()); - + await Assert.That(_internalBus.Stream(_routingKey).Any()).IsFalse(); //message should be in the store - var depositedPost = _outbox - .OutstandingMessages(TimeSpan.Zero, context) - .SingleOrDefault(msg => msg.Id == _message.Id); - - Assert.NotNull(depositedPost); - + var depositedPost = (await _outbox.OutstandingMessagesAsync(TimeSpan.Zero, context)).SingleOrDefault(msg => msg.Id == _message.Id); + await Assert.That(depositedPost).IsNotNull(); //message should correspond to the command - Assert.Equal(_message.Id, depositedPost.Id); - Assert.Equal(_message.Body.Value, depositedPost.Body.Value); - Assert.Equal(_message.Header.Topic, depositedPost.Header.Topic); - Assert.Equal(_message.Header.MessageType, depositedPost.Header.MessageType); - + await Assert.That(depositedPost.Id).IsEqualTo(_message.Id); + await Assert.That(depositedPost.Body.Value).IsEqualTo(_message.Body.Value); + await Assert.That(depositedPost.Header.Topic).IsEqualTo(_message.Header.Topic); + await Assert.That(depositedPost.Header.MessageType).IsEqualTo(_message.Header.MessageType); //message should be marked as outstanding if not sent var outstandingMessages = await _outbox.OutstandingMessagesAsync(TimeSpan.Zero, context); var outstandingMessage = outstandingMessages.Single(); - Assert.Equal(_message.Id, outstandingMessage.Id); + await Assert.That(outstandingMessage.Id).IsEqualTo(_message.Id); } - } -} + } +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_StoreAsync_Bulk.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_StoreAsync_Bulk.cs index ed33901936..79316e63ec 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_StoreAsync_Bulk.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_StoreAsync_Bulk.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -11,7 +11,6 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Deposit { @@ -19,7 +18,6 @@ public class CommandProcessorBulkDepositPostTestsAsync { private readonly RoutingKey _commandTopic = new("MyCommand"); private readonly RoutingKey _eventTopic = new("MyEvent"); - private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new(); private readonly MyCommand _myCommand2 = new(); @@ -29,136 +27,76 @@ public class CommandProcessorBulkDepositPostTestsAsync private readonly Message _message3; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); - public CommandProcessorBulkDepositPostTestsAsync() { _myCommand.Value = "Hello World"; _myCommand2.Value = "Update World"; - var timeProvider = new FakeTimeProvider(); - - InMemoryMessageProducer commandMessageProducer = new(_internalBus, new Publication - { - Topic = new RoutingKey(_commandTopic), - RequestType = typeof(MyCommand) - } ); - - InMemoryMessageProducer eventMessageProducer = new(_internalBus, new Publication - { - Topic = new RoutingKey(_eventTopic), - RequestType = typeof(MyEvent) - }); - - _message = new Message( - new MessageHeader(_myCommand.Id, _commandTopic, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - _message2 = new Message( - new MessageHeader(_myCommand2.Id, _commandTopic, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommand2, JsonSerialisationOptions.Options)) - ); - - _message3 = new Message( - new MessageHeader(_myEvent.Id, _eventTopic, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize(_myEvent, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((type) => + InMemoryMessageProducer commandMessageProducer = new(_internalBus, new Publication { Topic = new RoutingKey(_commandTopic), RequestType = typeof(MyCommand) }); + InMemoryMessageProducer eventMessageProducer = new(_internalBus, new Publication { Topic = new RoutingKey(_eventTopic), RequestType = typeof(MyEvent) }); + _message = new Message(new MessageHeader(_myCommand.Id, _commandTopic, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + _message2 = new Message(new MessageHeader(_myCommand2.Id, _commandTopic, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommand2, JsonSerialisationOptions.Options))); + _message3 = new Message(new MessageHeader(_myEvent.Id, _eventTopic, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(_myEvent, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((type) => { if (type == typeof(MyCommandMessageMapperAsync)) return new MyCommandMessageMapperAsync(); - else + else return new MyEventMessageMapperAsync(); })); messageMapperRegistry.RegisterAsync(); messageMapperRegistry.RegisterAsync(); - - var producerRegistry = - new ProducerRegistry(new Dictionary - { - { _commandTopic, commandMessageProducer }, - { _eventTopic, eventMessageProducer } - }); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var producerRegistry = new ProducerRegistry(new Dictionary { { _commandTopic, commandMessageProducer }, { _eventTopic, eventMessageProducer } }); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(new FakeTimeProvider()); - _outbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox - ); - - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - new InMemorySchedulerFactory() - ); + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, new InMemorySchedulerFactory()); } - - [Fact] + [Test] public async Task When_depositing_messages_in_the_outbox_async() { //act var context = new RequestContext(); - var requests = new List {_myCommand, _myCommand2, _myEvent } ; + var requests = new List + { + _myCommand, + _myCommand2, + _myEvent + }; await _commandProcessor.DepositPostAsync(requests); - //assert //message should not be posted - Assert.False(_internalBus.Stream(new RoutingKey(_commandTopic)).Any()); - Assert.False(_internalBus.Stream(new RoutingKey(_eventTopic)).Any()); - + await Assert.That(_internalBus.Stream(new RoutingKey(_commandTopic)).Any()).IsFalse(); + await Assert.That(_internalBus.Stream(new RoutingKey(_eventTopic)).Any()).IsFalse(); //message should be in the store - var depositedPost = _outbox - .OutstandingMessages(TimeSpan.Zero, context) - .SingleOrDefault(msg => msg.Id == _message.Id); - + var depositedPost = (await _outbox.OutstandingMessagesAsync(TimeSpan.Zero, context)).SingleOrDefault(msg => msg.Id == _message.Id); //message should be in the store - var depositedPost2 = _outbox - .OutstandingMessages(TimeSpan.Zero, context) - .SingleOrDefault(msg => msg.Id == _message2.Id); - + var depositedPost2 = (await _outbox.OutstandingMessagesAsync(TimeSpan.Zero, context)).SingleOrDefault(msg => msg.Id == _message2.Id); //message should be in the store - var depositedPost3 = _outbox - .OutstandingMessages(TimeSpan.Zero, context) - .SingleOrDefault(msg => msg.Id == _message3.Id); - - Assert.NotNull(depositedPost); - + var depositedPost3 = (await _outbox.OutstandingMessagesAsync(TimeSpan.Zero, context)).SingleOrDefault(msg => msg.Id == _message3.Id); + await Assert.That(depositedPost).IsNotNull(); //message should correspond to the command - Assert.Equal(_message.Id, depositedPost.Id); - Assert.Equal(_message.Body.Value, depositedPost.Body.Value); - Assert.Equal(_message.Header.Topic, depositedPost.Header.Topic); - Assert.Equal(_message.Header.MessageType, depositedPost.Header.MessageType); - + await Assert.That(depositedPost.Id).IsEqualTo(_message.Id); + await Assert.That(depositedPost.Body.Value).IsEqualTo(_message.Body.Value); + await Assert.That(depositedPost.Header.Topic).IsEqualTo(_message.Header.Topic); + await Assert.That(depositedPost.Header.MessageType).IsEqualTo(_message.Header.MessageType); //message should correspond to the command - Assert.NotNull(depositedPost2); - Assert.Equal(_message2.Id, depositedPost2.Id); - Assert.Equal(_message2.Body.Value, depositedPost2.Body.Value); - Assert.Equal(_message2.Header.Topic, depositedPost2.Header.Topic); - Assert.Equal(_message2.Header.MessageType, depositedPost2.Header.MessageType); - + await Assert.That(depositedPost2).IsNotNull(); + await Assert.That(depositedPost2.Id).IsEqualTo(_message2.Id); + await Assert.That(depositedPost2.Body.Value).IsEqualTo(_message2.Body.Value); + await Assert.That(depositedPost2.Header.Topic).IsEqualTo(_message2.Header.Topic); + await Assert.That(depositedPost2.Header.MessageType).IsEqualTo(_message2.Header.MessageType); //message should correspond to the command - Assert.NotNull(depositedPost3); - Assert.Equal(_message3.Id, depositedPost3.Id); - Assert.Equal(_message3.Body.Value, depositedPost3.Body.Value); - Assert.Equal(_message3.Header.Topic, depositedPost3.Header.Topic); - Assert.Equal(_message3.Header.MessageType, depositedPost3.Header.MessageType); + await Assert.That(depositedPost3).IsNotNull(); + await Assert.That(depositedPost3.Id).IsEqualTo(_message3.Id); + await Assert.That(depositedPost3.Body.Value).IsEqualTo(_message3.Body.Value); + await Assert.That(depositedPost3.Header.Topic).IsEqualTo(_message3.Header.Topic); + await Assert.That(depositedPost3.Header.MessageType).IsEqualTo(_message3.Header.MessageType); } - } -} + } +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_StoreAsync_Bulk_With_Transaction.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_StoreAsync_Bulk_With_Transaction.cs index 1ad723c14e..fc32beb384 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_StoreAsync_Bulk_With_Transaction.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_StoreAsync_Bulk_With_Transaction.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -9,7 +9,6 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Deposit { @@ -17,7 +16,6 @@ public class CommandProcessorBulkDepositPostWithTransactionTestsAsync { private readonly RoutingKey _commandTopic = new("MyCommand"); private readonly RoutingKey _eventTopic = new("MyEvent"); - private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new(); private readonly MyCommand _myCommandTwo = new(); @@ -26,116 +24,67 @@ public class CommandProcessorBulkDepositPostWithTransactionTestsAsync private readonly SpyOutbox _spyOutbox; private readonly SpyTransactionProvider _transactionProvider = new(); private readonly InternalBus _bus = new(); - public CommandProcessorBulkDepositPostWithTransactionTestsAsync() { _myCommand.Value = "Hello World"; - var timeProvider = new FakeTimeProvider(); - InMemoryMessageProducer commandMessageProducer = new(_bus, new Publication - { - Topic = new RoutingKey(_commandTopic), - RequestType = typeof(MyCommand) - }); - - InMemoryMessageProducer eventMessageProducer = new(_bus, new Publication - { - Topic = new RoutingKey(_eventTopic), - RequestType = typeof(MyEvent) - }); - - _messages.Add(new Message( - new MessageHeader(_myCommand.Id, _commandTopic, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - )); - _messages.Add(new Message( - new MessageHeader(_myCommandTwo.Id, _commandTopic, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommandTwo, JsonSerialisationOptions.Options)) - )); - _messages.Add(new Message( - new MessageHeader(_myEvent.Id, _eventTopic, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize(_myEvent, JsonSerialisationOptions.Options)) - )); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((type) => - { - if (type == typeof(MyCommandMessageMapperAsync)) - return new MyCommandMessageMapperAsync(); - else - return new MyEventMessageMapperAsync(); - }) - ); + InMemoryMessageProducer commandMessageProducer = new(_bus, new Publication { Topic = new RoutingKey(_commandTopic), RequestType = typeof(MyCommand) }); + InMemoryMessageProducer eventMessageProducer = new(_bus, new Publication { Topic = new RoutingKey(_eventTopic), RequestType = typeof(MyEvent) }); + _messages.Add(new Message(new MessageHeader(_myCommand.Id, _commandTopic, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)))); + _messages.Add(new Message(new MessageHeader(_myCommandTwo.Id, _commandTopic, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommandTwo, JsonSerialisationOptions.Options)))); + _messages.Add(new Message(new MessageHeader(_myEvent.Id, _eventTopic, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(_myEvent, JsonSerialisationOptions.Options)))); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((type) => + { + if (type == typeof(MyCommandMessageMapperAsync)) + return new MyCommandMessageMapperAsync(); + else + return new MyEventMessageMapperAsync(); + })); messageMapperRegistry.RegisterAsync(); messageMapperRegistry.RegisterAsync(); - - var producerRegistry = new ProducerRegistry(new Dictionary - { - { _commandTopic, commandMessageProducer }, - { _eventTopic, eventMessageProducer} - }); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var producerRegistry = new ProducerRegistry(new Dictionary { { _commandTopic, commandMessageProducer }, { _eventTopic, eventMessageProducer } }); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(); - _spyOutbox = new SpyOutbox {Tracer = tracer}; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _spyOutbox - ); - + _spyOutbox = new SpyOutbox + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _spyOutbox); var scheduler = new InMemorySchedulerFactory(); - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - scheduler, - typeof(SpyTransaction) - ); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, scheduler, typeof(SpyTransaction)); } - - [Fact] + [Test] public async Task When_depositing_messages_in_the_outbox_with_a_transaction_async() { //act - var requests = new List {_myCommand, _myCommandTwo, _myEvent } ; + var requests = new List + { + _myCommand, + _myCommandTwo, + _myEvent + }; await _commandProcessor.DepositPostAsync(requests, _transactionProvider); - //assert - //messages should not be in the outbox - Assert.DoesNotContain(_spyOutbox.Messages, m => m.Message.Id == _myCommand.Id); - Assert.DoesNotContain(_spyOutbox.Messages, m => m.Message.Id == _myCommandTwo.Id); - Assert.DoesNotContain(_spyOutbox.Messages, m => m.Message.Id == _myEvent.Id); - + await Assert.That(_spyOutbox.Messages).DoesNotContain(m => m.Message.Id == _myCommand.Id); + await Assert.That(_spyOutbox.Messages).DoesNotContain(m => m.Message.Id == _myCommandTwo.Id); + await Assert.That(_spyOutbox.Messages).DoesNotContain(m => m.Message.Id == _myEvent.Id); //messages should be in the current transaction - var transaction = _transactionProvider.GetTransaction(); + var transaction = await _transactionProvider.GetTransactionAsync(); List messages = requests.Select(r => transaction.Get(r.Id)).ToList(); - Assert.DoesNotContain(messages, m => m is null); - + await Assert.That(messages).DoesNotContain(m => m is null); //messages should not be posted - Assert.False(_bus.Stream(new RoutingKey(_commandTopic)).Any()); - Assert.False(_bus.Stream(new RoutingKey(_eventTopic)).Any()); - + await Assert.That(_bus.Stream(new RoutingKey(_commandTopic)).Any()).IsFalse(); + await Assert.That(_bus.Stream(new RoutingKey(_eventTopic)).Any()).IsFalse(); //messages should correspond to the command for (var i = 0; i < messages.Count; i++) { - Assert.Equal(_messages[i].Id, messages[i]?.Id); - Assert.Equal(_messages[i].Body.Value, messages[i]?.Body.Value); - Assert.Equal(_messages[i].Header.Topic, messages[i]?.Header.Topic); - Assert.Equal(_messages[i].Header.MessageType, messages[i]?.Header.MessageType); + await Assert.That(messages[i]?.Id).IsEqualTo(_messages[i].Id); + await Assert.That(messages[i]?.Body.Value).IsEqualTo(_messages[i].Body.Value); + await Assert.That(messages[i]?.Header.Topic).IsEqualTo(_messages[i].Header.Topic); + await Assert.That(messages[i]?.Header.MessageType).IsEqualTo(_messages[i].Header.MessageType); } } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_StoreAsync_With_Transaction.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_StoreAsync_With_Transaction.cs index 1560f7ca17..fbadcbc638 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_StoreAsync_With_Transaction.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_StoreAsync_With_Transaction.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -10,98 +10,57 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Deposit { public class CommandProcessorDepositPostWithTransactionTestsAsync { private readonly RoutingKey _routingKey = new("MyCommand"); - private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private readonly Message _message; private readonly SpyOutbox _spyOutbox; private readonly SpyTransactionProvider _transactionProvider = new(); private readonly InternalBus _internalBus = new(); - public CommandProcessorDepositPostWithTransactionTestsAsync() { _myCommand.Value = "Hello World"; - - InMemoryMessageProducer messageProducer = new(_internalBus, new Publication{Topic = _routingKey, RequestType = typeof(MyCommand)}); - - _message = new Message( - new MessageHeader(_myCommand.Id, _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyCommandMessageMapperAsync()) - ); + InMemoryMessageProducer messageProducer = new(_internalBus, new Publication { Topic = _routingKey, RequestType = typeof(MyCommand) }); + _message = new Message(new MessageHeader(_myCommand.Id, _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyCommandMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - var producerRegistry = - new ProducerRegistry(new Dictionary - { - { _routingKey, messageProducer }, - }); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var producerRegistry = new ProducerRegistry(new Dictionary { { _routingKey, messageProducer }, }); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(); - _spyOutbox = new SpyOutbox {Tracer = tracer}; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _spyOutbox - ); - + _spyOutbox = new SpyOutbox + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _spyOutbox); var scheduler = new InMemorySchedulerFactory(); - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - scheduler, - typeof(SpyTransaction) - ); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, scheduler, typeof(SpyTransaction)); } - - [Fact] + [Test] public async Task When_depositing_a_message_in_the_outbox_with_a_transaction_async() { //act var postedMessageId = await _commandProcessor.DepositPostAsync(_myCommand, _transactionProvider); var context = new RequestContext(); - //assert - //message should not be in the outbox - Assert.DoesNotContain(_spyOutbox.Messages, m => m.Message.Id == postedMessageId); - + await Assert.That(_spyOutbox.Messages).DoesNotContain(m => m.Message.Id == postedMessageId); //message should be in the current transaction - var transaction = _transactionProvider.GetTransaction(); + var transaction = await _transactionProvider.GetTransactionAsync(); var message = transaction.Get(postedMessageId); - Assert.NotNull(message); - + await Assert.That(message).IsNotNull(); //message should not be posted - Assert.False(_internalBus.Stream(new RoutingKey(_routingKey)).Any()); - + await Assert.That(_internalBus.Stream(new RoutingKey(_routingKey)).Any()).IsFalse(); //message should correspond to the command - Assert.Equal(_message.Id, message.Id); - Assert.Equal(_message.Body.Value, message.Body.Value); - Assert.Equal(_message.Header.Topic, message.Header.Topic); - Assert.Equal(_message.Header.MessageType, message.Header.MessageType); + await Assert.That(message.Id).IsEqualTo(_message.Id); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); + await Assert.That(message.Header.Topic).IsEqualTo(_message.Header.Topic); + await Assert.That(message.Header.MessageType).IsEqualTo(_message.Header.MessageType); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_Store_Bulk.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_Store_Bulk.cs index 6fbce95a69..19c1cddb7e 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_Store_Bulk.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_Store_Bulk.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -9,7 +9,6 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Deposit { @@ -17,7 +16,6 @@ public class CommandProcessorBulkDepositPostTests { private readonly RoutingKey _commandTopic = new("MyCommand"); private readonly RoutingKey _eventTopic = new("MyEvent"); - private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new(); private readonly MyCommand _myCommandTwo = new(); @@ -27,127 +25,75 @@ public class CommandProcessorBulkDepositPostTests private readonly Message _messageThree; private readonly InMemoryOutbox _outbox; private readonly InternalBus _bus = new(); - public CommandProcessorBulkDepositPostTests() { _myCommand.Value = "Hello World"; _myCommandTwo.Value = "Hello World Two"; _myEvent.Data = 3; - var timeProvider = new FakeTimeProvider(); - InMemoryMessageProducer commandMessageProducer = new(_bus, new Publication - { - Topic = new RoutingKey(_commandTopic), - RequestType = typeof(MyCommand) - }); - - InMemoryMessageProducer eventMessageProducer = new(_bus, new Publication - { - Topic = new RoutingKey(_eventTopic), - RequestType = typeof(MyEvent) - }); - - _message = new Message( - new MessageHeader(_myCommand.Id, _commandTopic, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - _messageTwo = new Message( - new MessageHeader(_myCommandTwo.Id, _commandTopic, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommandTwo, JsonSerialisationOptions.Options)) - ); - - _messageThree = new Message( - new MessageHeader(_myEvent.Id, _eventTopic, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize(_myEvent, JsonSerialisationOptions.Options)) - ); - + InMemoryMessageProducer commandMessageProducer = new(_bus, new Publication { Topic = new RoutingKey(_commandTopic), RequestType = typeof(MyCommand) }); + InMemoryMessageProducer eventMessageProducer = new(_bus, new Publication { Topic = new RoutingKey(_eventTopic), RequestType = typeof(MyEvent) }); + _message = new Message(new MessageHeader(_myCommand.Id, _commandTopic, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + _messageTwo = new Message(new MessageHeader(_myCommandTwo.Id, _commandTopic, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommandTwo, JsonSerialisationOptions.Options))); + _messageThree = new Message(new MessageHeader(_myEvent.Id, _eventTopic, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(_myEvent, JsonSerialisationOptions.Options))); var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((type) => { if (type == typeof(MyCommandMessageMapper)) return new MyCommandMessageMapper(); else if (type == typeof(MyEventMessageMapper)) return new MyEventMessageMapper(); - throw new ConfigurationException($"No command or event mappers registered for {type.Name}"); }), null); - messageMapperRegistry.Register(); messageMapperRegistry.Register(); - - var producerRegistry = new ProducerRegistry(new Dictionary - { - { _commandTopic, commandMessageProducer }, - { _eventTopic, eventMessageProducer} - }); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var producerRegistry = new ProducerRegistry(new Dictionary { { _commandTopic, commandMessageProducer }, { _eventTopic, eventMessageProducer } }); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(); - _outbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox - ); - - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - new InMemorySchedulerFactory() - ); + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, new InMemorySchedulerFactory()); } - - [Fact] - public void When_depositing_messages_in_the_outbox() + [Test] + public async Task When_depositing_messages_in_the_outbox() { //act - var requests = new List {_myCommand, _myCommandTwo, _myEvent } ; + var requests = new List + { + _myCommand, + _myCommandTwo, + _myEvent + }; _commandProcessor.DepositPost(requests); var context = new RequestContext(); - //assert - //message should not be posted - Assert.False(_bus.Stream(_commandTopic).Any()); - Assert.False(_bus.Stream(_eventTopic).Any()); - + await Assert.That(_bus.Stream(_commandTopic).Any()).IsFalse(); + await Assert.That(_bus.Stream(_eventTopic).Any()).IsFalse(); //message should correspond to the command - var depositedPost = _outbox.Get(_message.Id, context); - Assert.Equal(_message.Id, depositedPost.Id); - Assert.Equal(_message.Body.Value, depositedPost.Body.Value); - Assert.Equal(_message.Header.Topic, depositedPost.Header.Topic); - Assert.Equal(_message.Header.MessageType, depositedPost.Header.MessageType); - - var depositedPost2 = _outbox.Get(_messageTwo.Id, context); - Assert.Equal(_messageTwo.Id, depositedPost2.Id); - Assert.Equal(_messageTwo.Body.Value, depositedPost2.Body.Value); - Assert.Equal(_messageTwo.Header.Topic, depositedPost2.Header.Topic); - Assert.Equal(_messageTwo.Header.MessageType, depositedPost2.Header.MessageType); - - var depositedPost3 = _outbox - .OutstandingMessages(TimeSpan.Zero, context) - .SingleOrDefault(msg => msg.Id == _messageThree.Id); + var depositedPost = await _outbox.GetAsync(_message.Id, context); + await Assert.That(depositedPost.Id).IsEqualTo(_message.Id); + await Assert.That(depositedPost.Body.Value).IsEqualTo(_message.Body.Value); + await Assert.That(depositedPost.Header.Topic).IsEqualTo(_message.Header.Topic); + await Assert.That(depositedPost.Header.MessageType).IsEqualTo(_message.Header.MessageType); + var depositedPost2 = await _outbox.GetAsync(_messageTwo.Id, context); + await Assert.That(depositedPost2.Id).IsEqualTo(_messageTwo.Id); + await Assert.That(depositedPost2.Body.Value).IsEqualTo(_messageTwo.Body.Value); + await Assert.That(depositedPost2.Header.Topic).IsEqualTo(_messageTwo.Header.Topic); + await Assert.That(depositedPost2.Header.MessageType).IsEqualTo(_messageTwo.Header.MessageType); + var depositedPost3 = (await _outbox.OutstandingMessagesAsync(TimeSpan.Zero, context)).SingleOrDefault(msg => msg.Id == _messageThree.Id); //message should correspond to the command - Assert.NotNull(depositedPost3); - Assert.Equal(_messageThree.Id, depositedPost3.Id); - Assert.Equal(_messageThree.Body.Value, depositedPost3.Body.Value); - Assert.Equal(_messageThree.Header.Topic, depositedPost3.Header.Topic); - Assert.Equal(_messageThree.Header.MessageType, depositedPost3.Header.MessageType); - + await Assert.That(depositedPost3).IsNotNull(); + await Assert.That(depositedPost3.Id).IsEqualTo(_messageThree.Id); + await Assert.That(depositedPost3.Body.Value).IsEqualTo(_messageThree.Body.Value); + await Assert.That(depositedPost3.Header.Topic).IsEqualTo(_messageThree.Header.Topic); + await Assert.That(depositedPost3.Header.MessageType).IsEqualTo(_messageThree.Header.MessageType); //message should be marked as outstanding if not sent - var outstandingMessages = _outbox.OutstandingMessages(TimeSpan.Zero, context); - Assert.Equal(3, outstandingMessages.Count()); + var outstandingMessages = await _outbox.OutstandingMessagesAsync(TimeSpan.Zero, context); + await Assert.That(outstandingMessages.Count()).IsEqualTo(3); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_Store_Bulk_With_Transaction.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_Store_Bulk_With_Transaction.cs index 9c5dc9bbb4..329281e082 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_Store_Bulk_With_Transaction.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_Store_Bulk_With_Transaction.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -8,7 +8,6 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Deposit { @@ -16,7 +15,6 @@ public class CommandProcessorBulkDepositPostWithTransactionTests { private readonly RoutingKey _commandTopic = new("MyCommand"); private readonly RoutingKey _eventTopic = new("MyEvent"); - private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new(); private readonly MyCommand _myCommandTwo = new(); @@ -25,116 +23,68 @@ public class CommandProcessorBulkDepositPostWithTransactionTests private readonly SpyOutbox _spyOutbox; private readonly SpyTransactionProvider _transactionProvider = new(); private readonly InternalBus _bus = new(); - public CommandProcessorBulkDepositPostWithTransactionTests() { _myCommand.Value = "Hello World"; - var timeProvider = new FakeTimeProvider(); - InMemoryMessageProducer commandMessageProducer = new(_bus, new Publication - { - Topic = new RoutingKey(_commandTopic), - RequestType = typeof(MyCommand) - }); - - InMemoryMessageProducer eventMessageProducer = new(_bus, new Publication - { - Topic = new RoutingKey(_eventTopic), - RequestType = typeof(MyEvent) - }); - - _messages.Add(new Message( - new MessageHeader(_myCommand.Id, _commandTopic, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - )); - _messages.Add(new Message( - new MessageHeader(_myCommandTwo.Id, _commandTopic, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommandTwo, JsonSerialisationOptions.Options)) - )); - _messages.Add(new Message( - new MessageHeader(_myEvent.Id, _eventTopic, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize(_myEvent, JsonSerialisationOptions.Options)) - )); - + InMemoryMessageProducer commandMessageProducer = new(_bus, new Publication { Topic = new RoutingKey(_commandTopic), RequestType = typeof(MyCommand) }); + InMemoryMessageProducer eventMessageProducer = new(_bus, new Publication { Topic = new RoutingKey(_eventTopic), RequestType = typeof(MyEvent) }); + _messages.Add(new Message(new MessageHeader(_myCommand.Id, _commandTopic, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)))); + _messages.Add(new Message(new MessageHeader(_myCommandTwo.Id, _commandTopic, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommandTwo, JsonSerialisationOptions.Options)))); + _messages.Add(new Message(new MessageHeader(_myEvent.Id, _eventTopic, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(_myEvent, JsonSerialisationOptions.Options)))); var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((type) => { if (type == typeof(MyCommandMessageMapper)) return new MyCommandMessageMapper(); else if (type == typeof(MyEventMessageMapper)) return new MyEventMessageMapper(); - throw new ConfigurationException($"No command or event mappers registered for {type.Name}"); }), null); - messageMapperRegistry.Register(); messageMapperRegistry.Register(); - - var producerRegistry = new ProducerRegistry(new Dictionary - { - { _commandTopic, commandMessageProducer }, - { _eventTopic, eventMessageProducer} - }); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var producerRegistry = new ProducerRegistry(new Dictionary { { _commandTopic, commandMessageProducer }, { _eventTopic, eventMessageProducer } }); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(); - _spyOutbox = new SpyOutbox() {Tracer = tracer}; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _spyOutbox - ); - + _spyOutbox = new SpyOutbox() + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _spyOutbox); var scheduler = new InMemorySchedulerFactory(); - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - scheduler, - typeof(SpyTransaction) - ); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, scheduler, typeof(SpyTransaction)); } - - [Fact] - public void When_depositing_messages_in_the_outbox_with_a_transaction() + [Test] + public async Task When_depositing_messages_in_the_outbox_with_a_transaction() { //act - var requests = new List {_myCommand, _myCommandTwo, _myEvent } ; + var requests = new List + { + _myCommand, + _myCommandTwo, + _myEvent + }; _commandProcessor.DepositPost(requests, _transactionProvider); - //assert - //messages should not be in the outbox - Assert.DoesNotContain(_spyOutbox.Messages, m => m.Message.Id == _myCommand.Id); - Assert.DoesNotContain(_spyOutbox.Messages, m => m.Message.Id == _myCommandTwo.Id); - Assert.DoesNotContain(_spyOutbox.Messages, m => m.Message.Id == _myEvent.Id); - + await Assert.That(_spyOutbox.Messages).DoesNotContain(m => m.Message.Id == _myCommand.Id); + await Assert.That(_spyOutbox.Messages).DoesNotContain(m => m.Message.Id == _myCommandTwo.Id); + await Assert.That(_spyOutbox.Messages).DoesNotContain(m => m.Message.Id == _myEvent.Id); //messages should be in the current transaction - var transaction = _transactionProvider.GetTransaction(); + var transaction = await _transactionProvider.GetTransactionAsync(); List messages = requests.Select(r => transaction.Get(r.Id)).ToList(); - Assert.DoesNotContain(messages, m => m is null); - + await Assert.That(messages).DoesNotContain(m => m is null); //messages should not be posted - Assert.False(_bus.Stream(new RoutingKey(_commandTopic)).Any()); - Assert.False(_bus.Stream(new RoutingKey(_eventTopic)).Any()); - + await Assert.That(_bus.Stream(new RoutingKey(_commandTopic)).Any()).IsFalse(); + await Assert.That(_bus.Stream(new RoutingKey(_eventTopic)).Any()).IsFalse(); //messages should correspond to the command for (var i = 0; i < messages.Count; i++) { - Assert.Equal(_messages[i].Id, messages[i]?.Id); - Assert.Equal(_messages[i].Body.Value, messages[i]?.Body.Value); - Assert.Equal(_messages[i].Header.Topic, messages[i]?.Header.Topic); - Assert.Equal(_messages[i].Header.MessageType, messages[i]?.Header.MessageType); + await Assert.That(messages[i]?.Id).IsEqualTo(_messages[i].Id); + await Assert.That(messages[i]?.Body.Value).IsEqualTo(_messages[i].Body.Value); + await Assert.That(messages[i]?.Header.Topic).IsEqualTo(_messages[i].Header.Topic); + await Assert.That(messages[i]?.Header.MessageType).IsEqualTo(_messages[i].Header.MessageType); } } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_Store_With_Transaction.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_Store_With_Transaction.cs index a39820daf2..0faf078b29 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_Store_With_Transaction.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Deposit/When_Depositing_A_Message_In_The_Message_Store_With_Transaction.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -9,97 +9,57 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Deposit { public class CommandProcessorDepositPostWithTransactionTests { private readonly RoutingKey _routingKey = new("MyCommand"); - private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private readonly Message _message; private readonly SpyOutbox _spyOutbox; private readonly SpyTransactionProvider _transactionProvider = new(); private readonly InternalBus _internalBus = new(); - public CommandProcessorDepositPostWithTransactionTests() { _myCommand.Value = "Hello World"; - var timeProvider = new FakeTimeProvider(); InMemoryMessageProducer messageProducer = new(_internalBus, new Publication { Topic = _routingKey, RequestType = typeof(MyCommand) }); - - _message = new Message( - new MessageHeader(_myCommand.Id, _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), - null); + _message = new Message(new MessageHeader(_myCommand.Id, _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - - var producerRegistry = - new ProducerRegistry(new Dictionary - { - { _routingKey, messageProducer }, - }); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var producerRegistry = new ProducerRegistry(new Dictionary { { _routingKey, messageProducer }, }); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(); - _spyOutbox = new SpyOutbox {Tracer = tracer}; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _spyOutbox - ); - + _spyOutbox = new SpyOutbox + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _spyOutbox); var scheduler = new InMemorySchedulerFactory(); - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - scheduler, - typeof(SpyTransaction) - ); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, scheduler, typeof(SpyTransaction)); } - - [Fact] - public void When_depositing_a_message_in_the_outbox_with_a_transaction() + [Test] + public async Task When_depositing_a_message_in_the_outbox_with_a_transaction() { //act var postedMessageId = _commandProcessor.DepositPost(_myCommand, _transactionProvider); - //assert - //message should not be in the outbox - Assert.DoesNotContain(_spyOutbox.Messages, m => m.Message.Id == postedMessageId); - + await Assert.That(_spyOutbox.Messages).DoesNotContain(m => m.Message.Id == postedMessageId); //message should be in the current transaction - var transaction = _transactionProvider.GetTransaction(); + var transaction = await _transactionProvider.GetTransactionAsync(); var message = transaction.Get(postedMessageId); - Assert.NotNull(message); - + await Assert.That(message).IsNotNull(); //message should not be posted - Assert.False(_internalBus.Stream(new RoutingKey(_routingKey)).Any()); - + await Assert.That(_internalBus.Stream(new RoutingKey(_routingKey)).Any()).IsFalse(); //message should correspond to the command - Assert.Equal(_message.Id, message.Id); - Assert.Equal(_message.Body.Value, message.Body.Value); - Assert.Equal(_message.Header.Topic, message.Header.Topic); - Assert.Equal(_message.Header.MessageType, message.Header.MessageType); + await Assert.That(message.Id).IsEqualTo(_message.Id); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); + await Assert.That(message.Header.Topic).IsEqualTo(_message.Header.Topic); + await Assert.That(message.Header.MessageType).IsEqualTo(_message.Header.MessageType); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_A_Handler_Is_Part_Of_An_Async_Pipeline.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_A_Handler_Is_Part_Of_An_Async_Pipeline.cs index f7e2d816fb..bdf82e0fff 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_A_Handler_Is_Part_Of_An_Async_Pipeline.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_A_Handler_Is_Part_Of_An_Async_Pipeline.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -11,33 +10,27 @@ public class PipelineBuilderAsyncTests { private readonly PipelineBuilder _pipelineBuilder; private IHandleRequestsAsync? _pipeline; - public PipelineBuilderAsyncTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - _pipelineBuilder = new PipelineBuilder(registry, (IAmAHandlerFactoryAsync)handlerFactory); - - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_A_Handler_Is_Part_Of_An_Async_Pipeline() + [Test] + public async Task When_A_Handler_Is_Part_Of_An_Async_Pipeline() { _pipeline = _pipelineBuilder.BuildAsync(new MyCommand(), new RequestContext(), false).First(); - var trace = TracePipeline().ToString(); - Assert.Contains("MyImplicitHandlerAsync", trace); - Assert.Contains("MyLoggingHandlerAsync", trace); + await Assert.That(trace).Contains("MyImplicitHandlerAsync"); + await Assert.That(trace).Contains("MyLoggingHandlerAsync"); } + private PipelineTracer TracePipeline() { var pipelineTracer = new PipelineTracer(); @@ -45,4 +38,4 @@ private PipelineTracer TracePipeline() return pipelineTracer; } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_A_Handler_Is_Part_of_A_Pipeline.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_A_Handler_Is_Part_of_A_Pipeline.cs index 9cd8edee0b..497bdc26f6 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_A_Handler_Is_Part_of_A_Pipeline.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_A_Handler_Is_Part_of_A_Pipeline.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -11,32 +10,27 @@ public class PipelineBuilderTests { private readonly PipelineBuilder _pipelineBuilder; private IHandleRequests _pipeline; - public PipelineBuilderTests() { var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - _pipelineBuilder = new PipelineBuilder(registry, (IAmAHandlerFactorySync)handlerFactory); - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_A_Handler_Is_Part_of_A_Pipeline() + [Test] + public async Task When_A_Handler_Is_Part_of_A_Pipeline() { _pipeline = _pipelineBuilder.Build(new MyCommand(), new RequestContext()).First(); - var trace = TracePipeline().ToString(); - Assert.Contains("MyImplicitHandler", trace); - Assert.Contains("MyLoggingHandler", trace); + await Assert.That(trace).Contains("MyImplicitHandler"); + await Assert.That(trace).Contains("MyLoggingHandler"); } + private PipelineTracer TracePipeline() { var pipelineTracer = new PipelineTracer(); @@ -44,4 +38,4 @@ private PipelineTracer TracePipeline() return pipelineTracer; } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_A_Handler_Is_Part_of_An_Agreement_Pipeline.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_A_Handler_Is_Part_of_An_Agreement_Pipeline.cs index ff6c1e2a9d..1febfa13e4 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_A_Handler_Is_Part_of_An_Agreement_Pipeline.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_A_Handler_Is_Part_of_An_Agreement_Pipeline.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -11,7 +10,6 @@ public class PipelineBuilderAgreementAsyncTests { private readonly PipelineBuilder _pipelineBuilder; private IHandleRequests? _pipeline; - public PipelineBuilderAgreementAsyncTests() { var registry = new SubscriberRegistry(); @@ -19,33 +17,26 @@ public PipelineBuilderAgreementAsyncTests() { var myCommand = request as MyCommand; if (myCommand?.Value == "first") - return [typeof(MyImplicitHandler)]; - - return [typeof(MyCommandHandler)]; - }), - [typeof(MyImplicitHandler), typeof(MyCommandHandler)] - ); - + return[typeof(MyImplicitHandler)]; + return[typeof(MyCommandHandler)]; + }), [typeof(MyImplicitHandler), typeof(MyCommandHandler)]); var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - _pipelineBuilder = new PipelineBuilder(registry, (IAmAHandlerFactorySync)handlerFactory); - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_A_Handler_Is_Part_of_A_Pipeline() + [Test] + public async Task When_A_Handler_Is_Part_of_A_Pipeline() { - _pipeline = _pipelineBuilder.Build(new MyCommand{Value = "first"}, new RequestContext()).First(); - + _pipeline = _pipelineBuilder.Build(new MyCommand { Value = "first" }, new RequestContext()).First(); var trace = TracePipeline().ToString(); - Assert.Contains("MyImplicitHandler", trace); - Assert.Contains("MyLoggingHandler", trace); + await Assert.That(trace).Contains("MyImplicitHandler"); + await Assert.That(trace).Contains("MyLoggingHandler"); } + private PipelineTracer TracePipeline() { var pipelineTracer = new PipelineTracer(); @@ -53,4 +44,4 @@ private PipelineTracer TracePipeline() return pipelineTracer; } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_A_Handler_Is_Part_of_An_Agreement_Pipeline_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_A_Handler_Is_Part_of_An_Agreement_Pipeline_Async.cs index b343742fd4..c0530c7c40 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_A_Handler_Is_Part_of_An_Agreement_Pipeline_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_A_Handler_Is_Part_of_An_Agreement_Pipeline_Async.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -11,7 +10,6 @@ public class PipelineBuilderAgreementTests { private readonly PipelineBuilder _pipelineBuilder; private IHandleRequestsAsync? _pipeline; - public PipelineBuilderAgreementTests() { var registry = new SubscriberRegistry(); @@ -19,33 +17,26 @@ public PipelineBuilderAgreementTests() { var myCommand = request as MyCommand; if (myCommand?.Value == "first") - return [typeof(MyImplicitHandlerAsync)]; - - return [typeof(MyCommandHandlerAsync)]; - }), - [typeof(MyImplicitHandlerAsync), typeof(MyCommandHandlerAsync)] - ); - + return[typeof(MyImplicitHandlerAsync)]; + return[typeof(MyCommandHandlerAsync)]; + }), [typeof(MyImplicitHandlerAsync), typeof(MyCommandHandlerAsync)]); var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - _pipelineBuilder = new PipelineBuilder(registry, (IAmAHandlerFactoryAsync)handlerFactory); - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_A_Handler_Is_Part_of_A_Pipeline() + [Test] + public async Task When_A_Handler_Is_Part_of_A_Pipeline() { - _pipeline = _pipelineBuilder.BuildAsync(new MyCommand{Value = "first"}, new RequestContext(), true).First(); - + _pipeline = _pipelineBuilder.BuildAsync(new MyCommand { Value = "first" }, new RequestContext(), true).First(); var trace = TracePipeline().ToString(); - Assert.Contains("MyImplicitHandler", trace); - Assert.Contains("MyLoggingHandler", trace); + await Assert.That(trace).Contains("MyImplicitHandler"); + await Assert.That(trace).Contains("MyLoggingHandler"); } + private PipelineTracer TracePipeline() { var pipelineTracer = new PipelineTracer(); @@ -53,4 +44,4 @@ private PipelineTracer TracePipeline() return pipelineTracer; } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_An_Exception_Is_Thrown_Terminate_The_Pipeline.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_An_Exception_Is_Thrown_Terminate_The_Pipeline.cs index cd7a25d69e..b4231bbaed 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_An_Exception_Is_Thrown_Terminate_The_Pipeline.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_An_Exception_Is_Thrown_Terminate_The_Pipeline.cs @@ -1,10 +1,10 @@ -using System; +using System; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Extensions.DependencyInjection; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -13,28 +13,22 @@ public class PipelineTerminationTests private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private Exception _exception; - public PipelineTerminationTests() { var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(),new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - public void When_An_Exception_Is_Thrown_Terminate_The_Pipeline() + public async Task When_An_Exception_Is_Thrown_Terminate_The_Pipeline() { _exception = Catch.Exception(() => _commandProcessor.Send(_myCommand)); - - Assert.NotNull(_exception); - Assert.False(MyUnusedCommandHandler.Shouldreceive(_myCommand)); + await Assert.That(_exception).IsNotNull(); + await Assert.That(MyUnusedCommandHandler.Shouldreceive(_myCommand)).IsFalse(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_Allow_ForiegnAttribues.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_Allow_ForiegnAttribues.cs index 205fc534c5..54b9604003 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_Allow_ForiegnAttribues.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_Allow_ForiegnAttribues.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -11,32 +10,27 @@ public class PipelineForeignAttributesTests { private readonly PipelineBuilder _pipelineBuilder; private IHandleRequests _pipeline; - public PipelineForeignAttributesTests() { var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - _pipelineBuilder = new PipelineBuilder(registry, (IAmAHandlerFactorySync)handlerFactory); - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_Building_A_Pipeline_Allow_ForeignAttributes() + [Test] + public async Task When_Building_A_Pipeline_Allow_ForeignAttributes() { _pipeline = _pipelineBuilder.Build(new MyCommand(), new RequestContext()).First(); - var trace = TraceFilters().ToString(); - Assert.Equal("MyValidationHandler`1|MyObsoleteCommandHandler|MyLoggingHandler`1|", trace); + await Assert.That(trace).IsEqualTo("MyValidationHandler`1|MyObsoleteCommandHandler|MyLoggingHandler`1|"); } + private PipelineTracer TraceFilters() { var pipelineTracer = new PipelineTracer(); @@ -44,4 +38,4 @@ private PipelineTracer TraceFilters() return pipelineTracer; } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_Allow_Pre_And_Post_Tasks.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_Allow_Pre_And_Post_Tasks.cs index be5476e0cb..b250335c42 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_Allow_Pre_And_Post_Tasks.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_Allow_Pre_And_Post_Tasks.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -11,32 +10,27 @@ public class PipelinePreAndPostFiltersTests { private readonly PipelineBuilder _pipelineBuilder; private IHandleRequests _pipeline; - public PipelinePreAndPostFiltersTests() { var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - _pipelineBuilder = new PipelineBuilder(registry, (IAmAHandlerFactorySync)handlerFactory); - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_Building_A_Pipeline_Allow_Pre_And_Post_Tasks() + [Test] + public async Task When_Building_A_Pipeline_Allow_Pre_And_Post_Tasks() { _pipeline = _pipelineBuilder.Build(new MyCommand(), new RequestContext()).First(); - var trace = TraceFilters().ToString(); - Assert.Equal("MyValidationHandler`1|MyPreAndPostDecoratedHandler|MyLoggingHandler`1|", trace); + await Assert.That(trace).IsEqualTo("MyValidationHandler`1|MyPreAndPostDecoratedHandler|MyLoggingHandler`1|"); } + private PipelineTracer TraceFilters() { var pipelineTracer = new PipelineTracer(); @@ -44,4 +38,4 @@ private PipelineTracer TraceFilters() return pipelineTracer; } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_Failures_Should_Be_ConfigurationErrors.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_Failures_Should_Be_ConfigurationErrors.cs index 0db83c8569..94cb69b496 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_Failures_Should_Be_ConfigurationErrors.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_Failures_Should_Be_ConfigurationErrors.cs @@ -1,7 +1,6 @@ -using System; +using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.TestHelpers; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -9,27 +8,23 @@ public class BuildPipelineFaults { private readonly PipelineBuilder _chainBuilder; private readonly RequestContext _requestContext; - public BuildPipelineFaults() { var registry = new SubscriberRegistry(); registry.Register(); - //We'll simulate an IoC error var handlerFactory = new SimpleHandlerFactorySync(_ => throw new InvalidOperationException("Could not create handler")); _requestContext = new RequestContext(); - _chainBuilder = new PipelineBuilder(registry, handlerFactory); - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_Building_A_Pipeline_Failures_Should_Be_ConfigurationErrors() + [Test] + public async Task When_Building_A_Pipeline_Failures_Should_Be_ConfigurationErrors() { var exception = Catch.Exception(() => _chainBuilder.Build(new MyCommand(), _requestContext)); - Assert.NotNull(exception); - Assert.IsType(exception); - Assert.IsType(exception.InnerException); + await Assert.That(exception).IsNotNull(); + await Assert.That(exception).IsTypeOf(); + await Assert.That(exception.InnerException).IsTypeOf(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_Preserve_The_Order.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_Preserve_The_Order.cs index 3c96d16ad5..b4700e8dd0 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_Preserve_The_Order.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_Preserve_The_Order.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -11,30 +10,26 @@ public class PipelineOrderingTests { private readonly PipelineBuilder _pipelineBuilder; private IHandleRequests _pipeline; - public PipelineOrderingTests() { var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - _pipelineBuilder = new PipelineBuilder(registry, (IAmAHandlerFactorySync)handlerFactory); } - [Fact] - public void When_Building_A_Pipeline_Preserve_The_Order() + [Test] + public async Task When_Building_A_Pipeline_Preserve_The_Order() { _pipeline = _pipelineBuilder.Build(new MyCommand(), new RequestContext()).First(); - - Assert.Equal("MyLoggingHandler`1|MyValidationHandler`1|MyDoubleDecoratedHandler|", PipelineTracer().ToString()); + await Assert.That(PipelineTracer().ToString()).IsEqualTo("MyLoggingHandler`1|MyValidationHandler`1|MyDoubleDecoratedHandler|"); } + private PipelineTracer PipelineTracer() { var pipelineTracer = new PipelineTracer(); @@ -42,4 +37,4 @@ private PipelineTracer PipelineTracer() return pipelineTracer; } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox.cs index 7835225060..9a226f263c 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.DependencyInjection; @@ -6,7 +6,6 @@ using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.Inbox.Handlers; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -16,46 +15,37 @@ public class PipelineGlobalInboxTests private Pipelines _chainOfResponsibility; private readonly RequestContext _requestContext; private readonly Dictionary _receivedMessages = new(); - public PipelineGlobalInboxTests() { IAmAnInboxSync inbox = new InMemoryInbox(new FakeTimeProvider()); - var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(_ => new MyCommandHandler(_receivedMessages)); container.AddSingleton(inbox); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - _requestContext = new RequestContext(); - InboxConfiguration inboxConfiguration = new(); - _chainBuilder = new PipelineBuilder(registry, (IAmAHandlerFactorySync)handlerFactory, inboxConfiguration); - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_Building_A_Pipeline_With_Global_inbox() + [Test] + public async Task When_Building_A_Pipeline_With_Global_inbox() { //act _chainOfResponsibility = _chainBuilder.Build(new MyCommand(), _requestContext); - //assert var tracer = TracePipeline(_chainOfResponsibility.First()); - Assert.Contains("UseInboxHandler", tracer.ToString()); + await Assert.That(tracer.ToString()).Contains("UseInboxHandler"); } + private PipelineTracer TracePipeline(IHandleRequests firstInPipeline) { var pipelineTracer = new PipelineTracer(); firstInPipeline.DescribePath(pipelineTracer); return pipelineTracer; } - } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_And_NoInbox_Attribute.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_And_NoInbox_Attribute.cs index e581f3b20c..2677f891d9 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_And_NoInbox_Attribute.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_And_NoInbox_Attribute.cs @@ -1,10 +1,9 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -13,46 +12,36 @@ public class PipelineGlobalInboxNoInboxAttributeTests private readonly PipelineBuilder _chainBuilder; private Pipelines _chainOfResponsibility; private readonly RequestContext _requestContext; - - public PipelineGlobalInboxNoInboxAttributeTests() { IAmAnInboxSync inbox = new InMemoryInbox(new FakeTimeProvider()); - var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddSingleton(inbox); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - _requestContext = new RequestContext(); - InboxConfiguration inboxConfiguration = new(); - _chainBuilder = new PipelineBuilder(registry, (IAmAHandlerFactorySync)handlerFactory, inboxConfiguration); - } - [Fact] - public void When_Building_A_Pipeline_With_Global_Inbox() + [Test] + public async Task When_Building_A_Pipeline_With_Global_Inbox() { //act _chainOfResponsibility = _chainBuilder.Build(new MyCommand(), _requestContext); - //assert var tracer = TracePipeline(_chainOfResponsibility.First()); - Assert.DoesNotContain("UseInboxHandler", tracer.ToString()); + await Assert.That(tracer.ToString()).DoesNotContain("UseInboxHandler"); } + private PipelineTracer TracePipeline(IHandleRequests firstInPipeline) { var pipelineTracer = new PipelineTracer(); firstInPipeline.DescribePath(pipelineTracer); return pipelineTracer; } - } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_And_NoInbox_Attribute_Async .cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_And_NoInbox_Attribute_Async .cs index 140f5b9386..7714a71a16 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_And_NoInbox_Attribute_Async .cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_And_NoInbox_Attribute_Async .cs @@ -1,10 +1,9 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -13,47 +12,36 @@ public class PipelineGlobalInboxNoInboxAttributeAsyncTests private readonly PipelineBuilder _chainBuilder; private AsyncPipelines _chainOfResponsibility; private readonly RequestContext _requestContext; - - public PipelineGlobalInboxNoInboxAttributeAsyncTests() { IAmAnInboxSync inbox = new InMemoryInbox(new FakeTimeProvider()); - var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddSingleton(inbox); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - _requestContext = new RequestContext(); - InboxConfiguration inboxConfiguration = new(); - _chainBuilder = new PipelineBuilder(registry, (IAmAHandlerFactoryAsync)handlerFactory, inboxConfiguration); - } - [Fact] - public void When_Building_A_Pipeline_With_Global_Inbox_Async() + [Test] + public async Task When_Building_A_Pipeline_With_Global_Inbox_Async() { //act _chainOfResponsibility = _chainBuilder.BuildAsync(new MyCommand(), _requestContext, false); - //assert var tracer = TracePipelineAsync(_chainOfResponsibility.First()); - Assert.DoesNotContain("UseInboxHandlerAsync", tracer.ToString()); - + await Assert.That(tracer.ToString()).DoesNotContain("UseInboxHandlerAsync"); } + private PipelineTracer TracePipelineAsync(IHandleRequestsAsync firstInPipeline) { var pipelineTracer = new PipelineTracer(); firstInPipeline.DescribePath(pipelineTracer); return pipelineTracer; } - } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_And_Use_Inbox.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_And_Use_Inbox.cs index c56ac475bc..8cc521c79d 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_And_Use_Inbox.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_And_Use_Inbox.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Time.Testing; @@ -7,7 +7,6 @@ using Paramore.Brighter.Inbox; using Paramore.Brighter.Inbox.Exceptions; using Paramore.Brighter.Inbox.Handlers; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -16,54 +15,36 @@ public class PipelineGlobalInboxWhenUseInboxTests private readonly PipelineBuilder _chainBuilder; private Pipelines _chainOfResponsibility; private readonly RequestContext _requestContext; - - public PipelineGlobalInboxWhenUseInboxTests() { IAmAnInboxSync inbox = new InMemoryInbox(new FakeTimeProvider()); - var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddSingleton(inbox); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _requestContext = new RequestContext(); - - InboxConfiguration inboxConfiguration = new( - scope: InboxScope.All, - onceOnly: true, - actionOnExists: OnceOnlyAction.Throw); - + InboxConfiguration inboxConfiguration = new(scope: InboxScope.All, onceOnly: true, actionOnExists: OnceOnlyAction.Throw); _chainBuilder = new PipelineBuilder(registry, (IAmAHandlerFactorySync)handlerFactory, inboxConfiguration); - } - [Fact] - public void When_Building_A_Pipeline_With_Global_Inbox() + [Test] + public async Task When_Building_A_Pipeline_With_Global_Inbox() { // Settings for InboxConfiguration on MyCommandInboxedHandler // [InboxConfiguration(step:0, contextKey: typeof(MyCommandInboxedHandler), onceOnly: false)] // Settings for InboxConfiguration as above // _inboxConfiguration = new InboxConfiguration(InboxScope.All, context: true, onceOnly: true); // so global will not allow repeated requests ans calls, but local should override this and allow - - //act _chainOfResponsibility = _chainBuilder.Build(new MyCommand(), _requestContext); - var chain = _chainOfResponsibility.First(); var myCommand = new MyCommand(); - //First pass not impacted by InboxConfiguration Handler chain.Handle(myCommand); - bool noException = true; try { @@ -75,15 +56,14 @@ public void When_Building_A_Pipeline_With_Global_Inbox() } //assert - Assert.True(noException); - + await Assert.That(noException).IsTrue(); } + private PipelineTracer TracePipeline(IHandleRequests firstInPipeline) { var pipelineTracer = new PipelineTracer(); firstInPipeline.DescribePath(pipelineTracer); return pipelineTracer; } - } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_And_Use_Inbox_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_And_Use_Inbox_Async.cs index df02bea496..0c922c296b 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_And_Use_Inbox_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_And_Use_Inbox_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -8,7 +8,6 @@ using Paramore.Brighter.Inbox; using Paramore.Brighter.Inbox.Exceptions; using Paramore.Brighter.Inbox.Handlers; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -17,37 +16,23 @@ public class PipelineGlobalInboxWhenUseInboxAsyncTests private readonly PipelineBuilder _chainBuilder; private AsyncPipelines _chainOfResponsibility; private readonly RequestContext _requestContext; - - public PipelineGlobalInboxWhenUseInboxAsyncTests() { IAmAnInboxSync inbox = new InMemoryInbox(new FakeTimeProvider()); - var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddSingleton((IAmAnInboxAsync)inbox); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - - _requestContext = new RequestContext(); - - InboxConfiguration inboxConfiguration = new( - scope: InboxScope.All, - onceOnly: true, - actionOnExists: OnceOnlyAction.Throw); - + InboxConfiguration inboxConfiguration = new(scope: InboxScope.All, onceOnly: true, actionOnExists: OnceOnlyAction.Throw); _chainBuilder = new PipelineBuilder(registry, (IAmAHandlerFactoryAsync)handlerFactory, inboxConfiguration); - } - [Fact] + [Test] public async Task When_Building_A_Pipeline_With_Global_Inbox() { // Settings for InboxConfiguration on MyCommandInboxedHandler @@ -55,17 +40,12 @@ public async Task When_Building_A_Pipeline_With_Global_Inbox() // Settings for InboxConfiguration as above // _inboxConfiguration = new InboxConfiguration(InboxScope.All, context: true, onceOnly: true); // so global will not allow repeated requests ans calls, but local should override this and allow - - //act _chainOfResponsibility = _chainBuilder.BuildAsync(new MyCommand(), _requestContext, false); - var chain = _chainOfResponsibility.First(); var myCommand = new MyCommand(); - //First pass not impacted by InboxConfiguration Handler await chain.HandleAsync(myCommand); - bool noException = true; try { @@ -77,15 +57,14 @@ public async Task When_Building_A_Pipeline_With_Global_Inbox() } //assert - Assert.True(noException); - + await Assert.That(noException).IsTrue(); } + private PipelineTracer TracePipeline(IHandleRequests firstInPipeline) { var pipelineTracer = new PipelineTracer(); firstInPipeline.DescribePath(pipelineTracer); return pipelineTracer; } - } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_Async.cs index f992828a55..8fdfa175cc 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.DependencyInjection; @@ -6,63 +6,49 @@ using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.Inbox.Handlers; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { //TODO: //Respects different global choices i.e. throw, what to capture, context //allow a lambda for the context, to override, and pass in a default of typeof() ???? - public class PipelineGlobalInboxTestsAsync { private readonly PipelineBuilder _chainBuilder; private AsyncPipelines _chainOfResponsibility; private readonly RequestContext _requestContext; - - public PipelineGlobalInboxTestsAsync() { IAmAnInboxAsync inbox = new InMemoryInbox(new FakeTimeProvider()); var handler = new MyCommandHandlerAsync(new Dictionary()); - var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddSingleton(handler); container.AddSingleton(inbox); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _requestContext = new RequestContext(); - InboxConfiguration inboxConfiguration = new(); - _chainBuilder = new PipelineBuilder(registry, (IAmAHandlerFactoryAsync)handlerFactory, inboxConfiguration); - } - [Fact] - public void When_Building_A_Pipeline_With_Global_Inbox() + [Test] + public async Task When_Building_A_Pipeline_With_Global_Inbox() { - //act + //act _chainOfResponsibility = _chainBuilder.BuildAsync(new MyCommand(), _requestContext, false); - //assert var tracer = TracePipeline(_chainOfResponsibility.First()); - Assert.Contains("UseInboxHandlerAsync", tracer.ToString()); - + await Assert.That(tracer.ToString()).Contains("UseInboxHandlerAsync"); } + private PipelineTracer TracePipeline(IHandleRequestsAsync firstInPipeline) { var pipelineTracer = new PipelineTracer(); firstInPipeline.DescribePath(pipelineTracer); return pipelineTracer; } - } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_Override_Context.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_Override_Context.cs index 44d92a2fa7..a256849c09 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_Override_Context.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Pipeline_With_Global_Inbox_Override_Context.cs @@ -1,11 +1,10 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.Inbox.Handlers; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -16,47 +15,33 @@ public class PipelineGlobalInboxContextTests private Pipelines _chainOfResponsibility; private readonly RequestContext _requestContext; private readonly IAmAnInboxSync _inbox; - - public PipelineGlobalInboxContextTests() { _inbox = new InMemoryInbox(new FakeTimeProvider()); - var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddSingleton(_inbox); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - _requestContext = new RequestContext(); - - InboxConfiguration inboxConfiguration = new( - scope: InboxScope.All, - context: (handlerType) => CONTEXT_KEY); - + InboxConfiguration inboxConfiguration = new(scope: InboxScope.All, context: (handlerType) => CONTEXT_KEY); _chainBuilder = new PipelineBuilder(registry, (IAmAHandlerFactorySync)handlerFactory, inboxConfiguration); - PipelineBuilder.ClearPipelineCache(); - } - [Fact] - public void When_Building_A_Pipeline_With_Global_inbox() + [Test] + public async Task When_Building_A_Pipeline_With_Global_inbox() { //act _chainOfResponsibility = _chainBuilder.Build(new MyCommand(), _requestContext); - var firstHandler = _chainOfResponsibility.First(); var myCommmand = new MyCommand(); firstHandler.Handle(myCommmand); - //assert var exists = _inbox.Exists(myCommmand.Id, CONTEXT_KEY, null, 500); - Assert.True(exists); + await Assert.That(exists).IsTrue(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Sync_Pipeline_That_Has_Async_Handlers.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Sync_Pipeline_That_Has_Async_Handlers.cs index d331ba3eb4..fe8ca01f7c 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Sync_Pipeline_That_Has_Async_Handlers.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_A_Sync_Pipeline_That_Has_Async_Handlers.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright � 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the �Software�), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,23 +12,20 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED �AS IS�, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -37,32 +34,25 @@ public class PipelineMixedHandlersTests private readonly PipelineBuilder _pipelineBuilder; private IHandleRequests _pipeline; private Exception _exception; - public PipelineMixedHandlersTests() { var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _pipelineBuilder = new PipelineBuilder(registry, (IAmAHandlerFactorySync)handlerFactory); - PipelineBuilder.ClearPipelineCache(); - + _pipelineBuilder = new PipelineBuilder(registry, (IAmAHandlerFactorySync)handlerFactory); } - [Fact] - public void When_Building_A_Sync_Pipeline_That_Has_Async_Handlers() + [Test] + public async Task When_Building_A_Sync_Pipeline_That_Has_Async_Handlers() { _exception = Catch.Exception(() => _pipeline = _pipelineBuilder.Build(new MyCommand(), new RequestContext()).First()); - - Assert.NotNull(_exception); - Assert.IsType(_exception); - Assert.Contains(typeof(MyLoggingHandlerAsync<>).Name, _exception.Message); + await Assert.That(_exception).IsNotNull(); + await Assert.That(_exception).IsTypeOf(); + await Assert.That(_exception.Message).Contains(typeof(MyLoggingHandlerAsync<>).Name); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_An_Async_Pipeline_Allow_ForiegnAttribues.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_An_Async_Pipeline_Allow_ForiegnAttribues.cs index a49003b6f7..c0c1942975 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_An_Async_Pipeline_Allow_ForiegnAttribues.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_An_Async_Pipeline_Allow_ForiegnAttribues.cs @@ -1,49 +1,41 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { public class PipelineForiegnAttributesAsyncTests - - { - private readonly PipelineBuilder _pipeline_Builder; - private IHandleRequestsAsync _pipeline; - - public PipelineForiegnAttributesAsyncTests() { - var registry = new SubscriberRegistry(); - registry.RegisterAsync(); - - var container = new ServiceCollection(); - - container.AddTransient(); - container.AddTransient>(); - container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _pipeline_Builder = new PipelineBuilder(registry, (IAmAHandlerFactoryAsync)handlerFactory); - PipelineBuilder.ClearPipelineCache(); - } - - [Fact] - public void When_Building_An_Async_Pipeline_Allow_ForeignAttributes() - { - _pipeline = _pipeline_Builder.BuildAsync(new MyCommand(), new RequestContext(), false).First(); - - var trace = TraceFilters().ToString(); - Assert.Equal("MyValidationHandlerAsync`1|MyObsoleteCommandHandlerAsync|MyLoggingHandlerAsync`1|", trace); - } - private PipelineTracer TraceFilters() - { - var pipelineTracer = new PipelineTracer(); - _pipeline.DescribePath(pipelineTracer); - return pipelineTracer; - } + private readonly PipelineBuilder _pipeline_Builder; + private IHandleRequestsAsync _pipeline; + public PipelineForiegnAttributesAsyncTests() + { + var registry = new SubscriberRegistry(); + registry.RegisterAsync(); + var container = new ServiceCollection(); + container.AddTransient(); + container.AddTransient>(); + container.AddTransient>(); + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); + var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); + _pipeline_Builder = new PipelineBuilder(registry, (IAmAHandlerFactoryAsync)handlerFactory); + } + + [Test] + public async Task When_Building_An_Async_Pipeline_Allow_ForeignAttributes() + { + _pipeline = _pipeline_Builder.BuildAsync(new MyCommand(), new RequestContext(), false).First(); + var trace = TraceFilters().ToString(); + await Assert.That(trace).IsEqualTo("MyValidationHandlerAsync`1|MyObsoleteCommandHandlerAsync|MyLoggingHandlerAsync`1|"); + } + + private PipelineTracer TraceFilters() + { + var pipelineTracer = new PipelineTracer(); + _pipeline.DescribePath(pipelineTracer); + return pipelineTracer; + } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_An_Async_Pipeline_Allow_Pre_And_Post_Tasks.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_An_Async_Pipeline_Allow_Pre_And_Post_Tasks.cs index b99d181b10..c97b6ea1f7 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_An_Async_Pipeline_Allow_Pre_And_Post_Tasks.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_An_Async_Pipeline_Allow_Pre_And_Post_Tasks.cs @@ -1,9 +1,9 @@ -using System; +using System; using System.Linq; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -11,32 +11,27 @@ public class PipelinePreAndPostFiltersAsyncTests { private readonly PipelineBuilder _pipelineBuilder; private IHandleRequestsAsync _pipeline; - public PipelinePreAndPostFiltersAsyncTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _pipelineBuilder = new PipelineBuilder(registry,(IAmAHandlerFactoryAsync)handlerFactory); - PipelineBuilder.ClearPipelineCache(); + _pipelineBuilder = new PipelineBuilder(registry, (IAmAHandlerFactoryAsync)handlerFactory); } - [Fact] - private void When_Building_An_Async_Pipeline_Allow_Pre_And_Post_Tasks() + [Test] + public async Task When_Building_An_Async_Pipeline_Allow_Pre_And_Post_Tasks() { _pipeline = _pipelineBuilder.BuildAsync(new MyCommand(), new RequestContext(), false).First(); - var trace = TraceFilters().ToString(); - Assert.Equal("MyValidationHandlerAsync`1|MyPreAndPostDecoratedHandlerAsync|MyLoggingHandlerAsync`1|", trace); + await Assert.That(trace).IsEqualTo("MyValidationHandlerAsync`1|MyPreAndPostDecoratedHandlerAsync|MyLoggingHandlerAsync`1|"); } + private PipelineTracer TraceFilters() { var pipelineTracer = new PipelineTracer(); @@ -44,4 +39,4 @@ private PipelineTracer TraceFilters() return pipelineTracer; } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_An_Async_Pipeline_Failures_Should_Be_ConfigurationErrors.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_An_Async_Pipeline_Failures_Should_Be_ConfigurationErrors.cs index 250376e4e0..5c93fdf8e3 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_An_Async_Pipeline_Failures_Should_Be_ConfigurationErrors.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_An_Async_Pipeline_Failures_Should_Be_ConfigurationErrors.cs @@ -1,7 +1,6 @@ -using System; +using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.TestHelpers; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -9,27 +8,23 @@ public class BuildPipelineFaultsAsync { private readonly PipelineBuilder _chainBuilder; private readonly RequestContext _requestContext; - public BuildPipelineFaultsAsync() { var registry = new SubscriberRegistry(); registry.RegisterAsync(); - // We'll simulate an IoC error IAmAHandlerFactoryAsync handlerFactory = new SimpleHandlerFactoryAsync(_ => throw new InvalidOperationException("Could not create handler")); _requestContext = new RequestContext(); - _chainBuilder = new PipelineBuilder(registry, handlerFactory); - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_Building_A_Pipeline_Failures_Should_Be_ConfigurationErrors() + [Test] + public async Task When_Building_A_Pipeline_Failures_Should_Be_ConfigurationErrors() { var exception = Catch.Exception(() => _chainBuilder.BuildAsync(new MyCommand(), _requestContext, false)); - Assert.NotNull(exception); - Assert.IsType(exception); - Assert.IsType(exception.InnerException); + await Assert.That(exception).IsNotNull(); + await Assert.That(exception).IsTypeOf(); + await Assert.That(exception.InnerException).IsTypeOf(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_An_Async_Pipeline_Preserve_The_Order.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_An_Async_Pipeline_Preserve_The_Order.cs index d01506262d..3231a5978f 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_An_Async_Pipeline_Preserve_The_Order.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_An_Async_Pipeline_Preserve_The_Order.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -11,32 +10,27 @@ public class PipelineOrderingAsyncTests { private readonly PipelineBuilder _pipeline_Builder; private IHandleRequestsAsync _pipeline; - public PipelineOrderingAsyncTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - _pipeline_Builder = new PipelineBuilder(registry, (IAmAHandlerFactoryAsync)handlerFactory); - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_Building_An_Async_Pipeline_Preserve_The_Order() + [Test] + public async Task When_Building_An_Async_Pipeline_Preserve_The_Order() { _pipeline = _pipeline_Builder.BuildAsync(new MyCommand(), new RequestContext(), false).First(); - var trace = PipelineTracer().ToString(); - Assert.Equal("MyLoggingHandlerAsync`1|MyValidationHandlerAsync`1|MyDoubleDecoratedHandlerAsync|", trace); + await Assert.That(trace).IsEqualTo("MyLoggingHandlerAsync`1|MyValidationHandlerAsync`1|MyDoubleDecoratedHandlerAsync|"); } + private PipelineTracer PipelineTracer() { var pipelineTracer = new PipelineTracer(); @@ -44,4 +38,4 @@ private PipelineTracer PipelineTracer() return pipelineTracer; } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_An_Async_Pipeline_That_Has_Sync_Handlers.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_An_Async_Pipeline_That_Has_Sync_Handlers.cs index 2e6129ee26..2a56cea729 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_An_Async_Pipeline_That_Has_Sync_Handlers.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Building_An_Async_Pipeline_That_Has_Sync_Handlers.cs @@ -1,10 +1,9 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -13,31 +12,25 @@ public class PipelineMixedHandlersAsyncTests private readonly PipelineBuilder _pipelineBuilder; private IHandleRequestsAsync _pipeline; private Exception _exception; - public PipelineMixedHandlersAsyncTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - _pipelineBuilder = new PipelineBuilder(registry, (IAmAHandlerFactoryAsync)handlerFactory); - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_Building_An_Async_Pipeline_That_Has_Sync_Handlers() + [Test] + public async Task When_Building_An_Async_Pipeline_That_Has_Sync_Handlers() { _exception = Catch.Exception(() => _pipeline = _pipelineBuilder.BuildAsync(new MyCommand(), new RequestContext(), false).First()); - - Assert.NotNull(_exception); - Assert.IsType(_exception); - Assert.Contains(typeof(MyLoggingHandler<>).Name, _exception.Message); + await Assert.That(_exception).IsNotNull(); + await Assert.That(_exception).IsTypeOf(); + await Assert.That(_exception.Message).Contains(typeof(MyLoggingHandler<>).Name); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Creating_Context_For_A_Handler.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Creating_Context_For_A_Handler.cs index 28619a3fc5..bc69a93167 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Creating_Context_For_A_Handler.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Creating_Context_For_A_Handler.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -11,24 +10,21 @@ public class PipelineForCommandTests private readonly PipelineBuilder _chainBuilder; private IHandleRequests _chainOfResponsibility; private readonly RequestContext _requestContext; - public PipelineForCommandTests() { var registry = new SubscriberRegistry(); registry.Register(); var handlerFactory = new SimpleHandlerFactorySync(_ => new MyCommandHandler(new Dictionary())); _requestContext = new RequestContext(); - _chainBuilder = new PipelineBuilder(registry, handlerFactory); } - [Fact] - public void When_Creating_Context_For_A_Handler() + [Test] + public async Task When_Creating_Context_For_A_Handler() { _chainOfResponsibility = _chainBuilder.Build(new MyCommand(), _requestContext).First(); - - Assert.NotNull(_chainOfResponsibility.Context); - Assert.Same(_requestContext, _chainOfResponsibility.Context); + await Assert.That(_chainOfResponsibility.Context).IsNotNull(); + await Assert.That(_chainOfResponsibility.Context).IsSameReferenceAs(_requestContext); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Creating_Context_For_A_Handler_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Creating_Context_For_A_Handler_Async.cs index 7758f4be60..8d1edede2f 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Creating_Context_For_A_Handler_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Creating_Context_For_A_Handler_Async.cs @@ -1,35 +1,31 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { public class PipelineForCommandAsyncTests { - private static PipelineBuilder _chainBuilder; - private static IHandleRequestsAsync _chainOfResponsibility; - private static RequestContext _requestContext; + private PipelineBuilder _chainBuilder; + private IHandleRequestsAsync _chainOfResponsibility; + private RequestContext _requestContext; private readonly IDictionary _receivedMessages = new Dictionary(); - public PipelineForCommandAsyncTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync(); var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyCommandHandlerAsync(_receivedMessages)); _requestContext = new RequestContext(); - _chainBuilder = new PipelineBuilder(registry, asyncHandlerFactory: handlerFactory); } - [Fact] - public void When_Creating_Context_For_A_Handler_Async() + [Test] + public async Task When_Creating_Context_For_A_Handler_Async() { _chainOfResponsibility = _chainBuilder.BuildAsync(new MyCommand(), _requestContext, false).First(); - - Assert.NotNull(_chainOfResponsibility.Context); - Assert.Same(_requestContext, _chainOfResponsibility.Context); + await Assert.That(_chainOfResponsibility.Context).IsNotNull(); + await Assert.That(_chainOfResponsibility.Context).IsSameReferenceAs(_requestContext); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Finding_A_Hander_That_Has_Dependencies.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Finding_A_Hander_That_Has_Dependencies.cs index 1ba322e81c..c5da870cf7 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Finding_A_Hander_That_Has_Dependencies.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Finding_A_Hander_That_Has_Dependencies.cs @@ -1,40 +1,34 @@ -using System; +using System; using System.Linq; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { public class PipelineWithHandlerDependenciesTests - { - private readonly PipelineBuilder _pipelineBuilder; - private IHandleRequests _pipeline; + private readonly PipelineBuilder _pipelineBuilder; + private IHandleRequests _pipeline; + public PipelineWithHandlerDependenciesTests() + { + var registry = new SubscriberRegistry(); + registry.Register(); + var handlerFactory = new SimpleHandlerFactorySync(_ => new MyDependentCommandHandler(new FakeRepository(new FakeSession()))); + _pipelineBuilder = new PipelineBuilder(registry, handlerFactory); + } - public PipelineWithHandlerDependenciesTests() - { - var registry = new SubscriberRegistry(); - registry.Register(); - var handlerFactory = - new SimpleHandlerFactorySync(_ => new MyDependentCommandHandler(new FakeRepository(new FakeSession()))); + [Test] + public async Task When_Finding_A_Handler_That_Has_Dependencies() + { + _pipeline = _pipelineBuilder.Build(new MyCommand(), new RequestContext()).First(); + await Assert.That(_pipeline).IsTypeOf(); + await Assert.That(TracePipeline().ToString()).IsEqualTo("MyDependentCommandHandler|"); + } - _pipelineBuilder = new PipelineBuilder(registry, handlerFactory); - PipelineBuilder.ClearPipelineCache(); - } - - [Fact] - public void When_Finding_A_Handler_That_Has_Dependencies() - { - _pipeline = _pipelineBuilder.Build(new MyCommand(), new RequestContext()).First(); - - Assert.IsType(_pipeline); - Assert.Equal("MyDependentCommandHandler|", TracePipeline().ToString()); - } - private PipelineTracer TracePipeline() - { - var pipelineTracer = new PipelineTracer(); - _pipeline.DescribePath(pipelineTracer); - return pipelineTracer; - } + private PipelineTracer TracePipeline() + { + var pipelineTracer = new PipelineTracer(); + _pipeline.DescribePath(pipelineTracer); + return pipelineTracer; + } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Finding_A_Handler_For_A_Command.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Finding_A_Handler_For_A_Command.cs index b635b67843..151c410d27 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Finding_A_Handler_For_A_Command.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Finding_A_Handler_For_A_Command.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -10,25 +9,22 @@ public class PipelineBuildForCommandTests { private readonly PipelineBuilder _pipelineBuilder; private IHandleRequests? _pipeline; - public PipelineBuildForCommandTests() { var registry = new SubscriberRegistry(); registry.Register(); var handlerFactory = new SimpleHandlerFactorySync(_ => new MyCommandHandler(new Dictionary())); - _pipelineBuilder = new PipelineBuilder(registry, handlerFactory); - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_Finding_A_Handler_For_A_Command() + [Test] + public async Task When_Finding_A_Handler_For_A_Command() { _pipeline = _pipelineBuilder.Build(new MyCommand(), new RequestContext()).First(); - - Assert.IsType(_pipeline); - Assert.Equal("MyCommandHandler|", TracePipeline().ToString()); + await Assert.That(_pipeline).IsTypeOf(); + await Assert.That(TracePipeline().ToString()).IsEqualTo("MyCommandHandler|"); } + private PipelineTracer TracePipeline() { var pipelineTracer = new PipelineTracer(); @@ -36,4 +32,4 @@ private PipelineTracer TracePipeline() return pipelineTracer; } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Finding_A_Handler_For_A_Command_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Finding_A_Handler_For_A_Command_Async.cs index 97dff3a43d..8240866d75 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Finding_A_Handler_For_A_Command_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Finding_A_Handler_For_A_Command_Async.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -10,25 +9,22 @@ public class PipelineBuildForCommandAsyncTests { private readonly PipelineBuilder _pipelineBuilder; private IHandleRequestsAsync _pipeline; - - public PipelineBuildForCommandAsyncTests () + public PipelineBuildForCommandAsyncTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync(); var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyCommandHandlerAsync(new Dictionary())); - _pipelineBuilder = new PipelineBuilder(registry, handlerFactory); - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_Finding_A_Handler_For_A_Command() + [Test] + public async Task When_Finding_A_Handler_For_A_Command() { _pipeline = _pipelineBuilder.BuildAsync(new MyCommand(), new RequestContext(), true).First(); - - Assert.IsType(_pipeline); - Assert.Equal("MyCommandHandlerAsync|", TracePipeline().ToString()); + await Assert.That(_pipeline).IsTypeOf(); + await Assert.That(TracePipeline().ToString()).IsEqualTo("MyCommandHandlerAsync|"); } + private PipelineTracer TracePipeline() { var pipelineTracer = new PipelineTracer(); @@ -36,4 +32,4 @@ private PipelineTracer TracePipeline() return pipelineTracer; } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Finding_A_Handler_For_A_Command_By_Agreement.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Finding_A_Handler_For_A_Command_By_Agreement.cs index 1ad59910b4..53d4cce35f 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Finding_A_Handler_For_A_Command_By_Agreement.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Finding_A_Handler_For_A_Command_By_Agreement.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -10,34 +9,28 @@ public class PipelineBuildForAgreementTests { private readonly PipelineBuilder _pipelineBuilder; private IHandleRequests? _pipeline; - - public PipelineBuildForAgreementTests () + public PipelineBuildForAgreementTests() { var registry = new SubscriberRegistry(); registry.Register(router: (request, context) => { var command = request as MyCommand; if (command.Value == "new") - return [typeof(MyCommandHandler)]; - - return [typeof(MyObsoleteCommandHandler)]; - }, - [typeof(MyCommandHandler), typeof(MyObsoleteCommandHandler)] - ); + return[typeof(MyCommandHandler)]; + return[typeof(MyObsoleteCommandHandler)]; + }, [typeof(MyCommandHandler), typeof(MyObsoleteCommandHandler)]); var handlerFactory = new SimpleHandlerFactorySync(factoryMethod: _ => new MyCommandHandler(new Dictionary())); - _pipelineBuilder = new PipelineBuilder(subscriberRegistry: registry, syncHandlerFactory: handlerFactory); - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_Finding_A_Handler_For_A_Command() + [Test] + public async Task When_Finding_A_Handler_For_A_Command() { - _pipeline = _pipelineBuilder.Build(new MyCommand {Value = "new"}, new RequestContext()).First(); - - Assert.IsType(_pipeline); - Assert.Equal("MyCommandHandler|", TracePipeline().ToString()); + _pipeline = _pipelineBuilder.Build(new MyCommand { Value = "new" }, new RequestContext()).First(); + await Assert.That(_pipeline).IsTypeOf(); + await Assert.That(TracePipeline().ToString()).IsEqualTo("MyCommandHandler|"); } + private PipelineTracer TracePipeline() { var pipelineTracer = new PipelineTracer(); @@ -45,4 +38,4 @@ private PipelineTracer TracePipeline() return pipelineTracer; } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Finding_A_Handler_For_A_Command_By_Agreement_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Finding_A_Handler_For_A_Command_By_Agreement_Async.cs index 724a5b26bf..4801a6ac8b 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Finding_A_Handler_For_A_Command_By_Agreement_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Finding_A_Handler_For_A_Command_By_Agreement_Async.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -10,34 +9,28 @@ public class PipelineBuildForAgreementAsyncTests { private readonly PipelineBuilder _pipelineBuilder; private IHandleRequestsAsync? _pipeline; - - public PipelineBuildForAgreementAsyncTests () + public PipelineBuildForAgreementAsyncTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync(router: (request, context) => { var command = request as MyCommand; if (command.Value == "new") - return [typeof(MyCommandHandlerAsync)]; - - return [typeof(MyObsoleteCommandHandlerAsync)]; - }, - [typeof(MyCommandHandlerAsync), typeof(MyObsoleteCommandHandlerAsync)] - ); + return[typeof(MyCommandHandlerAsync)]; + return[typeof(MyObsoleteCommandHandlerAsync)]; + }, [typeof(MyCommandHandlerAsync), typeof(MyObsoleteCommandHandlerAsync)]); var handlerFactory = new SimpleHandlerFactoryAsync(factoryMethod: _ => new MyCommandHandlerAsync(new Dictionary())); - _pipelineBuilder = new PipelineBuilder(subscriberRegistry: registry, asyncHandlerFactory: handlerFactory); - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_Finding_A_Handler_For_A_Command() + [Test] + public async Task When_Finding_A_Handler_For_A_Command() { - _pipeline = _pipelineBuilder.BuildAsync(new MyCommand {Value = "new"}, new RequestContext(), true).First(); - - Assert.IsType(_pipeline); - Assert.Equal("MyCommandHandlerAsync|", TracePipeline().ToString()); + _pipeline = _pipelineBuilder.BuildAsync(new MyCommand { Value = "new" }, new RequestContext(), true).First(); + await Assert.That(_pipeline).IsTypeOf(); + await Assert.That(TracePipeline().ToString()).IsEqualTo("MyCommandHandlerAsync|"); } + private PipelineTracer TracePipeline() { var pipelineTracer = new PipelineTracer(); @@ -45,4 +38,4 @@ private PipelineTracer TracePipeline() return pipelineTracer; } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Inserting_A_Default_Inbox_Into_The_Publish_Pipeline.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Inserting_A_Default_Inbox_Into_The_Publish_Pipeline.cs index bf1c9eb530..4078a874f6 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Inserting_A_Default_Inbox_Into_The_Publish_Pipeline.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Inserting_A_Default_Inbox_Into_The_Publish_Pipeline.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Time.Testing; @@ -8,7 +8,6 @@ using Paramore.Brighter.Inbox.Handlers; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -16,62 +15,36 @@ public class CommandProcessorBuildDefaultInboxPublishTests { private readonly CommandProcessor _commandProcessor; private readonly InMemoryInbox _inbox = new InMemoryInbox(new FakeTimeProvider()); - public CommandProcessorBuildDefaultInboxPublishTests() { var handler = new MyGlobalInboxEventHandler(new Dictionary()); - var subscriberRegistry = new SubscriberRegistry(); //This handler has no Inbox attribute subscriberRegistry.Add(typeof(MyEvent), typeof(MyGlobalInboxEventHandler)); - var container = new ServiceCollection(); container.AddSingleton(handler); container.AddSingleton(_inbox); container.AddSingleton>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - var retryPolicy = Policy - .Handle() - .Retry(); - - var circuitBreakerPolicy = Policy - .Handle() - .CircuitBreaker(1, TimeSpan.FromMilliseconds(1)); - - var inboxConfiguration = new InboxConfiguration( - _inbox, - InboxScope.All, //grab all the events - onceOnly: true, //only allow once - actionOnExists: OnceOnlyAction.Throw //throw on duplicates (we should be the only entry after) - ); - - _commandProcessor = new CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry {{CommandProcessor.RETRYPOLICY, retryPolicy}, {CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy}}, - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory(), - inboxConfiguration: inboxConfiguration + var retryPolicy = Policy.Handle().Retry(); + var circuitBreakerPolicy = Policy.Handle().CircuitBreaker(1, TimeSpan.FromMilliseconds(1)); + var inboxConfiguration = new InboxConfiguration(_inbox, InboxScope.All, //grab all the events + onceOnly: true, //only allow once + actionOnExists: OnceOnlyAction.Throw //throw on duplicates (we should be the only entry after) ); - PipelineBuilder.ClearPipelineCache(); + _commandProcessor = new CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry { { CommandProcessor.RETRYPOLICY, retryPolicy }, { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy } }, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory(), inboxConfiguration: inboxConfiguration); } - - [Fact] - public void WhenInsertingADefaultInboxIntoThePublishPipeline() + [Test] + public async Task WhenInsertingADefaultInboxIntoThePublishPipeline() { //act var @event = new MyEvent(); _commandProcessor.Publish(@event); - //assert we are in, and auto-context added us under our name - var boxed = _inbox.Exists(@event.Id, typeof(MyGlobalInboxEventHandler).FullName, null, 100); - Assert.True(boxed); + var boxed = await _inbox.ExistsAsync(@event.Id, typeof(MyGlobalInboxEventHandler).FullName, null, 100); + await Assert.That(boxed).IsTrue(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Inserting_A_Default_Inbox_Into_The_Publish_Pipeline_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Inserting_A_Default_Inbox_Into_The_Publish_Pipeline_Async.cs index 8e330aa9db..e80ac00c73 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Inserting_A_Default_Inbox_Into_The_Publish_Pipeline_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Inserting_A_Default_Inbox_Into_The_Publish_Pipeline_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -8,7 +8,6 @@ using Paramore.Brighter.Inbox.Handlers; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -16,61 +15,34 @@ public class CommandProcessorBuildDefaultInboxPublishAsyncTests { private readonly CommandProcessor _commandProcessor; private readonly InMemoryInbox _inbox = new InMemoryInbox(new FakeTimeProvider()); - public CommandProcessorBuildDefaultInboxPublishAsyncTests() { var handler = new MyEventHandlerAsync(new Dictionary()); - var subscriberRegistry = new SubscriberRegistry(); //This handler has no Inbox attribute subscriberRegistry.RegisterAsync(); - var container = new ServiceCollection(); container.AddSingleton(handler); container.AddSingleton(_inbox); container.AddTransient>(); - container.AddSingleton( - new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - var retryPolicy = Policy - .Handle() - .RetryAsync(); - - var circuitBreakerPolicy = Policy - .Handle() - .CircuitBreakerAsync(1, TimeSpan.FromMilliseconds(1)); - - var inboxConfiguration = new InboxConfiguration( - _inbox //throw on duplicates (we should be the only entry after) - ); - - _commandProcessor = new CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry - { - { CommandProcessor.RETRYPOLICYASYNC, retryPolicy }, - { CommandProcessor.CIRCUITBREAKERASYNC, circuitBreakerPolicy } - }, - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory(), - inboxConfiguration: inboxConfiguration + var retryPolicy = Policy.Handle().RetryAsync(); + var circuitBreakerPolicy = Policy.Handle().CircuitBreakerAsync(1, TimeSpan.FromMilliseconds(1)); + var inboxConfiguration = new InboxConfiguration(_inbox //throw on duplicates (we should be the only entry after) ); + _commandProcessor = new CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry { { CommandProcessor.RETRYPOLICYASYNC, retryPolicy }, { CommandProcessor.CIRCUITBREAKERASYNC, circuitBreakerPolicy } }, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory(), inboxConfiguration: inboxConfiguration); } - [Fact] + [Test] public async Task WhenInsertingADefaultInboxIntoTheSendPipeline() { //act var @event = new MyEvent(); await _commandProcessor.SendAsync(@event); - //assert we are in, and auto-context added us under our name var boxed = await _inbox.ExistsAsync(@event.Id, typeof(MyEventHandlerAsync).FullName, null, 100); - Assert.True(boxed); + await Assert.That(boxed).IsTrue(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Inserting_A_Default_Inbox_Into_The_Send_Pipeline.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Inserting_A_Default_Inbox_Into_The_Send_Pipeline.cs index 336a1b74dc..68d5370c48 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Inserting_A_Default_Inbox_Into_The_Send_Pipeline.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Inserting_A_Default_Inbox_Into_The_Send_Pipeline.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Time.Testing; @@ -8,7 +8,6 @@ using Paramore.Brighter.Inbox.Handlers; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { @@ -17,63 +16,41 @@ public class CommandProcessorBuildDefaultInboxSendTests private readonly CommandProcessor _commandProcessor; private readonly ServiceProvider _provider; private readonly Dictionary _receivedMessages = new(); - public CommandProcessorBuildDefaultInboxSendTests() { var subscriberRegistry = new SubscriberRegistry(); //This handler has no Inbox attribute subscriberRegistry.Add(typeof(MyCommand), typeof(MyCommandHandler)); - var container = new ServiceCollection(); container.AddTransient(_ => new MyCommandHandler(_receivedMessages)); container.AddSingleton(new InMemoryInbox(new FakeTimeProvider())); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); _provider = container.BuildServiceProvider(); var handlerFactory = new ServiceProviderHandlerFactory(_provider); - - var retryPolicy = Policy - .Handle() - .Retry(); - - var circuitBreakerPolicy = Policy - .Handle() - .CircuitBreaker(1, TimeSpan.FromMilliseconds(1)); - - var inboxConfiguration = new InboxConfiguration( - new InMemoryInbox(new FakeTimeProvider()), - InboxScope.All, //grab all the events - onceOnly: true, //only allow once - actionOnExists: OnceOnlyAction.Throw //throw on duplicates (we should be the only entry after) + var retryPolicy = Policy.Handle().Retry(); + var circuitBreakerPolicy = Policy.Handle().CircuitBreaker(1, TimeSpan.FromMilliseconds(1)); + var inboxConfiguration = new InboxConfiguration(new InMemoryInbox(new FakeTimeProvider()), InboxScope.All, //grab all the events + onceOnly: true, //only allow once + actionOnExists: OnceOnlyAction.Throw //throw on duplicates (we should be the only entry after) ); - - _commandProcessor = new CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry {{CommandProcessor.RETRYPOLICY, retryPolicy}, {CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy}}, - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory(), - inboxConfiguration: inboxConfiguration - ); - - PipelineBuilder.ClearPipelineCache(); + _commandProcessor = new CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry { { CommandProcessor.RETRYPOLICY, retryPolicy }, { CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy } }, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory(), inboxConfiguration: inboxConfiguration); } - - [Fact] - public void WhenInsertingADefaultInboxIntoTheSendPipeline() + [Test] + public async Task WhenInsertingADefaultInboxIntoTheSendPipeline() { //act - var command = new MyCommand {Value = "Inbox Capture"}; + var command = new MyCommand + { + Value = "Inbox Capture" + }; _commandProcessor.Send(command); - //assert we are in, and auto-context added us under our name var inbox = _provider.GetService(); - Assert.NotNull(inbox); + await Assert.That(inbox).IsNotNull(); var boxed = inbox.Exists(command.Id, typeof(MyCommandHandler).FullName, null, 100); - Assert.True(boxed); + await Assert.That(boxed).IsTrue(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Inserting_A_Default_Inbox_Into_The_Send_Pipeline_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Inserting_A_Default_Inbox_Into_The_Send_Pipeline_Async.cs index e27fc61d61..13b796626e 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Inserting_A_Default_Inbox_Into_The_Send_Pipeline_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_Inserting_A_Default_Inbox_Into_The_Send_Pipeline_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -8,68 +8,44 @@ using Paramore.Brighter.Inbox.Handlers; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { - public class CommandProcessorBuildDefaultInboxSendAsyncTests + public class CommandProcessorBuildDefaultInboxSendAsyncTests { private readonly CommandProcessor _commandProcessor; private readonly InMemoryInbox _inbox = new(new FakeTimeProvider()); - public CommandProcessorBuildDefaultInboxSendAsyncTests() { - var handler = new MyCommandHandlerAsync(new Dictionary()); - - var subscriberRegistry = new SubscriberRegistry(); - //This handler has no Inbox attribute - subscriberRegistry.RegisterAsync(); - - var container = new ServiceCollection(); - container.AddSingleton(handler); - container.AddSingleton(_inbox); - container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + var handler = new MyCommandHandlerAsync(new Dictionary()); + var subscriberRegistry = new SubscriberRegistry(); + //This handler has no Inbox attribute + subscriberRegistry.RegisterAsync(); + var container = new ServiceCollection(); + container.AddSingleton(handler); + container.AddSingleton(_inbox); + container.AddTransient>(); + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - var retryPolicy = Policy - .Handle() - .RetryAsync(); - - var circuitBreakerPolicy = Policy - .Handle() - .CircuitBreakerAsync(1, TimeSpan.FromMilliseconds(1)); - - var inboxConfiguration = new InboxConfiguration( - _inbox //throw on duplicates (we should be the only entry after) + var retryPolicy = Policy.Handle().RetryAsync(); + var circuitBreakerPolicy = Policy.Handle().CircuitBreakerAsync(1, TimeSpan.FromMilliseconds(1)); + var inboxConfiguration = new InboxConfiguration(_inbox //throw on duplicates (we should be the only entry after) ); - - _commandProcessor = new CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry - { - { CommandProcessor.RETRYPOLICYASYNC, retryPolicy }, - { CommandProcessor.CIRCUITBREAKERASYNC, circuitBreakerPolicy } - }, - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory(), - inboxConfiguration: inboxConfiguration - ); + _commandProcessor = new CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry { { CommandProcessor.RETRYPOLICYASYNC, retryPolicy }, { CommandProcessor.CIRCUITBREAKERASYNC, circuitBreakerPolicy } }, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory(), inboxConfiguration: inboxConfiguration); } - - [Fact] + + [Test] public async Task WhenInsertingADefaultInboxIntoTheSendPipeline() { //act - var command = new MyCommand {Value = "Inbox Capture"}; + var command = new MyCommand + { + Value = "Inbox Capture" + }; await _commandProcessor.SendAsync(command); - //assert we are in, and auto-context added us under our name var boxed = await _inbox.ExistsAsync(command.Id, typeof(MyCommandHandlerAsync).FullName, null, 100); - Assert.True(boxed); + await Assert.That(boxed).IsTrue(); } - } -} + } +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_There_Is_No_Sync_Or_Async_Handler_Factories.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_There_Is_No_Sync_Or_Async_Handler_Factories.cs index 6be19d6d8f..cc26c0905e 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_There_Is_No_Sync_Or_Async_Handler_Factories.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_There_Is_No_Sync_Or_Async_Handler_Factories.cs @@ -1,57 +1,37 @@ -using System; +using System; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Extensions.DependencyInjection; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline; - public class CommandProcessorNoHandlerFactoriesTests { private Exception _exception; - - [Fact] - public void When_There_Are_No_Command_Handlers_Async() + [Test] + public async Task When_There_Are_No_Command_Handlers_Async() { var container = new ServiceCollection(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - _exception = Catch.Exception(() => new CommandProcessor( - new SubscriberRegistry(), - null, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory())); - - Assert.IsType(_exception); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); + _exception = Catch.Exception(() => new CommandProcessor(new SubscriberRegistry(), null, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory())); + await Assert.That(_exception).IsTypeOf(); //_should_have_an_error_message_that_tells_you_why - Assert.NotNull(_exception); - Assert.Contains("No HandlerFactory has been set - either an instance of IAmAHandlerFactorySync or IAmAHandlerFactoryAsync needs to be set", _exception.Message); + await Assert.That(_exception).IsNotNull(); + await Assert.That(_exception.Message).Contains("No HandlerFactory has been set - either an instance of IAmAHandlerFactorySync or IAmAHandlerFactoryAsync needs to be set"); } - [Fact] - public void When_using_IAmAHandlerFactory() + [Test] + public async Task When_using_IAmAHandlerFactory() { var container = new ServiceCollection(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - _exception = Catch.Exception(() => new CommandProcessor( - new SubscriberRegistry(), - new DummyHandlerFactory(), - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory())); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); + _exception = Catch.Exception(() => new CommandProcessor(new SubscriberRegistry(), new DummyHandlerFactory(), new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory())); //_should_fail_because_no_handler_factories_have_been_set - Assert.IsType(_exception); - + await Assert.That(_exception).IsTypeOf(); //_should_have_an_error_message_that_tells_you_why - Assert.NotNull(_exception); - Assert.Contains("No HandlerFactory has been set - either an instance of IAmAHandlerFactorySync or IAmAHandlerFactoryAsync needs to be set", _exception.Message); + await Assert.That(_exception).IsNotNull(); + await Assert.That(_exception.Message).Contains("No HandlerFactory has been set - either an instance of IAmAHandlerFactorySync or IAmAHandlerFactoryAsync needs to be set"); } - sealed class DummyHandlerFactory : IAmAHandlerFactory; -} + + sealed class DummyHandlerFactory : Paramore.Brighter.IAmAHandlerFactory; +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_We_Have_Exercised_The_Pipeline_Cleanup_Its_Handlers.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_We_Have_Exercised_The_Pipeline_Cleanup_Its_Handlers.cs index 7296f95fc8..9d6aa29aec 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_We_Have_Exercised_The_Pipeline_Cleanup_Its_Handlers.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Pipeline/When_We_Have_Exercised_The_Pipeline_Cleanup_Its_Handlers.cs @@ -1,39 +1,34 @@ using System; using System.Linq; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Pipeline { public class PipelineCleanupTests { private readonly PipelineBuilder _pipelineBuilder; - private static string s_released; - + private string _released; public PipelineCleanupTests() { - s_released = string.Empty; - + _released = string.Empty; var registry = new SubscriberRegistry(); registry.Register(); registry.Register>(); - - var handlerFactory = new CheapHandlerFactorySync(); - + var handlerFactory = new CheapHandlerFactorySync(this); _pipelineBuilder = new PipelineBuilder(registry, handlerFactory); _pipelineBuilder.Build(new MyCommand(), new RequestContext()).Any(); } - [Fact] - public void When_We_Have_Exercised_The_Pipeline_Cleanup_Its_Handlers() + [Test] + public async Task When_We_Have_Exercised_The_Pipeline_Cleanup_Its_Handlers() { _pipelineBuilder.Dispose(); - - Assert.True(MyPreAndPostDecoratedHandler.DisposeWasCalled); - Assert.True(MyLoggingHandler.DisposeWasCalled); - Assert.Equal("|MyValidationHandler`1|MyPreAndPostDecoratedHandler|MyLoggingHandler`1|MyLoggingHandler`1", s_released); + await Assert.That(MyPreAndPostDecoratedHandler.DisposeWasCalled).IsTrue(); + await Assert.That(MyLoggingHandler.DisposeWasCalled).IsTrue(); + await Assert.That(_released).IsEqualTo("|MyValidationHandler`1|MyPreAndPostDecoratedHandler|MyLoggingHandler`1|MyLoggingHandler`1"); } - internal sealed class CheapHandlerFactorySync : IAmAHandlerFactorySync + + internal sealed class CheapHandlerFactorySync(PipelineCleanupTests owner) : Paramore.Brighter.IAmAHandlerFactorySync, Paramore.Brighter.IAmAHandlerFactory { public IHandleRequests Create(Type handlerType, IAmALifetime lifetime) { @@ -41,14 +36,17 @@ public IHandleRequests Create(Type handlerType, IAmALifetime lifetime) { return new MyPreAndPostDecoratedHandler(); } + if (handlerType == typeof(MyLoggingHandler)) { return new MyLoggingHandler(); } + if (handlerType == typeof(MyValidationHandler)) { return new MyValidationHandler(); } + return null; } @@ -56,9 +54,8 @@ public void Release(IHandleRequests handler, IAmALifetime lifetime) { var disposable = handler as IDisposable; disposable?.Dispose(); - - s_released += "|" + handler.Name; + owner._released += "|" + handler.Name; } } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_And_There_Is_No_Message_Mapper_Registry.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_And_There_Is_No_Message_Mapper_Registry.cs index 92419862d2..a422f68406 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_And_There_Is_No_Message_Mapper_Registry.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_And_There_Is_No_Message_Mapper_Registry.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Transactions; using Microsoft.Extensions.Time.Testing; @@ -7,7 +7,6 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Post { @@ -15,56 +14,29 @@ public class CommandProcessorNoMessageMapperTests { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new(); - public CommandProcessorNoMessageMapperTests() { var routingKey = new RoutingKey("MyCommand"); _myCommand.Value = "Hello World"; - var timeProvider = new FakeTimeProvider(); - InMemoryMessageProducer messageProducer = - new(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyCommand) }); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), - null); - - var producerRegistry = new ProducerRegistry(new Dictionary - { - { routingKey, messageProducer }, - }); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + InMemoryMessageProducer messageProducer = new(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyCommand) }); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), null); + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, messageProducer }, }); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(timeProvider); - var outbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - outbox - ); - - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - new InMemorySchedulerFactory() - ); + var outbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), outbox); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, new InMemorySchedulerFactory()); } - [Fact] - public void When_Posting_A_Message_And_There_Is_No_Message_Mapper_Factory() + [Test] + public async Task When_Posting_A_Message_And_There_Is_No_Message_Mapper_Factory() { var exception = Catch.Exception(() => _commandProcessor.Post(_myCommand)); - Assert.IsType(exception); + await Assert.That(exception).IsTypeOf(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_And_There_Is_No_Message_Mapper_Registry_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_And_There_Is_No_Message_Mapper_Registry_Async.cs index 116c414006..6bbd5fbfd0 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_And_There_Is_No_Message_Mapper_Registry_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_And_There_Is_No_Message_Mapper_Registry_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using System.Transactions; @@ -8,7 +8,6 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Post { @@ -16,53 +15,29 @@ public class CommandProcessorNoMessageMapperAsyncTests { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new(); - public CommandProcessorNoMessageMapperAsyncTests() { var routingKey = new RoutingKey("MyCommand"); _myCommand.Value = "Hello World"; - var timeProvider = new FakeTimeProvider(); - InMemoryMessageProducer messageProducer = - new(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyCommand) }); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), - null); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - - var producerRegistry = new ProducerRegistry(new Dictionary {{routingKey, messageProducer},}); - + InMemoryMessageProducer messageProducer = new(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyCommand) }); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), null); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, messageProducer }, }); var tracer = new BrighterTracer(timeProvider); - var outbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - outbox - ); - - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - new InMemorySchedulerFactory() - ); + var outbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), outbox); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task When_Posting_A_Message_And_There_Is_No_Message_Mapper_Factory_Async() { var exception = await Catch.ExceptionAsync(() => _commandProcessor.PostAsync(_myCommand)); - Assert.IsType(exception); + await Assert.That(exception).IsTypeOf(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_And_There_Is_No_Message_Producer.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_And_There_Is_No_Message_Producer.cs index fe2ee4b416..e75b9f6462 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_And_There_Is_No_Message_Producer.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_And_There_Is_No_Message_Producer.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Transactions; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; @@ -6,7 +6,6 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Post { @@ -16,38 +15,25 @@ public class CommandProcessorPostMissingMessageProducerTests private readonly InMemoryOutbox _outbox; private readonly MessageMapperRegistry _messageMapperRegistry; private readonly IAmABrighterTracer _tracer; - public CommandProcessorPostMissingMessageProducerTests() { _myCommand.Value = "Hello World"; - var timeProvider = new FakeTimeProvider(); _tracer = new BrighterTracer(timeProvider); - _outbox = new InMemoryOutbox(timeProvider) {Tracer = _tracer}; - - _messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), null); + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = _tracer + }; + _messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), null); _messageMapperRegistry.Register(); } - [Fact] - public void When_Creating_A_Command_Processor_Without_Producer_Registry() + [Test] + public async Task When_Creating_A_Command_Processor_Without_Producer_Registry() { - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - - var exception = Catch.Exception(() => new OutboxProducerMediator( - null!, - resiliencePipelineRegistry, - _messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - _tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox) - ); - - Assert.IsType(exception); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); + var exception = Catch.Exception(() => new OutboxProducerMediator(null!, resiliencePipelineRegistry, _messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), _tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox)); + await Assert.That(exception).IsTypeOf(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_And_There_Is_No_Message_Transformer.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_And_There_Is_No_Message_Transformer.cs index e344c525a7..ad9231c3a3 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_And_There_Is_No_Message_Transformer.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_And_There_Is_No_Message_Transformer.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Transactions; using Microsoft.Extensions.Time.Testing; @@ -7,7 +7,6 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Post { @@ -19,48 +18,27 @@ public class CommandProcessorPostMissingMessageTransformerTests private readonly MessageMapperRegistry _messageMapperRegistry; private readonly ProducerRegistry _producerRegistry; private readonly IAmABrighterTracer _tracer; - public CommandProcessorPostMissingMessageTransformerTests() { _myCommand.Value = "Hello World"; - var timeProvider = new FakeTimeProvider(); _tracer = new BrighterTracer(timeProvider); - _outbox = new InMemoryOutbox(timeProvider) {Tracer = _tracer}; - + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = _tracer + }; var routingKey = new RoutingKey("MyTopic"); - - _messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), - null); + _messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), null); _messageMapperRegistry.Register(); + _producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyCommand) }) }, }); + } - _producerRegistry = new ProducerRegistry(new Dictionary - { - { - routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication {Topic = routingKey, RequestType = typeof(MyCommand) }) - }, - }); - } - - [Fact] - public void When_Creating_A_Command_Processor_Without_Message_Transformer() - { - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - - var exception = Catch.Exception(() => new OutboxProducerMediator( - _producerRegistry, - resiliencePipelineRegistry, - _messageMapperRegistry, - null!, - new EmptyMessageTransformerFactoryAsync(), - _tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox) - ); - - Assert.IsType(exception); + [Test] + public async Task When_Creating_A_Command_Processor_Without_Message_Transformer() + { + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); + var exception = Catch.Exception(() => new OutboxProducerMediator(_producerRegistry, resiliencePipelineRegistry, _messageMapperRegistry, null!, new EmptyMessageTransformerFactoryAsync(), _tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox)); + await Assert.That(exception).IsTypeOf(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_And_There_Is_No_Message_Transformer_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_And_There_Is_No_Message_Transformer_Async.cs index aaf7090250..929ff286ef 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_And_There_Is_No_Message_Transformer_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_And_There_Is_No_Message_Transformer_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Transactions; using Microsoft.Extensions.Time.Testing; @@ -7,7 +7,6 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Post { @@ -18,47 +17,27 @@ public class CommandProcessorPostMissingMessageTransformerTestsAsync private readonly MessageMapperRegistry _messageMapperRegistry; private readonly ProducerRegistry _producerRegistry; private readonly IAmABrighterTracer _tracer; - public CommandProcessorPostMissingMessageTransformerTestsAsync() { _myCommand.Value = "Hello World"; - var timeProvider = new FakeTimeProvider(); _tracer = new BrighterTracer(timeProvider); - _outbox = new InMemoryOutbox(timeProvider) {Tracer = _tracer}; - - _messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), null); + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = _tracer + }; + _messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), null); _messageMapperRegistry.Register(); - var routingKey = new RoutingKey("MyTopic"); - - _producerRegistry = new ProducerRegistry(new Dictionary - { - { - routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyCommand) }) - } - }); - } - - [Fact] - public void When_Creating_A_Command_Processor_Without_Message_Transformer_Async() - { - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - - var exception = Catch.Exception(() => new OutboxProducerMediator( - _producerRegistry, - resiliencePipelineRegistry, - _messageMapperRegistry, - new EmptyMessageTransformerFactory(), - null!, - _tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox) - ); + _producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyCommand) }) } }); + } - Assert.IsType(exception); + [Test] + public async Task When_Creating_A_Command_Processor_Without_Message_Transformer_Async() + { + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); + var exception = Catch.Exception(() => new OutboxProducerMediator(_producerRegistry, resiliencePipelineRegistry, _messageMapperRegistry, new EmptyMessageTransformerFactory(), null!, _tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox)); + await Assert.That(exception).IsTypeOf(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_To_The_Command_Processor.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_To_The_Command_Processor.cs index 1347addfe1..bfca7bcecb 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_To_The_Command_Processor.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_To_The_Command_Processor.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Net.Mime; @@ -11,7 +11,6 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Post { @@ -26,83 +25,30 @@ public class CommandProcessorPostCommandTests private readonly PartitionKey _partitionKey = new(Uuid.NewAsString()); private readonly Id _workflowId = Id.Random(); private readonly Id _jobId = Id.Random(); - public CommandProcessorPostCommandTests() { _myCommand.Value = "Hello World"; _myCommand.CorrelationId = Id.Random(); - var timeProvider = new FakeTimeProvider(); var routingKey = new RoutingKey(Topic); - var cloudEventsType = new CloudEventsType("go.paramore.brighter.test"); - - InMemoryMessageProducer messageProducer = new(_internalBus, - new Publication() - { - DataSchema = new Uri("https://goparamore.io/schemas/MyCommand.json"), - Source = new Uri("https://goparamore.io"), - Subject = "MyCommand", - Topic = routingKey, - Type = cloudEventsType, - ReplyTo = "MyEvent", - RequestType = typeof(MyCommand) - }); - - _expectedMessage = new Message( - new MessageHeader( - messageId:_myCommand.Id, - topic: routingKey, - messageType: MessageType.MT_COMMAND, - source: messageProducer.Publication.Source, - type: messageProducer.Publication.Type, - correlationId: _myCommand.CorrelationId, - replyTo: messageProducer.Publication.ReplyTo, - contentType: new ContentType(MediaTypeNames.Application.Json){CharSet = CharacterEncoding.UTF8.FromCharacterEncoding()}, - partitionKey: _partitionKey, - dataSchema: messageProducer.Publication.DataSchema, - subject: messageProducer.Publication.Subject, - workflowId: _workflowId, - jobId: _jobId - ), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), - null); + InMemoryMessageProducer messageProducer = new(_internalBus, new Publication() { DataSchema = new Uri("https://goparamore.io/schemas/MyCommand.json"), Source = new Uri("https://goparamore.io"), Subject = "MyCommand", Topic = routingKey, Type = cloudEventsType, ReplyTo = "MyEvent", RequestType = typeof(MyCommand) }); + _expectedMessage = new Message(new MessageHeader(messageId: _myCommand.Id, topic: routingKey, messageType: MessageType.MT_COMMAND, source: messageProducer.Publication.Source, type: messageProducer.Publication.Type, correlationId: _myCommand.CorrelationId, replyTo: messageProducer.Publication.ReplyTo, contentType: new ContentType(MediaTypeNames.Application.Json) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }, partitionKey: _partitionKey, dataSchema: messageProducer.Publication.DataSchema, subject: messageProducer.Publication.Subject, workflowId: _workflowId, jobId: _jobId), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - - var producerRegistry = new ProducerRegistry(new Dictionary {{new (routingKey, cloudEventsType), messageProducer},}); - + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); + var producerRegistry = new ProducerRegistry(new Dictionary { { new(routingKey, cloudEventsType), messageProducer }, }); var tracer = new BrighterTracer(timeProvider); - _outbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox - ); - - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - new InMemorySchedulerFactory() - ); + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, new InMemorySchedulerFactory()); } - [Fact] - public void When_Posting_A_Message_To_The_Command_Processor() + [Test] + public async Task When_Posting_A_Message_To_The_Command_Processor() { var requestContext = new RequestContext { @@ -113,15 +59,11 @@ public void When_Posting_A_Message_To_The_Command_Processor() [RequestContextBagNames.JobId] = _jobId } }; - _commandProcessor.Post(_myCommand, requestContext); - - Assert.True(_internalBus.Stream(new RoutingKey(Topic)).Any()); - - var message = _outbox.Get(_myCommand.Id, requestContext); - Assert.NotNull(message); - - Assert.Equal(_expectedMessage, message); + await Assert.That(_internalBus.Stream(new RoutingKey(Topic)).Any()).IsTrue(); + var message = await _outbox.GetAsync(_myCommand.Id, requestContext); + await Assert.That(message).IsNotNull(); + await Assert.That(message).IsEqualTo(_expectedMessage); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_To_The_Command_Processor_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_To_The_Command_Processor_Async.cs index b6ba031e9b..8037b02777 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_To_The_Command_Processor_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_To_The_Command_Processor_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -12,7 +12,6 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Post { @@ -27,81 +26,28 @@ public class CommandProcessorPostCommandAsyncTests private readonly PartitionKey _partitionKey = new(Id.Random()); private readonly Id _workflowId = Id.Random(); private readonly Id _jobId = Id.Random(); - public CommandProcessorPostCommandAsyncTests() { _myCommand.Value = "Hello World"; _routingKey = new RoutingKey("MyCommand"); - var timeProvider = new FakeTimeProvider(); var cloudEventsType = new CloudEventsType("go.paramore.brighter.test"); - - InMemoryMessageProducer messageProducer = new(_internalBus, - new Publication() - { - DataSchema = new Uri("https://goparamore.io/schemas/MyCommand.json"), - Source = new Uri("https://goparamore.io"), - Subject = "MyCommand", - Topic = _routingKey, - Type = cloudEventsType, - ReplyTo = "MyEvent", - RequestType = typeof(MyCommand) - }); - - _expectedMessage = new Message( - new MessageHeader( - messageId:_myCommand.Id, - topic: _routingKey, - messageType: MessageType.MT_COMMAND, - source: messageProducer.Publication.Source, - type: messageProducer.Publication.Type, - correlationId: _myCommand.CorrelationId, - replyTo: messageProducer.Publication.ReplyTo, - contentType: new ContentType(MediaTypeNames.Application.Json){CharSet = CharacterEncoding.UTF8.FromCharacterEncoding()}, - partitionKey: _partitionKey, - dataSchema: messageProducer.Publication.DataSchema, - subject: messageProducer.Publication.Subject, - workflowId: _workflowId, - jobId: _jobId - ), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyCommandMessageMapperAsync()) - ); + InMemoryMessageProducer messageProducer = new(_internalBus, new Publication() { DataSchema = new Uri("https://goparamore.io/schemas/MyCommand.json"), Source = new Uri("https://goparamore.io"), Subject = "MyCommand", Topic = _routingKey, Type = cloudEventsType, ReplyTo = "MyEvent", RequestType = typeof(MyCommand) }); + _expectedMessage = new Message(new MessageHeader(messageId: _myCommand.Id, topic: _routingKey, messageType: MessageType.MT_COMMAND, source: messageProducer.Publication.Source, type: messageProducer.Publication.Type, correlationId: _myCommand.CorrelationId, replyTo: messageProducer.Publication.ReplyTo, contentType: new ContentType(MediaTypeNames.Application.Json) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }, partitionKey: _partitionKey, dataSchema: messageProducer.Publication.DataSchema, subject: messageProducer.Publication.Subject, workflowId: _workflowId, jobId: _jobId), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyCommandMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - - var producerRegistry = new ProducerRegistry(new Dictionary {{new ProducerKey(_routingKey, cloudEventsType) , messageProducer},}); - - var tracer = new BrighterTracer(timeProvider); - _outbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox - ); - - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - new InMemorySchedulerFactory() - ); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); + var producerRegistry = new ProducerRegistry(new Dictionary { { new ProducerKey(_routingKey, cloudEventsType), messageProducer }, }); + var tracer = new BrighterTracer(timeProvider); + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task When_Posting_A_Message_To_The_Command_Processor_Async() { var requestContext = new RequestContext @@ -113,17 +59,12 @@ public async Task When_Posting_A_Message_To_The_Command_Processor_Async() [RequestContextBagNames.JobId] = _jobId } }; - await _commandProcessor.PostAsync(_myCommand, requestContext); - - Assert.True(_internalBus.Stream(_routingKey).Any()); - + await Assert.That(_internalBus.Stream(_routingKey).Any()).IsTrue(); var message = await _outbox.GetAsync(_myCommand.Id, requestContext); - Assert.NotNull(message); - + await Assert.That(message).IsNotNull(); Debug.Assert(_expectedMessage == message); - Assert.Equal(_expectedMessage, message); - + await Assert.That(message).IsEqualTo(_expectedMessage); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_To_The_Command_Processor_With_A_Transaction_Provider.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_To_The_Command_Processor_With_A_Transaction_Provider.cs index 34b5d4ae84..bf1d0b67b6 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_To_The_Command_Processor_With_A_Transaction_Provider.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_To_The_Command_Processor_With_A_Transaction_Provider.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2015 Ian Cooper +Copyright � 2015 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the �Software�), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED �AS IS�, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Collections.Generic; using System.Linq; @@ -33,7 +31,6 @@ THE SOFTWARE. */ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Post { @@ -46,74 +43,42 @@ public class CommandProcessorPostCommandWithTransactionProviderTests private readonly SpyOutbox _spyOutbox; private readonly SpyTransactionProvider _transactionProvider; private readonly InternalBus _internalBus = new(); - public CommandProcessorPostCommandWithTransactionProviderTests() { _myCommand.Value = "Hello World"; - var timeProvider = new FakeTimeProvider(); var routingKey = new RoutingKey(Topic); - - InMemoryMessageProducer messageProducer = new(_internalBus, new Publication {Topic = routingKey, RequestType = typeof(MyCommand)}); - - _message = new Message( - new MessageHeader(_myCommand.Id, routingKey, MessageType.MT_COMMAND, contentType: new ContentType(MediaTypeNames.Application.Json) {CharSet = CharacterEncoding.UTF8.FromCharacterEncoding()}), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), - null); + InMemoryMessageProducer messageProducer = new(_internalBus, new Publication { Topic = routingKey, RequestType = typeof(MyCommand) }); + _message = new Message(new MessageHeader(_myCommand.Id, routingKey, MessageType.MT_COMMAND, contentType: new ContentType(MediaTypeNames.Application.Json) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - - var producerRegistry = new ProducerRegistry(new Dictionary {{routingKey, messageProducer},}); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, messageProducer }, }); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(timeProvider); - _spyOutbox = new SpyOutbox {Tracer = tracer}; + _spyOutbox = new SpyOutbox + { + Tracer = tracer + }; _transactionProvider = new SpyTransactionProvider(); - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _spyOutbox - ); - + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _spyOutbox); var scheduler = new InMemorySchedulerFactory(); - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - new ResiliencePipelineRegistry(), - bus, - scheduler, - typeof(SpyTransaction) - ); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), new ResiliencePipelineRegistry(), bus, scheduler, typeof(SpyTransaction)); } - [Fact] - public void When_Posting_A_Message_To_The_Command_Processor_With_A_Transaction_Provider_Configured() + [Test] + public async Task When_Posting_A_Message_To_The_Command_Processor_With_A_Transaction_Provider_Configured() { var requestContext = new RequestContext(); _commandProcessor.Post(_myCommand, requestContext); - //message should not be in the current transaction - var transaction = _transactionProvider.GetTransaction(); - Assert.Null(transaction.Get(_myCommand.Id)); - + var transaction = await _transactionProvider.GetTransactionAsync(); + await Assert.That(transaction.Get(_myCommand.Id)).IsNull(); //message should have been posted - Assert.True(_internalBus.Stream(new RoutingKey(Topic)).Any()); - + await Assert.That(_internalBus.Stream(new RoutingKey(Topic)).Any()).IsTrue(); //message should be in the outbox - var message = _spyOutbox.Get(_myCommand.Id, requestContext); - Assert.NotNull(message); - Assert.Equal(_message, message); + var message = await _spyOutbox.GetAsync(_myCommand.Id, requestContext); + await Assert.That(message).IsNotNull(); + await Assert.That(message).IsEqualTo(_message); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_To_The_Command_Processor_With_A_Transaction_Provider_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_To_The_Command_Processor_With_A_Transaction_Provider_Async.cs index 1ee27d6c80..3929111576 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_To_The_Command_Processor_With_A_Transaction_Provider_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_A_Message_To_The_Command_Processor_With_A_Transaction_Provider_Async.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2015 Ian Cooper +Copyright � 2015 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the �Software�), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED �AS IS�, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Collections.Generic; using System.Linq; @@ -34,7 +32,6 @@ THE SOFTWARE. */ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Post { @@ -47,73 +44,41 @@ public class CommandProcessorPostCommandWithTransactionProviderTestsAsync private readonly SpyOutbox _spyOutbox; private readonly SpyTransactionProvider _transactionProvider; private readonly InternalBus _internalBus = new(); - public CommandProcessorPostCommandWithTransactionProviderTestsAsync() { _myCommand.Value = "Hello World"; - var timeProvider = new FakeTimeProvider(); var routingKey = new RoutingKey(Topic); - - InMemoryMessageProducer messageProducer = new(_internalBus, new Publication {Topic = routingKey, RequestType = typeof(MyCommand)}); - - _message = new Message( - new MessageHeader(_myCommand.Id, routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyCommandMessageMapperAsync()) - ); + InMemoryMessageProducer messageProducer = new(_internalBus, new Publication { Topic = routingKey, RequestType = typeof(MyCommand) }); + _message = new Message(new MessageHeader(_myCommand.Id, routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyCommandMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - var producerRegistry = new ProducerRegistry(new Dictionary {{routingKey, messageProducer},}); - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, messageProducer }, }); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(timeProvider); - _spyOutbox = new SpyOutbox() {Tracer = tracer}; + _spyOutbox = new SpyOutbox() + { + Tracer = tracer + }; _transactionProvider = new SpyTransactionProvider(); - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _spyOutbox - ); - + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _spyOutbox); var scheduler = new InMemorySchedulerFactory(); - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - scheduler, - typeof(SpyTransaction) - ); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, scheduler, typeof(SpyTransaction)); } - [Fact] + [Test] public async Task When_Posting_A_Message_To_The_Command_Processor_With_A_Transaction_Provider_Configured_Async() { await _commandProcessor.PostAsync(_myCommand); - //message should not be in the current transaction - var transaction = _transactionProvider.GetTransaction(); - Assert.Null(transaction.Get(_myCommand.Id)); - + var transaction = await _transactionProvider.GetTransactionAsync(); + await Assert.That(transaction.Get(_myCommand.Id)).IsNull(); //message should have been posted - Assert.True(_internalBus.Stream(new RoutingKey(Topic)).Any()); - + await Assert.That(_internalBus.Stream(new RoutingKey(Topic)).Any()).IsTrue(); //message should be in the outbox - var message = _spyOutbox.Get(_myCommand.Id, new RequestContext()); - Assert.NotNull(message); - Assert.Equal(_message, message); + var message = await _spyOutbox.GetAsync(_myCommand.Id, new RequestContext()); + await Assert.That(message).IsNotNull(); + await Assert.That(message).IsEqualTo(_message); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_Fails_Limit_Total_Writes_To_OutBox_In_Window.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_Fails_Limit_Total_Writes_To_OutBox_In_Window.cs index bb4e067561..745307b3e8 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_Fails_Limit_Total_Writes_To_OutBox_In_Window.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_Fails_Limit_Total_Writes_To_OutBox_In_Window.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -8,7 +8,6 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Post { @@ -17,91 +16,74 @@ public class PostFailureLimitCommandTests private readonly CommandProcessor _commandProcessor; private readonly InMemoryOutbox _outbox; private readonly FakeTimeProvider _timeProvider; - public PostFailureLimitCommandTests() { var routingKey = new RoutingKey("MyCommand"); - - IAmAMessageProducer producer = new FakeErroringMessageProducerSync{Publication = { Topic = routingKey, RequestType = typeof(MyCommand)}}; - - var messageMapperRegistry = - new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), - null); + IAmAMessageProducer producer = new FakeErroringMessageProducerSync + { + Publication = + { + Topic = routingKey, + RequestType = typeof(MyCommand) + } + }; + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - _timeProvider = new FakeTimeProvider(); var tracer = new BrighterTracer(); - _outbox = new InMemoryOutbox(_timeProvider) {Tracer = tracer}; - - var producerRegistry = - new ProducerRegistry(new Dictionary { { routingKey, producer }, }); - - var externalBus = new OutboxProducerMediator( - producerRegistry: producerRegistry, - resiliencePipelineRegistry: new ResiliencePipelineRegistry().AddBrighterDefault(), - mapperRegistry: messageMapperRegistry, - messageTransformerFactory: new EmptyMessageTransformerFactory(), - messageTransformerFactoryAsync: new EmptyMessageTransformerFactoryAsync(), - tracer, - outbox: _outbox, - maxOutStandingMessages:3, - maxOutStandingCheckInterval: TimeSpan.FromMilliseconds(250), - publicationFinder: new FindPublicationByPublicationTopicOrRequestType() - ); - - _commandProcessor = CommandProcessorBuilder.StartNew() - .Handlers(new HandlerConfiguration(new SubscriberRegistry(), new EmptyHandlerFactorySync())) - .DefaultResilience() - .ExternalBus(ExternalBusType.FireAndForget, externalBus) - .ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All) - .RequestContextFactory(new InMemoryRequestContextFactory()) - .RequestSchedulerFactory(new InMemorySchedulerFactory()) - .Build(); + _outbox = new InMemoryOutbox(_timeProvider) + { + Tracer = tracer + }; + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, producer }, }); + var externalBus = new OutboxProducerMediator(producerRegistry: producerRegistry, resiliencePipelineRegistry: new ResiliencePipelineRegistry().AddBrighterDefault(), mapperRegistry: messageMapperRegistry, messageTransformerFactory: new EmptyMessageTransformerFactory(), messageTransformerFactoryAsync: new EmptyMessageTransformerFactoryAsync(), tracer, outbox: _outbox, maxOutStandingMessages: 3, maxOutStandingCheckInterval: TimeSpan.FromMilliseconds(250), publicationFinder: new FindPublicationByPublicationTopicOrRequestType()); + _commandProcessor = CommandProcessorBuilder.StartNew().Handlers(new HandlerConfiguration(new SubscriberRegistry(), new EmptyHandlerFactorySync())).DefaultResilience().ExternalBus(ExternalBusType.FireAndForget, externalBus).ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All).RequestContextFactory(new InMemoryRequestContextFactory()).RequestSchedulerFactory(new InMemorySchedulerFactory()).Build(); } - [Fact] + [Test] public async Task When_Posting_Fails_Limit_Total_Writes_To_OutBox_In_Window() { - var sentList = new List(); + var sentList = new List(); bool shouldThrowException = false; try { do { - var command = new MyCommand{Value = $"Hello World: {sentList.Count + 1}"}; + var command = new MyCommand + { + Value = $"Hello World: {sentList.Count + 1}"}; _commandProcessor.Post(command); sentList.Add(command.Id); - _timeProvider.Advance(TimeSpan.FromMilliseconds(500)); - //We need to wait for the sweeper thread to check the outstanding in the outbox await Task.Delay(50); - - } while (sentList.Count < 10); + } + while (sentList.Count < 10); } catch (OutboxLimitReachedException) { shouldThrowException = true; } - + //We should error before the end - Assert.True(shouldThrowException); - + await Assert.That(shouldThrowException).IsTrue(); //should store the message in the sent outbox foreach (var id in sentList) { - Assert.NotNull( await _outbox.GetAsync(id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(id, new RequestContext())).IsNotNull(); } } - internal sealed class EmptyHandlerFactorySync : IAmAHandlerFactorySync + + internal sealed class EmptyHandlerFactorySync : Paramore.Brighter.IAmAHandlerFactorySync, Paramore.Brighter.IAmAHandlerFactory { public IHandleRequests Create(Type handlerType, IAmALifetime lifetime) { return null!; } - public void Release(IHandleRequests handler, IAmALifetime lifetime) {} + public void Release(IHandleRequests handler, IAmALifetime lifetime) + { + } } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_Multiple_Message_Types_To_A_Single_Topic.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_Multiple_Message_Types_To_A_Single_Topic.cs index d633a1f831..009878a5c1 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_Multiple_Message_Types_To_A_Single_Topic.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_Multiple_Message_Types_To_A_Single_Topic.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -11,7 +11,6 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; using MyCommand = Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles.MyCommand; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Post @@ -26,105 +25,58 @@ public class CommandProcessorPostCommandMultiChannelTopicTests private readonly Message _messageTwo; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); - - public CommandProcessorPostCommandMultiChannelTopicTests () + public CommandProcessorPostCommandMultiChannelTopicTests() { _myCommand.Value = "Hello World"; - var timeProvider = new FakeTimeProvider(); var routingKey = new RoutingKey(Topic); - var cloudEventsType = new CloudEventsType("io.goparamore.brighter.mycommand"); var otherEventsType = new CloudEventsType("io.goparamore.brighter.myothercommand"); - - var messageProducer = new InMemoryMessageProducer( - _internalBus, - new Publication - { - Topic = routingKey, - Type = cloudEventsType, - RequestType = typeof(MyCommand) - } - ); - + var messageProducer = new InMemoryMessageProducer(_internalBus, new Publication { Topic = routingKey, Type = cloudEventsType, RequestType = typeof(MyCommand) }); //This producer is for a different command type, but the same topic - var otherMessageProducer = new InMemoryMessageProducer( - _internalBus, - new Publication - { - Topic = routingKey, - Type = otherEventsType, - RequestType = typeof(MyOtherCommand) - }); - - _message = new Message( - new MessageHeader(_myCommand.Id, routingKey, MessageType.MT_COMMAND, type: cloudEventsType), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - _messageTwo = new Message( - new MessageHeader(_myOtherCommand.Id, routingKey, MessageType.MT_COMMAND, type: otherEventsType), - new MessageBody(JsonSerializer.Serialize(_myOtherCommand, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((mapperType) => mapperType switch - { - var t when mapperType == typeof(MyCommandMessageMapper) => new MyCommandMessageMapper(), - var t when mapperType == typeof(MyOtherCommandMessageMapper) => new MyOtherCommandMessageMapper() - }), - null); + var otherMessageProducer = new InMemoryMessageProducer(_internalBus, new Publication { Topic = routingKey, Type = otherEventsType, RequestType = typeof(MyOtherCommand) }); + _message = new Message(new MessageHeader(_myCommand.Id, routingKey, MessageType.MT_COMMAND, type: cloudEventsType), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + _messageTwo = new Message(new MessageHeader(_myOtherCommand.Id, routingKey, MessageType.MT_COMMAND, type: otherEventsType), new MessageBody(JsonSerializer.Serialize(_myOtherCommand, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((mapperType) => mapperType switch + { + var t when mapperType == typeof(MyCommandMessageMapper) => new MyCommandMessageMapper(), + var t when mapperType == typeof(MyOtherCommandMessageMapper) => new MyOtherCommandMessageMapper()}), null); messageMapperRegistry.Register(); messageMapperRegistry.Register(); - var resiliencePipeline = new ResiliencePipelineRegistry().AddBrighterDefault(); var messageProducers = new Dictionary { - { new ProducerKey(routingKey, cloudEventsType), messageProducer }, - { new ProducerKey(routingKey, otherEventsType), otherMessageProducer } + { + new ProducerKey(routingKey, cloudEventsType), + messageProducer + }, + { + new ProducerKey(routingKey, otherEventsType), + otherMessageProducer + } }; - var producerRegistry = new ProducerRegistry(messageProducers); - var tracer = new BrighterTracer(timeProvider); - _outbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipeline, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox - ); - - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipeline, - bus, - new InMemorySchedulerFactory() - ); + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipeline, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipeline, bus, new InMemorySchedulerFactory()); } - [Fact] - public void When_Posting_Dynamic_Messages_To_The_Command_Processor() + [Test] + public async Task When_Posting_Dynamic_Messages_To_The_Command_Processor() { _commandProcessor.Post(_myCommand); _commandProcessor.Post(_myOtherCommand); - - Assert.True(_internalBus.Stream(new RoutingKey(Topic)).Any()); - - var message = _outbox.Get(_myCommand.Id, new RequestContext()); - Assert.NotNull(message); - - var otherMessage = _outbox.Get(_myOtherCommand.Id, new RequestContext()); - Assert.NotNull(otherMessage); - - Assert.Equal(_message, message); - Assert.Equal(_messageTwo, otherMessage); + await Assert.That(_internalBus.Stream(new RoutingKey(Topic)).Any()).IsTrue(); + var message = await _outbox.GetAsync(_myCommand.Id, new RequestContext()); + await Assert.That(message).IsNotNull(); + var otherMessage = await _outbox.GetAsync(_myOtherCommand.Id, new RequestContext()); + await Assert.That(otherMessage).IsNotNull(); + await Assert.That(message).IsEqualTo(_message); + await Assert.That(otherMessage).IsEqualTo(_messageTwo); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_Multiple_Message_Types_To_A_Single_Topic_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_Multiple_Message_Types_To_A_Single_Topic_Async.cs index fefdc49876..eeb01b7cae 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_Multiple_Message_Types_To_A_Single_Topic_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_Multiple_Message_Types_To_A_Single_Topic_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -12,7 +12,6 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; using MyCommand = Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles.MyCommand; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Post @@ -27,105 +26,58 @@ public class CommandProcessorPostCommandMultiChannelTopicAsyncTests private readonly Message _messageTwo; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); - - public CommandProcessorPostCommandMultiChannelTopicAsyncTests () + public CommandProcessorPostCommandMultiChannelTopicAsyncTests() { _myCommand.Value = "Hello World"; - var timeProvider = new FakeTimeProvider(); var routingKey = new RoutingKey(Topic); - var cloudEventsType = new CloudEventsType("io.goparamore.brighter.mycommand"); var otherEventsType = new CloudEventsType("io.goparamore.brighter.myothercommand"); - - var messageProducer = new InMemoryMessageProducer( - _internalBus, - new Publication - { - Topic = routingKey, - Type = cloudEventsType, - RequestType = typeof(MyCommand) - } - ); - + var messageProducer = new InMemoryMessageProducer(_internalBus, new Publication { Topic = routingKey, Type = cloudEventsType, RequestType = typeof(MyCommand) }); //This producer is for a different command type, but the same topic - var otherMessageProducer = new InMemoryMessageProducer( - _internalBus, - new Publication - { - Topic = routingKey, - Type = otherEventsType, - RequestType = typeof(MyOtherCommand) - }); - - _message = new Message( - new MessageHeader(_myCommand.Id, routingKey, MessageType.MT_COMMAND, type: cloudEventsType), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - _messageTwo = new Message( - new MessageHeader(_myOtherCommand.Id, routingKey, MessageType.MT_COMMAND, type: otherEventsType), - new MessageBody(JsonSerializer.Serialize(_myOtherCommand, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((mapperType) => mapperType switch - { - var t when mapperType == typeof(MyCommandMessageMapperAsync) => new MyCommandMessageMapperAsync(), - var t when mapperType == typeof(MyOtherCommandMessageMapperAsync) => new MyOtherCommandMessageMapperAsync() - })); + var otherMessageProducer = new InMemoryMessageProducer(_internalBus, new Publication { Topic = routingKey, Type = otherEventsType, RequestType = typeof(MyOtherCommand) }); + _message = new Message(new MessageHeader(_myCommand.Id, routingKey, MessageType.MT_COMMAND, type: cloudEventsType), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + _messageTwo = new Message(new MessageHeader(_myOtherCommand.Id, routingKey, MessageType.MT_COMMAND, type: otherEventsType), new MessageBody(JsonSerializer.Serialize(_myOtherCommand, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((mapperType) => mapperType switch + { + var t when mapperType == typeof(MyCommandMessageMapperAsync) => new MyCommandMessageMapperAsync(), + var t when mapperType == typeof(MyOtherCommandMessageMapperAsync) => new MyOtherCommandMessageMapperAsync()})); messageMapperRegistry.RegisterAsync(); messageMapperRegistry.RegisterAsync(); - var resiliencePipeline = new ResiliencePipelineRegistry().AddBrighterDefault(); var messageProducers = new Dictionary { - { new ProducerKey(routingKey, cloudEventsType), messageProducer }, - { new ProducerKey(routingKey, otherEventsType), otherMessageProducer } + { + new ProducerKey(routingKey, cloudEventsType), + messageProducer + }, + { + new ProducerKey(routingKey, otherEventsType), + otherMessageProducer + } }; - var producerRegistry = new ProducerRegistry(messageProducers); - var tracer = new BrighterTracer(timeProvider); - _outbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipeline , - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox - ); - - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipeline, - bus, - new InMemorySchedulerFactory() - ); + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipeline, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipeline, bus, new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task When_Posting_Dynamic_Messages_To_The_Command_Processor() { await _commandProcessor.PostAsync(_myCommand); await _commandProcessor.PostAsync(_myOtherCommand); - - Assert.True(_internalBus.Stream(new RoutingKey(Topic)).Any()); - - var message = _outbox.Get(_myCommand.Id, new RequestContext()); - Assert.NotNull(message); - - var otherMessage = _outbox.Get(_myOtherCommand.Id, new RequestContext()); - Assert.NotNull(otherMessage); - - Assert.Equal(_message, message); - Assert.Equal(_messageTwo, otherMessage); + await Assert.That(_internalBus.Stream(new RoutingKey(Topic)).Any()).IsTrue(); + var message = await _outbox.GetAsync(_myCommand.Id, new RequestContext()); + await Assert.That(message).IsNotNull(); + var otherMessage = await _outbox.GetAsync(_myOtherCommand.Id, new RequestContext()); + await Assert.That(otherMessage).IsNotNull(); + await Assert.That(message).IsEqualTo(_message); + await Assert.That(otherMessage).IsEqualTo(_messageTwo); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_Via_A_Control_Bus_Sender.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_Via_A_Control_Bus_Sender.cs index 23c17719c4..3071e758ce 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_Via_A_Control_Bus_Sender.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_Via_A_Control_Bus_Sender.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -10,88 +10,53 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Post { - public class ControlBusSenderPostMessageTests : IDisposable + public class ControlBusSenderPostMessageTests { private readonly ControlBusSender _controlBusSender; private readonly MyCommand _myCommand = new(); private readonly Message _message; private readonly InMemoryOutbox _outbox; private readonly FakeTimeProvider _timeProvider; - public ControlBusSenderPostMessageTests() { var routingKey = new RoutingKey("MyCommand"); _myCommand.Value = "Hello World"; - _timeProvider = new FakeTimeProvider(); - InMemoryMessageProducer messageProducer = - new(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyCommand) }); - - _message = new Message( - new MessageHeader(_myCommand.Id, routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), - null); + InMemoryMessageProducer messageProducer = new(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyCommand) }); + _message = new Message(new MessageHeader(_myCommand.Id, routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - - var producerRegistry = new ProducerRegistry(new Dictionary {{routingKey, messageProducer},}); - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, messageProducer }, }); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(_timeProvider); - _outbox = new InMemoryOutbox(_timeProvider) {Tracer = tracer}; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox, - timeProvider: _timeProvider - ); - - CommandProcessor commandProcessor = new( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - new InMemorySchedulerFactory() - ); - + _outbox = new InMemoryOutbox(_timeProvider) + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox, timeProvider: _timeProvider); + CommandProcessor commandProcessor = new(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, new InMemorySchedulerFactory()); _controlBusSender = new ControlBusSender(commandProcessor); } - [Fact] - public void When_Posting_Via_A_Control_Bus_Sender() + [Test] + public async Task When_Posting_Via_A_Control_Bus_Sender() { _controlBusSender.Post(_myCommand); - _timeProvider.Advance(TimeSpan.FromSeconds(30)); - //_should_store_the_message_in_the_sent_command_message_repository - var message = _outbox - .DispatchedMessages(TimeSpan.FromSeconds(10), new RequestContext(), 1) - .SingleOrDefault(); - - Assert.NotNull(message); - + var message = (await _outbox.DispatchedMessagesAsync(TimeSpan.FromSeconds(10), new RequestContext(), 1)).SingleOrDefault(); + await Assert.That(message).IsNotNull(); //_should_convert_the_command_into_a_message - Assert.Equal(_message, message); + await Assert.That(message).IsEqualTo(_message); } + [After(Test)] public void Dispose() { _controlBusSender.Dispose(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_Via_A_Control_Bus_Sender_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_Via_A_Control_Bus_Sender_Async.cs index 282aeff2be..a14876db11 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_Via_A_Control_Bus_Sender_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_Via_A_Control_Bus_Sender_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -10,11 +10,10 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Post { - public class ControlBusSenderPostMessageAsyncTests : IDisposable + public class ControlBusSenderPostMessageAsyncTests { private readonly RoutingKey _routingKey = new("MyCommand"); private readonly ControlBusSender _controlBusSender; @@ -22,75 +21,43 @@ public class ControlBusSenderPostMessageAsyncTests : IDisposable private readonly Message _message; private readonly IAmAnOutboxSync _outbox; private readonly InternalBus _internalBus = new(); - public ControlBusSenderPostMessageAsyncTests() { _myCommand.Value = "Hello World"; - var timeProvider = new FakeTimeProvider(); var tracer = new BrighterTracer(timeProvider); - _outbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; InMemoryMessageProducer messageProducer = new(_internalBus, new Publication { Topic = _routingKey, RequestType = typeof(MyCommand) }); - - _message = new Message( - new MessageHeader(_myCommand.Id, _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), - null); + _message = new Message(new MessageHeader(_myCommand.Id, _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - - var producerRegistry = new ProducerRegistry(new Dictionary {{_routingKey, messageProducer},}); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox - ); - - var commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - new InMemorySchedulerFactory() - ); - + var producerRegistry = new ProducerRegistry(new Dictionary { { _routingKey, messageProducer }, }); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox); + var commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, new InMemorySchedulerFactory()); _controlBusSender = new ControlBusSender(commandProcessor); } - [Fact(Skip = "Requires publisher confirmation")] + [Test, Skip("Requires publisher confirmation")] public async Task When_Posting_Via_A_Control_Bus_Sender_Async() { await _controlBusSender.PostAsync(_myCommand); - //_should_send_a_message_via_the_messaging_gateway - Assert.True(_internalBus.Stream(new RoutingKey(_routingKey)).Any()); - + await Assert.That(_internalBus.Stream(new RoutingKey(_routingKey)).Any()).IsTrue(); //_should_store_the_message_in_the_sent_command_message_repository - var message = _outbox - .DispatchedMessages(TimeSpan.FromMilliseconds(1200000), new RequestContext(), 1) - .SingleOrDefault(); - - Assert.NotNull(message); - + var message = _outbox.DispatchedMessages(TimeSpan.FromMilliseconds(1200000), new RequestContext(), 1).SingleOrDefault(); + await Assert.That(message).IsNotNull(); //_should_convert_the_command_into_a_message - Assert.Equal(_message, message); + await Assert.That(message).IsEqualTo(_message); } + [After(Test)] public void Dispose() { _controlBusSender.Dispose(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_With_A_Custom_Policy.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_With_A_Custom_Policy.cs index c2bec3b2fb..60e761b7e6 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_With_A_Custom_Policy.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_With_A_Custom_Policy.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -12,10 +12,8 @@ using Polly; using Polly.Registry; using Polly.Retry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Post; - public class PostCommandWithCustomPolicyTests { private readonly ResiliencePipelineRegistry _resiliencePipeline; @@ -25,80 +23,48 @@ public class PostCommandWithCustomPolicyTests private readonly Message _message; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); - public PostCommandWithCustomPolicyTests() { _myCommand.Value = "Hello World"; - var timeProvider = new FakeTimeProvider(); var tracer = new BrighterTracer(timeProvider); - _outbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; InMemoryMessageProducer messageProducer = new(_internalBus, new Publication { Topic = _routingKey, RequestType = typeof(MyCommand) }); - - _message = new Message( - new MessageHeader(_myCommand.Id, _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = - new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), null); + _message = new Message(new MessageHeader(_myCommand.Id, _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - _resiliencePipeline = new ResiliencePipelineRegistry(); _resiliencePipeline.AddBrighterDefault(); - _resiliencePipeline.TryAddBuilder("custom", - (builder, _) => builder - .AddRetry(new RetryStrategyOptions - { - Delay = TimeSpan.FromMilliseconds(50), - MaxRetryAttempts = 3, - BackoffType = DelayBackoffType.Linear - })); - + _resiliencePipeline.TryAddBuilder("custom", (builder, _) => builder.AddRetry(new RetryStrategyOptions { Delay = TimeSpan.FromMilliseconds(50), MaxRetryAttempts = 3, BackoffType = DelayBackoffType.Linear })); var producerRegistry = new ProducerRegistry(new Dictionary { { _routingKey, messageProducer }, }); - var externalBus = new OutboxProducerMediator( - producerRegistry: producerRegistry, - resiliencePipelineRegistry: _resiliencePipeline, - mapperRegistry: messageMapperRegistry, - messageTransformerFactory: new EmptyMessageTransformerFactory(), - messageTransformerFactoryAsync: new EmptyMessageTransformerFactoryAsync(), - tracer: tracer, - publicationFinder: new FindPublicationByPublicationTopicOrRequestType(), - outboxCircuitBreaker: new InMemoryOutboxCircuitBreaker(), - outbox: _outbox - ); - - _commandProcessor = CommandProcessorBuilder.StartNew() - .Handlers(new HandlerConfiguration(new SubscriberRegistry(), new EmptyHandlerFactorySync())) - .Resilience(_resiliencePipeline) - .ExternalBus(ExternalBusType.FireAndForget, externalBus) - .ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All) - .RequestContextFactory(new InMemoryRequestContextFactory()) - .RequestSchedulerFactory(new InMemorySchedulerFactory()) - .Build(); + var externalBus = new OutboxProducerMediator(producerRegistry: producerRegistry, resiliencePipelineRegistry: _resiliencePipeline, mapperRegistry: messageMapperRegistry, messageTransformerFactory: new EmptyMessageTransformerFactory(), messageTransformerFactoryAsync: new EmptyMessageTransformerFactoryAsync(), tracer: tracer, publicationFinder: new FindPublicationByPublicationTopicOrRequestType(), outboxCircuitBreaker: new InMemoryOutboxCircuitBreaker(), outbox: _outbox); + _commandProcessor = CommandProcessorBuilder.StartNew().Handlers(new HandlerConfiguration(new SubscriberRegistry(), new EmptyHandlerFactorySync())).Resilience(_resiliencePipeline).ExternalBus(ExternalBusType.FireAndForget, externalBus).ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All).RequestContextFactory(new InMemoryRequestContextFactory()).RequestSchedulerFactory(new InMemorySchedulerFactory()).Build(); } - [Fact] - public void When_Posting_With_A_Custom_Policy() + [Test] + public async Task When_Posting_With_A_Custom_Policy() { var requestContext = new RequestContext(); _commandProcessor.Post(_myCommand, requestContext); - - Assert.True(_internalBus.Stream(new RoutingKey(_routingKey)).Any()); - - var message = _outbox.Get(_myCommand.Id, requestContext); - Assert.NotNull(message); - Assert.Equal(_message, message); - Assert.Equal(_resiliencePipeline, requestContext.ResiliencePipeline); + await Assert.That(_internalBus.Stream(new RoutingKey(_routingKey)).Any()).IsTrue(); + var message = await _outbox.GetAsync(_myCommand.Id, requestContext); + await Assert.That(message).IsNotNull(); + await Assert.That(message).IsEqualTo(_message); + await Assert.That(requestContext.ResiliencePipeline).IsEqualTo(_resiliencePipeline); } - internal sealed class EmptyHandlerFactorySync : IAmAHandlerFactorySync + + internal sealed class EmptyHandlerFactorySync : Paramore.Brighter.IAmAHandlerFactorySync, Paramore.Brighter.IAmAHandlerFactory { public IHandleRequests Create(Type handlerType, IAmALifetime lifetime) { return null!; } - public void Release(IHandleRequests handler, IAmALifetime lifetime) {} + public void Release(IHandleRequests handler, IAmALifetime lifetime) + { + } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_With_A_Default_Policy.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_With_A_Default_Policy.cs index 378a5d88ad..52ad1490d1 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_With_A_Default_Policy.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_With_A_Default_Policy.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -10,7 +10,6 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Post { @@ -22,71 +21,44 @@ public class PostCommandTests private readonly Message _message; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); - public PostCommandTests() { _myCommand.Value = "Hello World"; - var timeProvider = new FakeTimeProvider(); var tracer = new BrighterTracer(timeProvider); - _outbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; InMemoryMessageProducer messageProducer = new(_internalBus, new Publication { Topic = _routingKey, RequestType = typeof(MyCommand) }); - - _message = new Message( - new MessageHeader(_myCommand.Id, _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = - new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), - null); + _message = new Message(new MessageHeader(_myCommand.Id, _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - - var producerRegistry = - new ProducerRegistry(new Dictionary { { _routingKey, messageProducer }, }); - - var externalBus = new OutboxProducerMediator( - producerRegistry: producerRegistry, - resiliencePipelineRegistry: new ResiliencePipelineRegistry().AddBrighterDefault(), - mapperRegistry: messageMapperRegistry, - messageTransformerFactory: new EmptyMessageTransformerFactory(), - messageTransformerFactoryAsync: new EmptyMessageTransformerFactoryAsync(), - tracer: tracer, - publicationFinder: new FindPublicationByPublicationTopicOrRequestType(), - outboxCircuitBreaker: new InMemoryOutboxCircuitBreaker(), - outbox: _outbox - ); - - _commandProcessor = CommandProcessorBuilder.StartNew() - .Handlers(new HandlerConfiguration(new SubscriberRegistry(), new EmptyHandlerFactorySync())) - .DefaultResilience() - .ExternalBus(ExternalBusType.FireAndForget, externalBus) - .ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All) - .RequestContextFactory(new InMemoryRequestContextFactory()) - .RequestSchedulerFactory(new InMemorySchedulerFactory()) - .Build(); + var producerRegistry = new ProducerRegistry(new Dictionary { { _routingKey, messageProducer }, }); + var externalBus = new OutboxProducerMediator(producerRegistry: producerRegistry, resiliencePipelineRegistry: new ResiliencePipelineRegistry().AddBrighterDefault(), mapperRegistry: messageMapperRegistry, messageTransformerFactory: new EmptyMessageTransformerFactory(), messageTransformerFactoryAsync: new EmptyMessageTransformerFactoryAsync(), tracer: tracer, publicationFinder: new FindPublicationByPublicationTopicOrRequestType(), outboxCircuitBreaker: new InMemoryOutboxCircuitBreaker(), outbox: _outbox); + _commandProcessor = CommandProcessorBuilder.StartNew().Handlers(new HandlerConfiguration(new SubscriberRegistry(), new EmptyHandlerFactorySync())).DefaultResilience().ExternalBus(ExternalBusType.FireAndForget, externalBus).ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All).RequestContextFactory(new InMemoryRequestContextFactory()).RequestSchedulerFactory(new InMemorySchedulerFactory()).Build(); } - [Fact] - public void When_Posting_With_A_Default_Policy() + [Test] + public async Task When_Posting_With_A_Default_Policy() { _commandProcessor.Post(_myCommand); - - Assert.True(_internalBus.Stream(new RoutingKey(_routingKey)).Any()); - - var message = _outbox.Get(_myCommand.Id, new RequestContext()); - Assert.NotNull(message); - Assert.Equal(_message, message); + await Assert.That(_internalBus.Stream(new RoutingKey(_routingKey)).Any()).IsTrue(); + var message = await _outbox.GetAsync(_myCommand.Id, new RequestContext()); + await Assert.That(message).IsNotNull(); + await Assert.That(message).IsEqualTo(_message); } - internal sealed class EmptyHandlerFactorySync : IAmAHandlerFactorySync + + internal sealed class EmptyHandlerFactorySync : Paramore.Brighter.IAmAHandlerFactorySync, Paramore.Brighter.IAmAHandlerFactory { public IHandleRequests Create(Type handlerType, IAmALifetime lifetime) { return null!; } - public void Release(IHandleRequests handler, IAmALifetime lifetime) {} + public void Release(IHandleRequests handler, IAmALifetime lifetime) + { + } } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_With_An_In_Memory_Message_Store.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_With_An_In_Memory_Message_Store.cs index 3eb157fd40..e803d99882 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_With_An_In_Memory_Message_Store.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_With_An_In_Memory_Message_Store.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Text.Json; using System.Transactions; @@ -9,7 +9,6 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Post { @@ -21,60 +20,33 @@ public class CommandProcessorWithInMemoryOutboxTests private readonly Message _message; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); - public CommandProcessorWithInMemoryOutboxTests() { _myCommand.Value = "Hello World"; - var timeProvider = new FakeTimeProvider(); InMemoryMessageProducer messageProducer = new(_internalBus, new Publication { Topic = new RoutingKey(_routingKey), RequestType = typeof(MyCommand) }); - - _message = new Message( - new MessageHeader(_myCommand.Id, _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), - null); + _message = new Message(new MessageHeader(_myCommand.Id, _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - - var producerRegistry = new ProducerRegistry(new Dictionary {{_routingKey, messageProducer},}); - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var producerRegistry = new ProducerRegistry(new Dictionary { { _routingKey, messageProducer }, }); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(timeProvider); - _outbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox - ); - - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - new InMemorySchedulerFactory() - ); + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, new InMemorySchedulerFactory()); } - [Fact] - public void When_Posting_With_An_In_Memory_Outbox() + [Test] + public async Task When_Posting_With_An_In_Memory_Outbox() { var context = new RequestContext(); _commandProcessor.Post(_myCommand, context); - - Assert.NotNull(_outbox.Get(_myCommand.Id, context)); - Assert.NotEmpty(_internalBus.Stream(new RoutingKey(_routingKey))); - Assert.Equal(_message, _outbox.Get(_myCommand.Id, context)); + await Assert.That(await _outbox.GetAsync(_myCommand.Id, context)).IsNotNull(); + await Assert.That(_internalBus.Stream(new RoutingKey(_routingKey))).IsNotEmpty(); + await Assert.That(await _outbox.GetAsync(_myCommand.Id, context)).IsEqualTo(_message); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_With_An_In_Memory_Message_Store_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_With_An_In_Memory_Message_Store_Async.cs index 8fb1c129e3..174338b71d 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_With_An_In_Memory_Message_Store_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Post/When_Posting_With_An_In_Memory_Message_Store_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -11,7 +11,6 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Post { @@ -23,64 +22,36 @@ public class CommandProcessorWithInMemoryOutboxAscyncTests private readonly Message _message; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); - public CommandProcessorWithInMemoryOutboxAscyncTests() { _myCommand.Value = "Hello World"; - var timeProvider = new FakeTimeProvider(); var tracer = new BrighterTracer(timeProvider); - _outbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - InMemoryMessageProducer messageProducer = new(_internalBus, new Publication{Topic = _routingKey, RequestType = typeof(MyCommand)}); - - _message = new Message( - new MessageHeader(_myCommand.Id, _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyCommandMessageMapperAsync()) - ); + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + InMemoryMessageProducer messageProducer = new(_internalBus, new Publication { Topic = _routingKey, RequestType = typeof(MyCommand) }); + _message = new Message(new MessageHeader(_myCommand.Id, _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyCommandMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - var producerRegistry = new ProducerRegistry(new Dictionary {{_routingKey, messageProducer},}); - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox - ); - - _commandProcessor = new CommandProcessor( - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - new InMemorySchedulerFactory() - ); + var producerRegistry = new ProducerRegistry(new Dictionary { { _routingKey, messageProducer }, }); + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox); + _commandProcessor = new CommandProcessor(new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task When_Posting_With_An_In_Memory_Outbox_Async() { await _commandProcessor.PostAsync(_myCommand); - var message = await _outbox.GetAsync(_myCommand.Id, new RequestContext()); - //Should store the message in the outbox - Assert.NotNull(message); + await Assert.That(message).IsNotNull(); //Should send a message via the messaging gateway - Assert.True(_internalBus.Stream(new RoutingKey(_routingKey)).Any()); + await Assert.That(_internalBus.Stream(new RoutingKey(_routingKey)).Any()).IsTrue(); //Should convert the command into a message - Assert.Equal(_message, message); + await Assert.That(message).IsEqualTo(_message); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Inserting_A_Default_Inbox_Into_The_Publish_Pipeline.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Inserting_A_Default_Inbox_Into_The_Publish_Pipeline.cs index 4a173bcb58..af50d36f1d 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Inserting_A_Default_Inbox_Into_The_Publish_Pipeline.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Inserting_A_Default_Inbox_Into_The_Publish_Pipeline.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Time.Testing; @@ -8,7 +8,6 @@ using Paramore.Brighter.Inbox.Handlers; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Publish { @@ -16,62 +15,36 @@ public class CommandProcessorBuildDefaultInboxPublishTests { private readonly Brighter.CommandProcessor _commandProcessor; private readonly InMemoryInbox _inbox = new InMemoryInbox(new FakeTimeProvider()); - public CommandProcessorBuildDefaultInboxPublishTests() { var handler = new MyGlobalInboxEventHandler(new Dictionary()); - var subscriberRegistry = new SubscriberRegistry(); //This handler has no Inbox attribute subscriberRegistry.Add(typeof(MyEvent), typeof(MyGlobalInboxEventHandler)); - var container = new ServiceCollection(); container.AddSingleton(handler); container.AddSingleton(_inbox); container.AddSingleton>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - var retryPolicy = Policy - .Handle() - .Retry(); - - var circuitBreakerPolicy = Policy - .Handle() - .CircuitBreaker(1, TimeSpan.FromMilliseconds(1)); - - var inboxConfiguration = new InboxConfiguration( - _inbox, - InboxScope.All, //grab all the events - onceOnly: true, //only allow once - actionOnExists: OnceOnlyAction.Throw //throw on duplicates (we should be the only entry after) - ); - - _commandProcessor = new Brighter.CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry {{Brighter.CommandProcessor.RETRYPOLICY, retryPolicy}, {Brighter.CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy}}, - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory(), - inboxConfiguration: inboxConfiguration + var retryPolicy = Policy.Handle().Retry(); + var circuitBreakerPolicy = Policy.Handle().CircuitBreaker(1, TimeSpan.FromMilliseconds(1)); + var inboxConfiguration = new InboxConfiguration(_inbox, InboxScope.All, //grab all the events + onceOnly: true, //only allow once + actionOnExists: OnceOnlyAction.Throw //throw on duplicates (we should be the only entry after) ); - PipelineBuilder.ClearPipelineCache(); + _commandProcessor = new Brighter.CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry { { Brighter.CommandProcessor.RETRYPOLICY, retryPolicy }, { Brighter.CommandProcessor.CIRCUITBREAKER, circuitBreakerPolicy } }, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory(), inboxConfiguration: inboxConfiguration); } - - [Fact] - public void WhenInsertingADefaultInboxIntoThePublishPipeline() + [Test] + public async Task WhenInsertingADefaultInboxIntoThePublishPipeline() { //act var @event = new MyEvent(); _commandProcessor.Publish(@event); - //assert we are in, and auto-context added us under our name - var boxed = _inbox.Exists(@event.Id, typeof(MyGlobalInboxEventHandler).FullName, null, 100); - Assert.True(boxed); + var boxed = await _inbox.ExistsAsync(@event.Id, typeof(MyGlobalInboxEventHandler).FullName, null, 100); + await Assert.That(boxed).IsTrue(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Inserting_A_Default_Inbox_Into_The_Publish_Pipeline_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Inserting_A_Default_Inbox_Into_The_Publish_Pipeline_Async.cs index 978deb0009..027eb5b772 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Inserting_A_Default_Inbox_Into_The_Publish_Pipeline_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Inserting_A_Default_Inbox_Into_The_Publish_Pipeline_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -9,7 +9,6 @@ using Paramore.Brighter.Inbox.Handlers; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Publish { @@ -17,64 +16,36 @@ public class CommandProcessorBuildDefaultInboxPublishAsyncTests { private readonly Brighter.CommandProcessor _commandProcessor; private readonly InMemoryInbox _inbox = new InMemoryInbox(new FakeTimeProvider()); - public CommandProcessorBuildDefaultInboxPublishAsyncTests() { var handler = new MyEventHandlerAsync(new Dictionary()); - var subscriberRegistry = new SubscriberRegistry(); //This handler has no Inbox attribute subscriberRegistry.RegisterAsync(); - var container = new ServiceCollection(); container.AddSingleton(handler); container.AddSingleton(_inbox); container.AddTransient>(); - container.AddSingleton( - new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - var retryPolicy = Policy - .Handle() - .RetryAsync(); - - var circuitBreakerPolicy = Policy - .Handle() - .CircuitBreakerAsync(1, TimeSpan.FromMilliseconds(1)); - - var inboxConfiguration = new InboxConfiguration( - _inbox, - InboxScope.All, //grab all the events - onceOnly: true, //only allow once - actionOnExists: OnceOnlyAction.Throw //throw on duplicates (we should be the only entry after) - ); - - _commandProcessor = new Brighter.CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry - { - { Brighter.CommandProcessor.RETRYPOLICYASYNC, retryPolicy }, - { Brighter.CommandProcessor.CIRCUITBREAKERASYNC, circuitBreakerPolicy } - }, - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory(), - inboxConfiguration: inboxConfiguration + var retryPolicy = Policy.Handle().RetryAsync(); + var circuitBreakerPolicy = Policy.Handle().CircuitBreakerAsync(1, TimeSpan.FromMilliseconds(1)); + var inboxConfiguration = new InboxConfiguration(_inbox, InboxScope.All, //grab all the events + onceOnly: true, //only allow once + actionOnExists: OnceOnlyAction.Throw //throw on duplicates (we should be the only entry after) ); + _commandProcessor = new Brighter.CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry { { Brighter.CommandProcessor.RETRYPOLICYASYNC, retryPolicy }, { Brighter.CommandProcessor.CIRCUITBREAKERASYNC, circuitBreakerPolicy } }, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory(), inboxConfiguration: inboxConfiguration); } - [Fact] + [Test] public async Task WhenInsertingADefaultInboxIntoTheSendPipeline() { //act var @event = new MyEvent(); await _commandProcessor.SendAsync(@event); - //assert we are in, and auto-context added us under our name var boxed = await _inbox.ExistsAsync(@event.Id, typeof(MyEventHandlerAsync).FullName, null, 100); - Assert.True(boxed); + await Assert.That(boxed).IsTrue(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_An_Event_To_The_Processor.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_An_Event_To_The_Processor.cs index a2b6e60cac..d5137bbd24 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_An_Event_To_The_Processor.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_An_Event_To_The_Processor.cs @@ -1,8 +1,7 @@ -using System; +using System; using System.Collections.Generic; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Publish { @@ -11,26 +10,20 @@ public class CommandProcessorPublishEventTests private readonly CommandProcessor _commandProcessor; private readonly IDictionary _receivedMessages = new Dictionary(); private readonly MyEvent _myEvent = new(); - public CommandProcessorPublishEventTests() { var registry = new SubscriberRegistry(); registry.Register(); var handlerFactory = new SimpleHandlerFactorySync(_ => new MyEventHandler(_receivedMessages)); - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void When_Publishing_An_Event_To_The_Processor() + [Test] + public async Task When_Publishing_An_Event_To_The_Processor() { _commandProcessor.Publish(_myEvent); - - //Should publish the command to the first event handler - Assert.Contains(new KeyValuePair(nameof(MyEventHandler), _myEvent.Id), _receivedMessages); - + //Should publish the command to the first event handler + await Assert.That(_receivedMessages).Contains(new KeyValuePair(nameof(MyEventHandler), _myEvent.Id)); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_An_Event_To_The_Processor_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_An_Event_To_The_Processor_Async.cs index 326e4bbc50..c32df1c2b0 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_An_Event_To_The_Processor_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_An_Event_To_The_Processor_Async.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Publish { @@ -12,26 +11,20 @@ public class CommandProcessorPublishEventAsyncTests private readonly CommandProcessor _commandProcessor; private readonly IDictionary _receivedMessages = new Dictionary(); private readonly MyEvent _myEvent = new(); - public CommandProcessorPublishEventAsyncTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync(); var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyEventHandlerAsync(_receivedMessages)); - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task When_Publishing_An_Event_To_The_Processor() { await _commandProcessor.PublishAsync(_myEvent); - - //Should publish the command to the first event handler - Assert.Contains(new KeyValuePair(nameof(MyEventHandlerAsync), _myEvent.Id), _receivedMessages); - + //Should publish the command to the first event handler + await Assert.That(_receivedMessages).Contains(new KeyValuePair(nameof(MyEventHandlerAsync), _myEvent.Id)); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_An_Event_To_The_Processor_With_Agreement.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_An_Event_To_The_Processor_With_Agreement.cs index bf0da183f5..1f4eca2102 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_An_Event_To_The_Processor_With_Agreement.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_An_Event_To_The_Processor_With_Agreement.cs @@ -1,8 +1,7 @@ -using System; +using System; using System.Collections.Generic; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Publish { @@ -10,36 +9,30 @@ public class CommandProcessorPublishEventAgreementTests { private readonly CommandProcessor _commandProcessor; private readonly IDictionary _receivedMessages = new Dictionary(); - public CommandProcessorPublishEventAgreementTests() { var registry = new SubscriberRegistry(); registry.Register((request, context) => { var myEvent = request as MyEvent; - if (myEvent.Data == 4) - return [typeof(MyEventHandler)]; - - return [..Array.Empty()]; - }, - [typeof(MyEventHandler)]); + return[typeof(MyEventHandler)]; + return[..Array.Empty()]; + }, [typeof(MyEventHandler)]); var handlerFactory = new SimpleHandlerFactorySync(_ => new MyEventHandler(_receivedMessages)); - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void When_Publishing_An_Event_To_The_Processor() + [Test] + public async Task When_Publishing_An_Event_To_The_Processor() { - var myEvent = new MyEvent { Data = 4 }; + var myEvent = new MyEvent + { + Data = 4 + }; _commandProcessor.Publish(myEvent); - - //Should publish the command to the first event handler - Assert.Contains(new KeyValuePair(nameof(MyEventHandler), myEvent.Id), _receivedMessages); - + //Should publish the command to the first event handler + await Assert.That(_receivedMessages).Contains(new KeyValuePair(nameof(MyEventHandler), myEvent.Id)); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_An_Event_To_The_Processor_With_Agreement_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_An_Event_To_The_Processor_With_Agreement_Async.cs index 8213707651..0a20a01212 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_An_Event_To_The_Processor_With_Agreement_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_An_Event_To_The_Processor_With_Agreement_Async.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Publish { @@ -11,36 +10,30 @@ public class CommandProcessorPublishEventAgreementAsyncTests { private readonly CommandProcessor _commandProcessor; private readonly IDictionary _receivedMessages = new Dictionary(); - public CommandProcessorPublishEventAgreementAsyncTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync((request, context) => { var myEvent = request as MyEvent; - if (myEvent.Data == 4) - return [typeof(MyEventHandlerAsync)]; - - return [..Array.Empty()]; - }, - [typeof(MyEventHandlerAsync)]); + return[typeof(MyEventHandlerAsync)]; + return[..Array.Empty()]; + }, [typeof(MyEventHandlerAsync)]); var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyEventHandlerAsync(_receivedMessages)); - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task When_Publishing_An_Event_To_The_Processor() { - var myEvent = new MyEvent { Data = 4 }; + var myEvent = new MyEvent + { + Data = 4 + }; await _commandProcessor.PublishAsync(myEvent); - - //Should publish the command to the first event handler - Assert.Contains(new KeyValuePair(nameof(MyEventHandlerAsync), myEvent.Id), _receivedMessages); - + //Should publish the command to the first event handler + await Assert.That(_receivedMessages).Contains(new KeyValuePair(nameof(MyEventHandlerAsync), myEvent.Id)); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_To_Multiple_Subscribers_Should_Aggregate_Exceptions.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_To_Multiple_Subscribers_Should_Aggregate_Exceptions.cs index ce575f7391..d033a2840b 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_To_Multiple_Subscribers_Should_Aggregate_Exceptions.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_To_Multiple_Subscribers_Should_Aggregate_Exceptions.cs @@ -1,11 +1,10 @@ -using System; +using System; using System.Collections.Generic; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Extensions.DependencyInjection; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Publish { @@ -15,42 +14,34 @@ public class PublishingToMultipleSubscribersTests private readonly IDictionary _receivedMessages = new Dictionary(); private readonly MyEvent _myEvent = new MyEvent(); private Exception _exception; - public PublishingToMultipleSubscribersTests() { var registry = new SubscriberRegistry(); registry.Register(); registry.Register(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient(); container.AddTransient(); container.AddSingleton(_receivedMessages); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_Publishing_To_Multiple_Subscribers_Should_Aggregate_Exceptions() + [Test] + public async Task When_Publishing_To_Multiple_Subscribers_Should_Aggregate_Exceptions() { _exception = Catch.Exception(() => _commandProcessor.Publish(_myEvent)); - //Should throw an aggregate exception - Assert.IsType(_exception); + await Assert.That(_exception).IsTypeOf(); //Should have an inner exception from the handler - Assert.IsType(((AggregateException)_exception).InnerException); + await Assert.That(((AggregateException)_exception).InnerException).IsTypeOf(); //Should publish the command to the first event handler - Assert.Contains(new KeyValuePair(nameof(MyEventHandler), _myEvent.Id), _receivedMessages); + await Assert.That(_receivedMessages).Contains(new KeyValuePair(nameof(MyEventHandler), _myEvent.Id)); //Should publish the command to the second event handler - Assert.Contains(new KeyValuePair(nameof(MyOtherEventHandler), _myEvent.Id), _receivedMessages); - + await Assert.That(_receivedMessages).Contains(new KeyValuePair(nameof(MyOtherEventHandler), _myEvent.Id)); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_To_Multiple_Subscribers_Should_Aggregate_Exceptions_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_To_Multiple_Subscribers_Should_Aggregate_Exceptions_Async.cs index fe6c02d7f0..cb64bdb2d5 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_To_Multiple_Subscribers_Should_Aggregate_Exceptions_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_Publishing_To_Multiple_Subscribers_Should_Aggregate_Exceptions_Async.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2015 Ian Cooper +Copyright � 2015 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the �Software�), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED �AS IS�, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Collections.Generic; using System.Threading.Tasks; @@ -30,7 +28,6 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Extensions.DependencyInjection; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Publish { @@ -40,41 +37,34 @@ public class PublishingToMultipleSubscribersAsyncTests private readonly MyEvent _myEvent = new(); private readonly IDictionary _receivedMessages = new Dictionary(); private Exception? _exception; - public PublishingToMultipleSubscribersAsyncTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync(); registry.RegisterAsync(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient(); container.AddTransient(); container.AddSingleton(_receivedMessages); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); } - [Fact] + [Test] public async Task When_Publishing_To_Multiple_Subscribers_Should_Aggregate_Exceptions_Async() { _exception = await Catch.ExceptionAsync(() => _commandProcessor.PublishAsync(_myEvent)); - //Should throw an aggregate exception - Assert.IsType(_exception); + await Assert.That(_exception).IsTypeOf(); //Should have an inner exception from the handler - Assert.IsType(((AggregateException)_exception).InnerException); + await Assert.That(((AggregateException)_exception).InnerException).IsTypeOf(); //Should publish the command to the first event handler - Assert.Contains(new KeyValuePair(nameof(MyEventHandlerAsync), _myEvent.Id), _receivedMessages); + await Assert.That(_receivedMessages).Contains(new KeyValuePair(nameof(MyEventHandlerAsync), _myEvent.Id)); //Should publish the command to the second event handler - Assert.Contains(new KeyValuePair(nameof(MyOtherEventHandlerAsync), _myEvent.Id), _receivedMessages); + await Assert.That(_receivedMessages).Contains(new KeyValuePair(nameof(MyOtherEventHandlerAsync), _myEvent.Id)); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_Multiple_Subscribers.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_Multiple_Subscribers.cs index 663b2be133..bbb0246574 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_Multiple_Subscribers.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_Multiple_Subscribers.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright � 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the �Software�), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED �AS IS�, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -30,7 +28,6 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Extensions.DependencyInjection; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Publish { @@ -40,37 +37,30 @@ public class CommandProcessorPublishMultipleMatchesTests private readonly IDictionary _receivedMessages = new ConcurrentDictionary(); private readonly MyEvent _myEvent = new(); private Exception? _exception; - public CommandProcessorPublishMultipleMatchesTests() { var registry = new SubscriberRegistry(); registry.Register(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient(); container.AddSingleton(_receivedMessages); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_There_Are_Multiple_Subscribers() + [Test] + public async Task When_There_Are_Multiple_Subscribers() { _exception = Catch.Exception(() => _commandProcessor.Publish(_myEvent)); - //Should not throw an exception - Assert.Null(_exception); + await Assert.That(_exception).IsNull(); //Should publish the command to the first event handler - Assert.Contains(new KeyValuePair(nameof(MyEventHandler), _myEvent.Id), _receivedMessages); + await Assert.That(_receivedMessages).Contains(new KeyValuePair(nameof(MyEventHandler), _myEvent.Id)); //Should publish the command to the second event handler - Assert.Contains(new KeyValuePair(nameof(MyOtherEventHandler), _myEvent.Id), _receivedMessages); + await Assert.That(_receivedMessages).Contains(new KeyValuePair(nameof(MyOtherEventHandler), _myEvent.Id)); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_Multiple_Subscribers_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_Multiple_Subscribers_Async.cs index b51f7b5cfd..67d285b174 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_Multiple_Subscribers_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_Multiple_Subscribers_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Threading.Tasks; @@ -7,7 +7,6 @@ using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Extensions.DependencyInjection; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Publish { @@ -17,38 +16,31 @@ public class CommandProcessorPublishMultipleMatchesAsyncTests private readonly IDictionary _receivedMessages = new ConcurrentDictionary(); private readonly MyEvent _myEvent = new(); private Exception? _exception; - public CommandProcessorPublishMultipleMatchesAsyncTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient(); container.AddSingleton(_receivedMessages); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); } //Ignore any errors about adding System.Runtime from the IDE. See https://social.msdn.microsoft.com/Forums/en-US/af4dc0db-046c-4728-bfe0-60ceb93f7b9f/vs2012net-45-rc-compiler-error-when-using-actionblock-missing-reference-to?forum=tpldataflow - [Fact] + [Test] public async Task When_There_Are_Multiple_Subscribers_Async() { _exception = await Catch.ExceptionAsync(() => _commandProcessor.PublishAsync(_myEvent)); - //Should not throw an exception - Assert.Null(_exception); + await Assert.That(_exception).IsNull(); //Should publish the command to the first event handler - Assert.Contains(new KeyValuePair(nameof(MyEventHandlerAsync), _myEvent.Id), _receivedMessages); + await Assert.That(_receivedMessages).Contains(new KeyValuePair(nameof(MyEventHandlerAsync), _myEvent.Id)); //Should publish the command to the second event handler - Assert.Contains(new KeyValuePair(nameof(MyOtherEventHandlerAsync), _myEvent.Id), _receivedMessages); + await Assert.That(_receivedMessages).Contains(new KeyValuePair(nameof(MyOtherEventHandlerAsync), _myEvent.Id)); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_Multiple_Subscribers_With_Agreement.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_Multiple_Subscribers_With_Agreement.cs index c0349dcfa5..5a17b73712 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_Multiple_Subscribers_With_Agreement.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_Multiple_Subscribers_With_Agreement.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright � 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the �Software�), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED �AS IS�, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -30,7 +28,6 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Extensions.DependencyInjection; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Publish { @@ -39,7 +36,6 @@ public class CommandProcessorPublishMultipleMatchesAgreementTests private readonly CommandProcessor _commandProcessor; private readonly IDictionary _receivedMessages = new ConcurrentDictionary(); private Exception? _exception; - public CommandProcessorPublishMultipleMatchesAgreementTests() { var registry = new SubscriberRegistry(); @@ -47,47 +43,35 @@ public CommandProcessorPublishMultipleMatchesAgreementTests() { var myEvent = request as MyEvent; var handlerList = new List(); - if (myEvent.Data == 4) handlerList.Add(typeof(MyEventHandler)); - if (myEvent.Data > 2) handlerList.Add(typeof(MyOtherEventHandler)); - return handlerList; - }, [typeof(MyEventHandler), typeof(MyOtherEventHandler)]); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient(); container.AddSingleton(_receivedMessages); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void When_There_Are_Multiple_Subscribers() + [Test] + public async Task When_There_Are_Multiple_Subscribers() { var myEvent = new MyEvent { Data = 4 // This will match both handlers }; - _exception = Catch.Exception(() => _commandProcessor.Publish(myEvent)); - //Should not throw an exception - Assert.Null(_exception); + await Assert.That(_exception).IsNull(); //Should publish the command to the first event handler - Assert.Contains(new KeyValuePair(nameof(MyEventHandler), myEvent.Id), _receivedMessages); + await Assert.That(_receivedMessages).Contains(new KeyValuePair(nameof(MyEventHandler), myEvent.Id)); //Should publish the command to the second event handler - Assert.Contains(new KeyValuePair(nameof(MyOtherEventHandler), myEvent.Id), _receivedMessages); + await Assert.That(_receivedMessages).Contains(new KeyValuePair(nameof(MyOtherEventHandler), myEvent.Id)); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_Multiple_Subscribers_With_Agreement_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_Multiple_Subscribers_With_Agreement_Async.cs index f382b0d317..54637acf5e 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_Multiple_Subscribers_With_Agreement_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_Multiple_Subscribers_With_Agreement_Async.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright � 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the �Software�), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED �AS IS�, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -30,7 +28,6 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Publish { @@ -39,7 +36,6 @@ public class CommandProcessorPublishMultipleMatchesAgreementAsyncTests private readonly CommandProcessor _commandProcessor; private readonly IDictionary _receivedMessages = new ConcurrentDictionary(); private Exception? _exception; - public CommandProcessorPublishMultipleMatchesAgreementAsyncTests() { var registry = new SubscriberRegistry(); @@ -47,39 +43,28 @@ public CommandProcessorPublishMultipleMatchesAgreementAsyncTests() { var myEvent = request as MyEvent; var handlerList = new List(); - if (myEvent.Data == 4) handlerList.Add(typeof(MyEventHandlerAsync)); - if (myEvent.Data > 2) handlerList.Add(typeof(MyOtherEventHandlerAsync)); - return handlerList; - }, [typeof(MyEventHandlerAsync), typeof(MyOtherEventHandlerAsync)]); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient(); container.AddSingleton(_receivedMessages); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task When_There_Are_Multiple_Subscribers() { var myEvent = new MyEvent { Data = 4 // This will match both handlers }; - try { await _commandProcessor.PublishAsync(myEvent); @@ -90,11 +75,11 @@ public async Task When_There_Are_Multiple_Subscribers() } //Should not throw an exception - Assert.Null(_exception); + await Assert.That(_exception).IsNull(); //Should publish the command to the first event handler - Assert.Contains(new KeyValuePair(nameof(MyEventHandlerAsync), myEvent.Id), _receivedMessages); + await Assert.That(_receivedMessages).Contains(new KeyValuePair(nameof(MyEventHandlerAsync), myEvent.Id)); //Should publish the command to the second event handler - Assert.Contains(new KeyValuePair(nameof(MyOtherEventHandlerAsync), myEvent.Id), _receivedMessages); + await Assert.That(_receivedMessages).Contains(new KeyValuePair(nameof(MyOtherEventHandlerAsync), myEvent.Id)); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_No_Command_Handlers.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_No_Command_Handlers.cs index 03c25b2be0..dbd86f1914 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_No_Command_Handlers.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_No_Command_Handlers.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,23 +12,20 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Extensions.DependencyInjection; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Publish { @@ -37,32 +34,22 @@ public class CommandProcessorNoHandlersMatchTests private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private Exception _exception; - public CommandProcessorNoHandlersMatchTests() { var container = new ServiceCollection(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - _commandProcessor = new CommandProcessor( - new SubscriberRegistry(), - new ServiceProviderHandlerFactory(container.BuildServiceProvider()), - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory() - ); + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); + _commandProcessor = new CommandProcessor(new SubscriberRegistry(), new ServiceProviderHandlerFactory(container.BuildServiceProvider()), new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void When_There_Are_No_Command_Handlers() + [Test] + public async Task When_There_Are_No_Command_Handlers() { _exception = Catch.Exception(() => _commandProcessor.Send(_myCommand)); - //Should fail because multiple receivers found - Assert.IsType(_exception); + await Assert.That(_exception).IsTypeOf(); //Should have an error message that tells you why - Assert.NotNull(_exception); - Assert.Contains("No command handler was found", _exception.Message); + await Assert.That(_exception).IsNotNull(); + await Assert.That(_exception.Message).Contains("No command handler was found"); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_No_Command_Handlers_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_No_Command_Handlers_Async.cs index cb6bd51a1e..8f7e748fd0 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_No_Command_Handlers_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_No_Command_Handlers_Async.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -29,7 +27,6 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Extensions.DependencyInjection; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Publish { @@ -38,33 +35,21 @@ public class CommandProcessorNoHandlersMatchAsyncTests private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private Exception? _exception; - public CommandProcessorNoHandlersMatchAsyncTests() { var container = new ServiceCollection(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - _commandProcessor = new CommandProcessor( - new SubscriberRegistry(), - new ServiceProviderHandlerFactory(container.BuildServiceProvider()), - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory() - ); + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); + _commandProcessor = new CommandProcessor(new SubscriberRegistry(), new ServiceProviderHandlerFactory(container.BuildServiceProvider()), new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task When_There_Are_No_Command_Handlers_Async() { _exception = await Catch.ExceptionAsync(() => _commandProcessor.SendAsync(_myCommand)); - //Throw an exception when there are no handlers found - Assert.IsType(_exception); - Assert.NotNull(_exception); - Assert.Contains( - "No command handler was found for the typeof command Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles.MyCommand - a command should have exactly one handler.", - _exception.Message); + await Assert.That(_exception).IsTypeOf(); + await Assert.That(_exception).IsNotNull(); + await Assert.That(_exception.Message).Contains("No command handler was found for the typeof command Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles.MyCommand - a command should have exactly one handler."); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_No_Subscribers.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_No_Subscribers.cs index f9a05184af..64c34be28e 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_No_Subscribers.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_No_Subscribers.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright � 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the �Software�), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,22 +12,19 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED �AS IS�, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Collections.Generic; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.TestHelpers; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Publish { @@ -37,23 +34,19 @@ public class CommandProcessorNoMatchingSubcribersTests private readonly IDictionary _receivedMessages = new Dictionary(); private readonly MyEvent _myEvent = new MyEvent(); private Exception _exception; - public CommandProcessorNoMatchingSubcribersTests() { var registry = new SubscriberRegistry(); var handlerFactory = new SimpleHandlerFactorySync(_ => new MyEventHandler(_receivedMessages)); - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_There_Are_No_Subscribers() + [Test] + public async Task When_There_Are_No_Subscribers() { _exception = Catch.Exception(() => _commandProcessor.Publish(_myEvent)); - //_should_not_throw_an_exception - Assert.Null(_exception); + await Assert.That(_exception).IsNull(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_No_Subscribers_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_No_Subscribers_Async.cs index 2758bb134f..1c3e237f26 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_No_Subscribers_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Publish/When_There_Are_No_Subscribers_Async.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright � 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the �Software�), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,23 +12,20 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED �AS IS�, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Collections.Generic; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.TestHelpers; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Publish { @@ -38,24 +35,20 @@ public class CommandProcessorNoMatchingSubcribersAsyncTests private readonly IDictionary _receivedMessages = new Dictionary(); private readonly MyEvent _myEvent = new MyEvent(); private Exception? _exception; - public CommandProcessorNoMatchingSubcribersAsyncTests() { var registry = new SubscriberRegistry(); var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyEventHandlerAsync(_receivedMessages)); - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); } //Ignore any errors about adding System.Runtime from the IDE. See https://social.msdn.microsoft.com/Forums/en-US/af4dc0db-046c-4728-bfe0-60ceb93f7b9f/vs2012net-45-rc-compiler-error-when-using-actionblock-missing-reference-to?forum=tpldataflow - [Fact] + [Test] public async Task When_There_Are_No_Subscribers_Async() { _exception = await Catch.ExceptionAsync(() => _commandProcessor.PublishAsync(_myEvent)); - //_should_not_throw_an_exception - Assert.Null(_exception); + await Assert.That(_exception).IsNull(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Scheduler/When_Scheduling_A_Message_To_The_Command_Processor.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Scheduler/When_Scheduling_A_Message_To_The_Command_Processor.cs index b0cd9909c0..c98a771d1b 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Scheduler/When_Scheduling_A_Message_To_The_Command_Processor.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Scheduler/When_Scheduling_A_Message_To_The_Command_Processor.cs @@ -1,10 +1,9 @@ -#region Licence - +#region Licence /* The MIT License (MIT) -Copyright © 2015 Ian Cooper +Copyright � 2015 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the �Software�), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -13,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED �AS IS�, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Collections.Generic; using System.Linq; @@ -36,10 +33,8 @@ THE SOFTWARE. */ using Paramore.Brighter.Scheduler.Events; using Paramore.Brighter.Scheduler.Handlers; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Scheduler; - public class CommandProcessorSchedulerCommandTests { private const string Topic = "MyCommand"; @@ -49,169 +44,113 @@ public class CommandProcessorSchedulerCommandTests private readonly FakeTimeProvider _timeProvider; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); - public CommandProcessorSchedulerCommandTests() { - _myCommand = new() { Value = $"Hello World {Guid.NewGuid():N}" }; + _myCommand = new() + { + Value = $"Hello World {Guid.NewGuid():N}"}; var routingKey = new RoutingKey("MyCommand"); _timeProvider = new FakeTimeProvider(); _timeProvider.SetUtcNow(DateTimeOffset.UtcNow); - var registry = new SubscriberRegistry(); registry.RegisterAsync(); registry.Register(); - var handlerFactory = new SimpleHandlerFactory( - _ => new MyCommandHandler(_receivedMessages), - _ => new FireSchedulerRequestHandler(_commandProcessor!)); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), - null); - + var handlerFactory = new SimpleHandlerFactory(_ => new MyCommandHandler(_receivedMessages), _ => new FireSchedulerRequestHandler(_commandProcessor!)); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - var producer = new InMemoryMessageProducer(_internalBus, new Publication { Topic = routingKey, RequestType = typeof(MyCommand) }); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - - var producerRegistry = - new ProducerRegistry(new Dictionary { { routingKey, producer }, }); - + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, producer }, }); var tracer = new BrighterTracer(_timeProvider); - _outbox = new InMemoryOutbox(_timeProvider) { Tracer = tracer }; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox - ); - - _commandProcessor = new CommandProcessor(registry, - handlerFactory, - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - new InMemorySchedulerFactory { TimeProvider = _timeProvider }); - PipelineBuilder.ClearPipelineCache(); - PipelineBuilder.ClearPipelineCache(); + _outbox = new InMemoryOutbox(_timeProvider) + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, new InMemorySchedulerFactory { TimeProvider = _timeProvider }); } - [Fact] - public void When_Scheduling_Send_With_Delay_A_Message_To_The_Command_Processor() + [Test] + public async Task When_Scheduling_Send_With_Delay_A_Message_To_The_Command_Processor() { _commandProcessor.Send(TimeSpan.FromSeconds(10), _myCommand); - - Assert.DoesNotContain(nameof(MyCommandHandler), _receivedMessages); - + await Assert.That(_receivedMessages.Keys).DoesNotContain(nameof(MyCommandHandler)); _timeProvider.Advance(TimeSpan.FromSeconds(10)); - - Assert.Contains(nameof(MyCommandHandler), _receivedMessages); + await Assert.That(_receivedMessages.Keys).Contains(nameof(MyCommandHandler)); } - [Fact] - public void When_Scheduling_Send_With_At_A_Message_To_The_Command_Processor() + [Test] + public async Task When_Scheduling_Send_With_At_A_Message_To_The_Command_Processor() { _commandProcessor.Send(_timeProvider.GetUtcNow().AddSeconds(10), _myCommand); - - Assert.DoesNotContain(nameof(MyCommandHandler), _receivedMessages); - + await Assert.That(_receivedMessages.Keys).DoesNotContain(nameof(MyCommandHandler)); _timeProvider.Advance(TimeSpan.FromSeconds(10)); - - Assert.Contains(nameof(MyCommandHandler), _receivedMessages); + await Assert.That(_receivedMessages.Keys).Contains(nameof(MyCommandHandler)); } - [Fact] - public void When_Scheduling_Publish_With_Delay_A_Message_To_The_Command_Processor() + [Test] + public async Task When_Scheduling_Publish_With_Delay_A_Message_To_The_Command_Processor() { _commandProcessor.Publish(TimeSpan.FromSeconds(10), _myCommand); - - Assert.DoesNotContain(nameof(MyCommandHandler), _receivedMessages); - + await Assert.That(_receivedMessages.Keys).DoesNotContain(nameof(MyCommandHandler)); _timeProvider.Advance(TimeSpan.FromSeconds(10)); - - Assert.Contains(nameof(MyCommandHandler), _receivedMessages); + await Assert.That(_receivedMessages.Keys).Contains(nameof(MyCommandHandler)); } - [Fact] - public void When_Scheduling_Publish_With_At_A_Message_To_The_Command_Processor() + [Test] + public async Task When_Scheduling_Publish_With_At_A_Message_To_The_Command_Processor() { _commandProcessor.Publish(_timeProvider.GetUtcNow().AddSeconds(10), _myCommand); - - Assert.DoesNotContain(nameof(MyCommandHandler), _receivedMessages); - + await Assert.That(_receivedMessages.Keys).DoesNotContain(nameof(MyCommandHandler)); _timeProvider.Advance(TimeSpan.FromSeconds(10)); - - Assert.Contains(nameof(MyCommandHandler), _receivedMessages); + await Assert.That(_receivedMessages.Keys).Contains(nameof(MyCommandHandler)); } - [Fact] - public void When_Scheduling_Post_With_At_A_Message_To_The_Command_Processor() + [Test] + public async Task When_Scheduling_Post_With_At_A_Message_To_The_Command_Processor() { _commandProcessor.Post(_timeProvider.GetUtcNow().AddSeconds(10), _myCommand); - Assert.False(_internalBus.Stream(new RoutingKey(Topic)).Any()); - + await Assert.That(_internalBus.Stream(new RoutingKey(Topic)).Any()).IsFalse(); _timeProvider.Advance(TimeSpan.FromSeconds(10)); - - Assert.True(_internalBus.Stream(new RoutingKey(Topic)).Any()); - - var actual = _outbox.Get(_myCommand.Id, new RequestContext()); - - Assert.NotNull(actual); - var expected = new Message( - new MessageHeader(_myCommand.Id, new RoutingKey(Topic), MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(_internalBus.Stream(new RoutingKey(Topic)).Any()).IsTrue(); + var actual = await _outbox.GetAsync(_myCommand.Id, new RequestContext()); + await Assert.That(actual).IsNotNull(); + var expected = new Message(new MessageHeader(_myCommand.Id, new RoutingKey(Topic), MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That((actual.Header.TimeStamp - expected.Header.TimeStamp).Duration()).IsLessThanOrEqualTo(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] - public void When_Scheduling_Post_With_Delay_A_Message_To_The_Command_Processor() + [Test] + public async Task When_Scheduling_Post_With_Delay_A_Message_To_The_Command_Processor() { _commandProcessor.Post(TimeSpan.FromSeconds(10), _myCommand); - Assert.False(_internalBus.Stream(new RoutingKey(Topic)).Any()); - + await Assert.That(_internalBus.Stream(new RoutingKey(Topic)).Any()).IsFalse(); _timeProvider.Advance(TimeSpan.FromSeconds(10)); - - Assert.True(_internalBus.Stream(new RoutingKey(Topic)).Any()); - - var actual = _outbox.Get(_myCommand.Id, new RequestContext()); - Assert.NotNull(actual); - - var expected = new Message( - new MessageHeader(_myCommand.Id, new RoutingKey(Topic), MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(_internalBus.Stream(new RoutingKey(Topic)).Any()).IsTrue(); + var actual = await _outbox.GetAsync(_myCommand.Id, new RequestContext()); + await Assert.That(actual).IsNotNull(); + var expected = new Message(new MessageHeader(_myCommand.Id, new RoutingKey(Topic), MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That((actual.Header.TimeStamp - expected.Header.TimeStamp).Duration()).IsLessThanOrEqualTo(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Scheduler/When_Scheduling_A_Message_To_The_Command_Processor_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Scheduler/When_Scheduling_A_Message_To_The_Command_Processor_Async.cs index 002201b447..6256eed643 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Scheduler/When_Scheduling_A_Message_To_The_Command_Processor_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Scheduler/When_Scheduling_A_Message_To_The_Command_Processor_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -13,10 +13,8 @@ using Paramore.Brighter.Scheduler.Handlers; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Scheduler; - public class CommandProcessorSchedulerCommandAsyncTests { private const string Topic = "MyCommand"; @@ -26,14 +24,14 @@ public class CommandProcessorSchedulerCommandAsyncTests private readonly FakeTimeProvider _timeProvider; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); - public CommandProcessorSchedulerCommandAsyncTests() { - _myCommand = new() { Value = $"Hello World {Guid.NewGuid():N}" }; + _myCommand = new() + { + Value = $"Hello World {Guid.NewGuid():N}"}; var routingKey = new RoutingKey("MyCommand"); _timeProvider = new FakeTimeProvider(); _timeProvider.SetUtcNow(DateTimeOffset.UtcNow); - var registry = new SubscriberRegistry(); registry.RegisterAsync(); registry.RegisterAsync(); @@ -46,153 +44,108 @@ public CommandProcessorSchedulerCommandAsyncTests() return new MyCommandHandlerAsync(_receivedMessages); }); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyCommandMessageMapperAsync())); - + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyCommandMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - var producer = new InMemoryMessageProducer (_internalBus) { Publication = { Topic = routingKey, RequestType = typeof(MyCommand) } }; + var producer = new InMemoryMessageProducer(_internalBus) + { + Publication = + { + Topic = routingKey, + RequestType = typeof(MyCommand) + } + }; var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, producer }, }); - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(_timeProvider); - _outbox = new InMemoryOutbox(_timeProvider) { Tracer = tracer }; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox - ); - - _commandProcessor = new CommandProcessor(registry, - handlerFactory, - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - new InMemorySchedulerFactory { TimeProvider = _timeProvider }); - PipelineBuilder.ClearPipelineCache(); - PipelineBuilder.ClearPipelineCache(); + _outbox = new InMemoryOutbox(_timeProvider) + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, new InMemorySchedulerFactory { TimeProvider = _timeProvider }); } - [Fact] + [Test] public async Task When_Scheduling_Send_With_Delay_A_Message_To_The_Command_Processor_Async() { await _commandProcessor.SendAsync(TimeSpan.FromSeconds(10), _myCommand); - - Assert.DoesNotContain(nameof(MyCommandHandlerAsync), _receivedMessages); - + await Assert.That(_receivedMessages.Keys).DoesNotContain(nameof(MyCommandHandlerAsync)); _timeProvider.Advance(TimeSpan.FromSeconds(10)); - - Assert.Contains(nameof(MyCommandHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages.Keys).Contains(nameof(MyCommandHandlerAsync)); } - [Fact] + [Test] public async Task When_Scheduling_Send_With_At_A_Message_To_The_Command_Processor_Async() { await _commandProcessor.SendAsync(_timeProvider.GetUtcNow().AddSeconds(10), _myCommand); - - Assert.DoesNotContain(nameof(MyCommandHandlerAsync), _receivedMessages); - + await Assert.That(_receivedMessages.Keys).DoesNotContain(nameof(MyCommandHandlerAsync)); _timeProvider.Advance(TimeSpan.FromSeconds(10)); - - Assert.Contains(nameof(MyCommandHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages.Keys).Contains(nameof(MyCommandHandlerAsync)); } - [Fact] + [Test] public async Task When_Scheduling_Publish_With_Delay_A_Message_To_The_Command_Processor_Async() { await _commandProcessor.PublishAsync(TimeSpan.FromSeconds(10), _myCommand); - - Assert.DoesNotContain(nameof(MyCommandHandlerAsync), _receivedMessages); - + await Assert.That(_receivedMessages.Keys).DoesNotContain(nameof(MyCommandHandlerAsync)); _timeProvider.Advance(TimeSpan.FromSeconds(10)); - - Assert.Contains(nameof(MyCommandHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages.Keys).Contains(nameof(MyCommandHandlerAsync)); } - [Fact] + [Test] public async Task When_Scheduling_Publish_With_At_A_Message_To_The_Command_Processor_Async() { await _commandProcessor.PublishAsync(_timeProvider.GetUtcNow().AddSeconds(10), _myCommand); - - Assert.DoesNotContain(nameof(MyCommandHandlerAsync), _receivedMessages); - + await Assert.That(_receivedMessages.Keys).DoesNotContain(nameof(MyCommandHandlerAsync)); _timeProvider.Advance(TimeSpan.FromSeconds(10)); - - Assert.Contains(nameof(MyCommandHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages.Keys).Contains(nameof(MyCommandHandlerAsync)); } - [Fact] + [Test] public async Task When_Scheduling_Post_With_At_A_Message_To_The_Command_Processor_Async() { await _commandProcessor.PostAsync(_timeProvider.GetUtcNow().AddSeconds(10), _myCommand); - Assert.False(_internalBus.Stream(new RoutingKey(Topic)).Any()); - + await Assert.That(_internalBus.Stream(new RoutingKey(Topic)).Any()).IsFalse(); _timeProvider.Advance(TimeSpan.FromSeconds(10)); - - Assert.True(_internalBus.Stream(new RoutingKey(Topic)).Any()); - - var actual = _outbox.Get(_myCommand.Id, new RequestContext()); - Assert.NotNull(actual); - - var expected = new Message( - new MessageHeader(_myCommand.Id, new RoutingKey(Topic), MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(_internalBus.Stream(new RoutingKey(Topic)).Any()).IsTrue(); + var actual = await _outbox.GetAsync(_myCommand.Id, new RequestContext()); + await Assert.That(actual).IsNotNull(); + var expected = new Message(new MessageHeader(_myCommand.Id, new RoutingKey(Topic), MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That((actual.Header.TimeStamp - expected.Header.TimeStamp).Duration()).IsLessThanOrEqualTo(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_Scheduling_Post_With_Delay_A_Message_To_The_Command_Processor_Async() { await _commandProcessor.PostAsync(TimeSpan.FromSeconds(10), _myCommand); - Assert.False(_internalBus.Stream(new RoutingKey(Topic)).Any()); - + await Assert.That(_internalBus.Stream(new RoutingKey(Topic)).Any()).IsFalse(); _timeProvider.Advance(TimeSpan.FromSeconds(10)); - - Assert.True(_internalBus.Stream(new RoutingKey(Topic)).Any()); - - var actual = _outbox.Get(_myCommand.Id, new RequestContext()); - Assert.NotNull(actual); - - var expected = new Message( - new MessageHeader(_myCommand.Id, new RoutingKey(Topic), MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options)) - ); - - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); - + await Assert.That(_internalBus.Stream(new RoutingKey(Topic)).Any()).IsTrue(); + var actual = await _outbox.GetAsync(_myCommand.Id, new RequestContext()); + await Assert.That(actual).IsNotNull(); + var expected = new Message(new MessageHeader(_myCommand.Id, new RoutingKey(Topic), MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_myCommand, JsonSerialisationOptions.Options))); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That((actual.Header.TimeStamp - expected.Header.TimeStamp).Duration()).IsLessThanOrEqualTo(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Scheduler/When_Scheduling_With_Invalid_Parameter.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Scheduler/When_Scheduling_With_Invalid_Parameter.cs index 5d725613c8..fe0b55d589 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Scheduler/When_Scheduling_With_Invalid_Parameter.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Scheduler/When_Scheduling_With_Invalid_Parameter.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Transactions; using Microsoft.Extensions.Time.Testing; @@ -10,10 +10,8 @@ using Paramore.Brighter.Scheduler.Handlers; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Scheduler; - public class CommandProcessorSchedulerCommandWithInvalidParamsTests { private const string Topic = "MyCommand"; @@ -23,93 +21,62 @@ public class CommandProcessorSchedulerCommandWithInvalidParamsTests private readonly FakeTimeProvider _timeProvider; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); - public CommandProcessorSchedulerCommandWithInvalidParamsTests() { - _myCommand = new() { Value = $"Hello World {Guid.NewGuid():N}" }; + _myCommand = new() + { + Value = $"Hello World {Guid.NewGuid():N}"}; var routingKey = new RoutingKey("MyCommand"); _timeProvider = new FakeTimeProvider(); _timeProvider.SetUtcNow(DateTimeOffset.UtcNow); - var registry = new SubscriberRegistry(); registry.RegisterAsync(); registry.Register(); - var handlerFactory = new SimpleHandlerFactory( - _ => new MyCommandHandler(_receivedMessages), - _ => new FireSchedulerRequestHandler(_commandProcessor!)); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), - null); - + var handlerFactory = new SimpleHandlerFactory(_ => new MyCommandHandler(_receivedMessages), _ => new FireSchedulerRequestHandler(_commandProcessor!)); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - var producer = new InMemoryMessageProducer(_internalBus, new Publication { Topic = routingKey, RequestType = typeof(MyCommand) }); - var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, producer }, }); - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(_timeProvider); - _outbox = new InMemoryOutbox(_timeProvider) { Tracer = tracer }; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox - ); - - _commandProcessor = new CommandProcessor(registry, - handlerFactory, - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - new InMemorySchedulerFactory { TimeProvider = _timeProvider }); - PipelineBuilder.ClearPipelineCache(); - PipelineBuilder.ClearPipelineCache(); + _outbox = new InMemoryOutbox(_timeProvider) + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, new InMemorySchedulerFactory { TimeProvider = _timeProvider }); } - [Fact] - public void When_Scheduling_Send_With_Invalid_Parameter() + [Test] + public async Task When_Scheduling_Send_With_Invalid_Parameter() { - var exception = Catch.Exception(() => - _commandProcessor.Send(_timeProvider.GetUtcNow().AddMilliseconds(-1), _myCommand)); - Assert.NotNull(exception); - Assert.True((exception) is ArgumentOutOfRangeException); - + var exception = Catch.Exception(() => _commandProcessor.Send(_timeProvider.GetUtcNow().AddMilliseconds(-1), _myCommand)); + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ArgumentOutOfRangeException).IsTrue(); exception = Catch.Exception(() => _commandProcessor.Send(TimeSpan.FromMilliseconds(-1), _myCommand)); - Assert.NotNull(exception); - Assert.True((exception) is ArgumentOutOfRangeException); + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ArgumentOutOfRangeException).IsTrue(); } - [Fact] - public void When_Scheduling_Publish_With_Invalid_Parameter() + [Test] + public async Task When_Scheduling_Publish_With_Invalid_Parameter() { - var exception = Catch.Exception(() => - _commandProcessor.Publish(_timeProvider.GetUtcNow().AddMilliseconds(-1), _myCommand)); - Assert.NotNull(exception); - Assert.True((exception) is ArgumentOutOfRangeException); - + var exception = Catch.Exception(() => _commandProcessor.Publish(_timeProvider.GetUtcNow().AddMilliseconds(-1), _myCommand)); + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ArgumentOutOfRangeException).IsTrue(); exception = Catch.Exception(() => _commandProcessor.Publish(TimeSpan.FromMilliseconds(-1), _myCommand)); - Assert.NotNull(exception); - Assert.True((exception) is ArgumentOutOfRangeException); + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ArgumentOutOfRangeException).IsTrue(); } - - [Fact] - public void When_Scheduling_Post_With_Invalid_Parameter() + + [Test] + public async Task When_Scheduling_Post_With_Invalid_Parameter() { var exception = Catch.Exception(() => _commandProcessor.Post(_timeProvider.GetUtcNow().AddMilliseconds(-1), _myCommand)); - Assert.NotNull(exception); - Assert.True((exception) is ArgumentOutOfRangeException); - + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ArgumentOutOfRangeException).IsTrue(); exception = Catch.Exception(() => _commandProcessor.Post(TimeSpan.FromMilliseconds(-1), _myCommand)); - Assert.NotNull(exception); - Assert.True((exception) is ArgumentOutOfRangeException); + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ArgumentOutOfRangeException).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Scheduler/When_Scheduling_With_Invalid_Parameter_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Scheduler/When_Scheduling_With_Invalid_Parameter_Async.cs index 622891be2c..fa0b969abc 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Scheduler/When_Scheduling_With_Invalid_Parameter_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Scheduler/When_Scheduling_With_Invalid_Parameter_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using System.Transactions; @@ -11,10 +11,8 @@ using Paramore.Brighter.Scheduler.Handlers; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Scheduler; - public class CommandProcessorSchedulerCommandWithInvalidParamsAsyncTests { private const string Topic = "MyCommand"; @@ -24,93 +22,62 @@ public class CommandProcessorSchedulerCommandWithInvalidParamsAsyncTests private readonly FakeTimeProvider _timeProvider; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); - public CommandProcessorSchedulerCommandWithInvalidParamsAsyncTests() { - _myCommand = new() { Value = $"Hello World {Guid.NewGuid():N}" }; + _myCommand = new() + { + Value = $"Hello World {Guid.NewGuid():N}"}; var routingKey = new RoutingKey("MyCommand"); _timeProvider = new FakeTimeProvider(); _timeProvider.SetUtcNow(DateTimeOffset.UtcNow); - var registry = new SubscriberRegistry(); registry.RegisterAsync(); registry.Register(); - var handlerFactory = new SimpleHandlerFactory( - _ => new MyCommandHandler(_receivedMessages), - _ => new FireSchedulerRequestHandler(_commandProcessor!)); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), - null); - + var handlerFactory = new SimpleHandlerFactory(_ => new MyCommandHandler(_receivedMessages), _ => new FireSchedulerRequestHandler(_commandProcessor!)); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - var producer = new InMemoryMessageProducer(_internalBus, new Publication { Topic = routingKey, RequestType = typeof(MyCommand) }); - var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, producer }, }); - var resiliencePipelineRegistry = new ResiliencePipelineRegistry() - .AddBrighterDefault(); - + var resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); var tracer = new BrighterTracer(_timeProvider); - _outbox = new InMemoryOutbox(_timeProvider) { Tracer = tracer }; - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox - ); - - _commandProcessor = new CommandProcessor(registry, - handlerFactory, - new InMemoryRequestContextFactory(), - new DefaultPolicy(), - resiliencePipelineRegistry, - bus, - new InMemorySchedulerFactory { TimeProvider = _timeProvider }); - PipelineBuilder.ClearPipelineCache(); - PipelineBuilder.ClearPipelineCache(); + _outbox = new InMemoryOutbox(_timeProvider) + { + Tracer = tracer + }; + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new DefaultPolicy(), resiliencePipelineRegistry, bus, new InMemorySchedulerFactory { TimeProvider = _timeProvider }); } - [Fact] + [Test] public async Task When_Scheduling_Send_With_Invalid_Parameter_Async() { - var exception = await Catch.ExceptionAsync(() => - _commandProcessor.SendAsync(_timeProvider.GetUtcNow().AddMilliseconds(-1), _myCommand)); - Assert.NotNull(exception); - Assert.True((exception) is ArgumentOutOfRangeException); - + var exception = await Catch.ExceptionAsync(() => _commandProcessor.SendAsync(_timeProvider.GetUtcNow().AddMilliseconds(-1), _myCommand)); + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ArgumentOutOfRangeException).IsTrue(); exception = await Catch.ExceptionAsync(() => _commandProcessor.SendAsync(TimeSpan.FromMilliseconds(-1), _myCommand)); - Assert.NotNull(exception); - Assert.True((exception) is ArgumentOutOfRangeException); + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ArgumentOutOfRangeException).IsTrue(); } - [Fact] + [Test] public async Task When_Scheduling_Publish_With_Invalid_Parameter() { - var exception = await Catch.ExceptionAsync(() => - _commandProcessor.PublishAsync(_timeProvider.GetUtcNow().AddMilliseconds(-1), _myCommand)); - Assert.NotNull(exception); - Assert.True((exception) is ArgumentOutOfRangeException); - + var exception = await Catch.ExceptionAsync(() => _commandProcessor.PublishAsync(_timeProvider.GetUtcNow().AddMilliseconds(-1), _myCommand)); + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ArgumentOutOfRangeException).IsTrue(); exception = await Catch.ExceptionAsync(() => _commandProcessor.PublishAsync(TimeSpan.FromMilliseconds(-1), _myCommand)); - Assert.NotNull(exception); - Assert.True((exception) is ArgumentOutOfRangeException); + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ArgumentOutOfRangeException).IsTrue(); } - - [Fact] + + [Test] public async Task When_Scheduling_Post_With_Invalid_Parameter() { var exception = await Catch.ExceptionAsync(() => _commandProcessor.PostAsync(_timeProvider.GetUtcNow().AddMilliseconds(-1), _myCommand)); - Assert.NotNull(exception); - Assert.True((exception) is ArgumentOutOfRangeException); - + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ArgumentOutOfRangeException).IsTrue(); exception = await Catch.ExceptionAsync(() => _commandProcessor.PostAsync(TimeSpan.FromMilliseconds(-1), _myCommand)); - Assert.NotNull(exception); - Assert.True((exception) is ArgumentOutOfRangeException); + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ArgumentOutOfRangeException).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_Cancelling_An_Async_Command.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_Cancelling_An_Async_Command.cs index 9ae411ba4b..cd42992069 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_Cancelling_An_Async_Command.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_Cancelling_An_Async_Command.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Send { @@ -12,26 +11,21 @@ public class CancellingAsyncPipelineTests private readonly CommandProcessor _commandProcessor; private readonly IDictionary _receivedMessages = new Dictionary(); private readonly MyCommand _myCommand = new MyCommand(); - public CancellingAsyncPipelineTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync(); var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyCommandHandlerAsync(_receivedMessages)); - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); } //Ignore any errors about adding System.Runtime from the IDE. See https://social.msdn.microsoft.com/Forums/en-US/af4dc0db-046c-4728-bfe0-60ceb93f7b9f/vs2012net-45-rc-compiler-error-when-using-actionblock-missing-reference-to?forum=tpldataflow - [Fact] + [Test] public async Task When_Cancelling_An_Async_Command() { await _commandProcessor.SendAsync(_myCommand); - //Should send the command to the command handler - Assert.Contains(new KeyValuePair(nameof(MyCommandHandlerAsync), _myCommand.Id), _receivedMessages); - + await Assert.That(_receivedMessages).Contains(new KeyValuePair(nameof(MyCommandHandlerAsync), _myCommand.Id)); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_Sending_A_Command_To_The_Processor_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_Sending_A_Command_To_The_Processor_Async.cs index bd2ff92caa..e3a3c7b002 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_Sending_A_Command_To_The_Processor_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_Sending_A_Command_To_The_Processor_Async.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2015 Ian Cooper +Copyright � 2015 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the �Software�), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,22 +12,19 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED �AS IS�, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Collections.Generic; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Send { @@ -36,26 +33,22 @@ public class CommandProcessorSendAsyncTests private readonly CommandProcessor _commandProcessor; private readonly IDictionary _receivedMessages = new Dictionary(); private readonly MyCommand _myCommand = new MyCommand(); - public CommandProcessorSendAsyncTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync(); var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyCommandHandlerAsync(_receivedMessages)); - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); } // Ignore any errors about adding System.Runtime from the IDE. // See https://social.msdn.microsoft.com/Forums/en-US/af4dc0db-046c-4728-bfe0-60ceb93f7b9f/vs2012net-45-rc-compiler-error-when-using-actionblock-missing-reference-to?forum=tpldataflow - [Fact] + [Test] public async Task When_Sending_A_Command_To_The_Processor_Async() { await _commandProcessor.SendAsync(_myCommand); - // _should_send_the_command_to_the_command_handler - Assert.Contains(new KeyValuePair(nameof(MyCommandHandlerAsync), _myCommand.Id), _receivedMessages); + await Assert.That(_receivedMessages).Contains(new KeyValuePair(nameof(MyCommandHandlerAsync), _myCommand.Id)); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_Sending_A_command_To_The_Processor.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_Sending_A_command_To_The_Processor.cs index a2daf05cc5..f9f3ab6414 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_Sending_A_command_To_The_Processor.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_Sending_A_command_To_The_Processor.cs @@ -1,8 +1,7 @@ -using System; +using System; using System.Collections.Generic; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Send { @@ -11,26 +10,21 @@ public class CommandProcessorSendTests private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private readonly MyCommandHandler _myCommandHandler; - public CommandProcessorSendTests() { var registry = new SubscriberRegistry(); registry.Register(); _myCommandHandler = new MyCommandHandler(new Dictionary()); var handlerFactory = new SimpleHandlerFactorySync(_ => _myCommandHandler); - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_Sending_A_Command_To_The_Processor() + [Test] + public async Task When_Sending_A_Command_To_The_Processor() { _commandProcessor.Send(_myCommand); - //_should_send_the_command_to_the_command_handler - Assert.True(_myCommandHandler.ShouldReceive(_myCommand)); - + await Assert.That(_myCommandHandler.ShouldReceive(_myCommand)).IsTrue(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_Sending_A_command_To_The_Processor_Via_Agreement.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_Sending_A_command_To_The_Processor_Via_Agreement.cs index 362d4136a2..b4ce0e4689 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_Sending_A_command_To_The_Processor_Via_Agreement.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_Sending_A_command_To_The_Processor_Via_Agreement.cs @@ -1,47 +1,39 @@ -using System; +using System; using System.Collections.Generic; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Send { public class CommandProcessorSendViaAgreementTests { private readonly CommandProcessor _commandProcessor; - private readonly MyCommand _myCommand; + private readonly MyCommand _myCommand; private readonly MyCommandHandler _myCommandHandler; - public CommandProcessorSendViaAgreementTests() { var registry = new SubscriberRegistry(); registry.Register((request, context) => - { - var command = request as MyCommand; - if (command.Value == "new") - return [typeof(MyCommandHandler)]; - - return [typeof(MyObsoleteCommandHandler)]; - - }, [typeof(MyCommandHandler), typeof(MyObsoleteCommandHandler)] - ); + { + var command = request as MyCommand; + if (command.Value == "new") + return[typeof(MyCommandHandler)]; + return[typeof(MyObsoleteCommandHandler)]; + }, [typeof(MyCommandHandler), typeof(MyObsoleteCommandHandler)]); _myCommandHandler = new MyCommandHandler(new Dictionary()); var handlerFactory = new SimpleHandlerFactorySync(_ => _myCommandHandler); - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); - - _myCommand = new MyCommand {Value = "new"}; + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); + _myCommand = new MyCommand + { + Value = "new" + }; } - [Fact] - public void When_Sending_A_Command_To_The_Processor() + [Test] + public async Task When_Sending_A_Command_To_The_Processor() { _commandProcessor.Send(_myCommand); - - Assert.True(_myCommandHandler.ShouldReceive(_myCommand)); - + await Assert.That(_myCommandHandler.ShouldReceive(_myCommand)).IsTrue(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_Sending_A_command_To_The_Processor_Via_Agreement_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_Sending_A_command_To_The_Processor_Via_Agreement_Async.cs index 8cfc964075..6679152b06 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_Sending_A_command_To_The_Processor_Via_Agreement_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_Sending_A_command_To_The_Processor_Via_Agreement_Async.cs @@ -1,48 +1,40 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Send { public class CommandProcessorSendViaAgreementAsyncTests { private readonly CommandProcessor _commandProcessor; - private readonly MyCommand _myCommand; + private readonly MyCommand _myCommand; private readonly MyCommandHandlerAsync _myCommandHandler; - - public CommandProcessorSendViaAgreementAsyncTests () + public CommandProcessorSendViaAgreementAsyncTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync((request, context) => - { - var command = request as MyCommand; - if (command.Value == "new") - return [typeof(MyCommandHandlerAsync)]; - - return [typeof(MyObsoleteCommandHandlerAsync)]; - - }, [typeof(MyCommandHandlerAsync), typeof(MyObsoleteCommandHandlerAsync)] - ); + { + var command = request as MyCommand; + if (command.Value == "new") + return[typeof(MyCommandHandlerAsync)]; + return[typeof(MyObsoleteCommandHandlerAsync)]; + }, [typeof(MyCommandHandlerAsync), typeof(MyObsoleteCommandHandlerAsync)]); _myCommandHandler = new MyCommandHandlerAsync(new Dictionary()); var handlerFactory = new SimpleHandlerFactoryAsync(_ => _myCommandHandler); - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); - - _myCommand = new MyCommand {Value = "new"}; + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); + _myCommand = new MyCommand + { + Value = "new" + }; } - [Fact] + [Test] public async Task When_Sending_A_Command_To_The_Processor() { await _commandProcessor.SendAsync(_myCommand); - - Assert.True(_myCommandHandler.ShouldReceive(_myCommand)); - + await Assert.That(_myCommandHandler.ShouldReceive(_myCommand)).IsTrue(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_There_Are_Multiple_Possible_Command_Handlers.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_There_Are_Multiple_Possible_Command_Handlers.cs index 2b529efdf0..802aab9173 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_There_Are_Multiple_Possible_Command_Handlers.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_There_Are_Multiple_Possible_Command_Handlers.cs @@ -1,11 +1,10 @@ -using System; +using System; using System.Collections.Generic; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Extensions.DependencyInjection; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Send { @@ -15,36 +14,29 @@ public class CommandProcessorSendWithMultipleMatchesTests private readonly Dictionary _receivedMessages = new(); private readonly MyCommand _myCommand = new(); private Exception _exception; - public CommandProcessorSendWithMultipleMatchesTests() { var registry = new SubscriberRegistry(); registry.Register(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(_ => new MyCommandHandler(_receivedMessages)); container.AddTransient(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void When_There_Are_Multiple_Possible_Command_Handlers() + [Test] + public async Task When_There_Are_Multiple_Possible_Command_Handlers() { _exception = Catch.Exception(() => _commandProcessor.Send(_myCommand)); - - //Should fail because multiple receivers found - Assert.IsType(_exception); + await Assert.That(_exception).IsTypeOf(); //Should have an error message that tells you why - Assert.NotNull(_exception); - Assert.Contains("More than one handler was found for the typeof command Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles.MyCommand - a command should only have one handler.", _exception.Message); + await Assert.That(_exception).IsNotNull(); + await Assert.That(_exception.Message).Contains("More than one handler was found for the typeof command Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles.MyCommand - a command should only have one handler."); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_There_Are_Multiple_Possible_Command_Handlers_Async.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_There_Are_Multiple_Possible_Command_Handlers_Async.cs index 90c1d45b41..aa981d8a09 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_There_Are_Multiple_Possible_Command_Handlers_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_There_Are_Multiple_Possible_Command_Handlers_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -6,7 +6,6 @@ using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Extensions.DependencyInjection; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Send { @@ -16,37 +15,31 @@ public class CommandProcessorSendWithMultipleMatchesAsyncTests private readonly IDictionary _receivedMessages = new Dictionary(); private readonly MyCommand _myCommand = new MyCommand(); private Exception? _exception; - public CommandProcessorSendWithMultipleMatchesAsyncTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient(); container.AddTransient>(); container.AddSingleton(_receivedMessages); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); } //Ignore any errors about adding System.Runtime from the IDE. See https://social.msdn.microsoft.com/Forums/en-US/af4dc0db-046c-4728-bfe0-60ceb93f7b9f/vs2012net-45-rc-compiler-error-when-using-actionblock-missing-reference-to?forum=tpldataflow - [Fact] + [Test] public async Task When_There_Are_Multiple_Possible_Command_Handlers_Async() { _exception = await Catch.ExceptionAsync(() => _commandProcessor.SendAsync(_myCommand)); - //Should fail because multiple receivers found - Assert.IsType(_exception); + await Assert.That(_exception).IsTypeOf(); //Should have an error message that tells you why - Assert.NotNull(_exception); - Assert.Contains("More than one handler was found for the typeof command Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles.MyCommand - a command should only have one handler.", _exception.Message); + await Assert.That(_exception).IsNotNull(); + await Assert.That(_exception.Message).Contains("More than one handler was found for the typeof command Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles.MyCommand - a command should only have one handler."); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_there_are_no_failures_execute_all_the_steps_in_the_pipeline.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_there_are_no_failures_execute_all_the_steps_in_the_pipeline.cs index 235518f0b5..03108308be 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_there_are_no_failures_execute_all_the_steps_in_the_pipeline.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/Send/When_there_are_no_failures_execute_all_the_steps_in_the_pipeline.cs @@ -1,9 +1,8 @@ -using System; +using System; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors.Send { @@ -11,34 +10,28 @@ public class CommandProcessorPipelineStepsTests { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); - public CommandProcessorPipelineStepsTests() { var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); } - [Fact] - public void When_There_Are_No_Failures_Execute_All_The_Steps_In_The_Pipeline() + [Test] + public async Task When_There_Are_No_Failures_Execute_All_The_Steps_In_The_Pipeline() { _commandProcessor.Send(_myCommand); - // Should call the pre-validation handler - Assert.True(MyStepsValidationHandler.ShouldReceive(_myCommand)); - Assert.True(MyStepsPreAndPostDecoratedHandler.ShouldReceive(_myCommand)); + await Assert.That(MyStepsValidationHandler.ShouldReceive(_myCommand)).IsTrue(); + await Assert.That(MyStepsPreAndPostDecoratedHandler.ShouldReceive(_myCommand)).IsTrue(); // Should call the post validation handler - Assert.True(MyStepsLoggingHandler.ShouldReceive(_myCommand)); + await Assert.That(MyStepsLoggingHandler.ShouldReceive(_myCommand)).IsTrue(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/ContextCapture.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/ContextCapture.cs new file mode 100644 index 0000000000..01388839b6 --- /dev/null +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/ContextCapture.cs @@ -0,0 +1,6 @@ +namespace Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; + +internal sealed class ContextCapture +{ + public string? TestString { get; set; } +} diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyCommandHandler.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyCommandHandler.cs index 47a16cbd9b..48f68746da 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyCommandHandler.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyCommandHandler.cs @@ -44,7 +44,7 @@ public bool ShouldReceive(MyCommand expectedCommand) private void LogCommand(MyCommand request) { _command = request; - receivedMessages.Add(nameof(MyCommandHandler), request.Id); + receivedMessages[nameof(MyCommandHandler)] = request.Id; } } } diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyCommandHandlerAsync.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyCommandHandlerAsync.cs index d7853d2449..695e8d3b22 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyCommandHandlerAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyCommandHandlerAsync.cs @@ -22,7 +22,7 @@ public bool ShouldReceive(MyCommand expectedCommand) private void LogCommand(MyCommand request) { _command = request; - receivedMessages.Add(nameof(MyCommandHandlerAsync), request.Id); + receivedMessages[nameof(MyCommandHandlerAsync)] = request.Id; } } } diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyContextAwareCommandHandler.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyContextAwareCommandHandler.cs index 1b7396006d..59d925765b 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyContextAwareCommandHandler.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyContextAwareCommandHandler.cs @@ -24,9 +24,9 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles { - internal sealed class MyContextAwareCommandHandler : RequestHandler + internal sealed class MyContextAwareCommandHandler(ContextCapture? contextCapture = null) : RequestHandler { - public static string? TestString { get; set; } + public string? TestString { get; private set; } public override MyCommand Handle(MyCommand myCommand) { @@ -37,6 +37,8 @@ public override MyCommand Handle(MyCommand myCommand) private void LogContext() { TestString = (string)Context!.Bag["TestString"]; + if (contextCapture is not null) + contextCapture.TestString = TestString; Context.Bag["MyContextAwareCommandHandler"] = "I was called and set the context"; } } diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyContextAwareCommandHandlerAsync.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyContextAwareCommandHandlerAsync.cs index 0bd868f0e9..99a0188a59 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyContextAwareCommandHandlerAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyContextAwareCommandHandlerAsync.cs @@ -27,9 +27,9 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles { - internal sealed class MyContextAwareCommandHandlerAsync : RequestHandlerAsync + internal sealed class MyContextAwareCommandHandlerAsync(ContextCapture? contextCapture = null) : RequestHandlerAsync { - public static string? TestString { get; set; } + public string? TestString { get; private set; } public override async Task HandleAsync(MyCommand command, CancellationToken cancellationToken = default(CancellationToken)) { @@ -40,6 +40,8 @@ internal sealed class MyContextAwareCommandHandlerAsync : RequestHandlerAsync + internal sealed class MyContextAwareEventHandler(ContextCapture? contextCapture = null) : RequestHandler { - public static string? TestString { get; set; } + public string? TestString { get; private set; } public override MyEvent Handle(MyEvent myEvent) { @@ -37,6 +37,8 @@ public override MyEvent Handle(MyEvent myEvent) private void LogContext() { TestString = (string)Context!.Bag["TestString"]; + if (contextCapture is not null) + contextCapture.TestString = TestString; Context.Bag["MyContextAwareEventHandler"] = "I was called and set the context"; } } diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyContextAwareEventHandlerAsync.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyContextAwareEventHandlerAsync.cs index 75c65a8543..34be04494f 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyContextAwareEventHandlerAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyContextAwareEventHandlerAsync.cs @@ -27,9 +27,9 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles { - internal sealed class MyContextAwareEventHandlerAsync : RequestHandlerAsync + internal sealed class MyContextAwareEventHandlerAsync(ContextCapture? contextCapture = null) : RequestHandlerAsync { - public static string? TestString { get; set; } + public string? TestString { get; private set; } public override async Task HandleAsync(MyEvent @event, CancellationToken cancellationToken = default(CancellationToken)) { @@ -40,6 +40,8 @@ internal sealed class MyContextAwareEventHandlerAsync : RequestHandlerAsync receivedMessage { public override MyEvent Handle(MyEvent myEvent) { - receivedMessages.Add(nameof(MyEventHandler), myEvent.Id); + receivedMessages[nameof(MyEventHandler)] = myEvent.Id; return base.Handle(myEvent); } } diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyEventHandlerAsync.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyEventHandlerAsync.cs index ac5aa705c8..2b3ac37503 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyEventHandlerAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyEventHandlerAsync.cs @@ -42,7 +42,7 @@ public override async Task HandleAsync(MyEvent command, CancellationTok if (cancellationToken.IsCancellationRequested) return command; - _receivedMessages.Add(nameof(MyEventHandlerAsync), command.Id); + _receivedMessages[nameof(MyEventHandlerAsync)] = command.Id; await Task.Delay(0, cancellationToken).ConfigureAwait(ContinueOnCapturedContext); diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyGlobalnboxEventHandler.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyGlobalnboxEventHandler.cs index 3c46d28e7c..0f4011c817 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyGlobalnboxEventHandler.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyGlobalnboxEventHandler.cs @@ -37,7 +37,7 @@ public MyGlobalInboxEventHandler(IDictionary receivedMessages) public override MyEvent Handle(MyEvent myEvent) { - _receivedMessages.Add(nameof(MyEventHandler), myEvent.Id); + _receivedMessages[nameof(MyEventHandler)] = myEvent.Id; return base.Handle(myEvent); } } diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyOtherEventHandler.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyOtherEventHandler.cs index 7096ed901a..561ab4e6b7 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyOtherEventHandler.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyOtherEventHandler.cs @@ -30,7 +30,7 @@ internal sealed class MyOtherEventHandler(IDictionary receivedMe { public override MyEvent Handle(MyEvent myEvent) { - receivedMessages.Add(nameof(MyOtherEventHandler), myEvent.Id); + receivedMessages[nameof(MyOtherEventHandler)] = myEvent.Id; return base.Handle(myEvent); } } diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyOtherEventHandlerAsync.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyOtherEventHandlerAsync.cs index 6249c56756..a056188950 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyOtherEventHandlerAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/TestDoubles/MyOtherEventHandlerAsync.cs @@ -42,7 +42,7 @@ public override async Task HandleAsync(MyEvent @event, CancellationToke if (cancellationToken.IsCancellationRequested) return @event; - _receivedMessages.Add(nameof(MyOtherEventHandlerAsync), @event.Id); + _receivedMessages[nameof(MyOtherEventHandlerAsync)] = @event.Id; await Task.Delay(0, cancellationToken).ConfigureAwait(ContinueOnCapturedContext); return await base.HandleAsync(@event, cancellationToken); diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/When_A_Request_Context_Is_Provided.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/When_A_Request_Context_Is_Provided.cs index f8e279ff61..677af76eed 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/When_A_Request_Context_Is_Provided.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/When_A_Request_Context_Is_Provided.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using System.Transactions; @@ -7,373 +7,218 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors; - -public class RequestContextPresentTests : IDisposable +public class RequestContextPresentTests { private readonly SpyContextFactory _requestContextFactory; private readonly IPolicyRegistry _policyRegistry; - private readonly ResiliencePipelineRegistry _resiliencePipelineRegistry; - + private readonly ResiliencePipelineRegistry _resiliencePipelineRegistry; public RequestContextPresentTests() { - MyContextAwareCommandHandler.TestString = null; - MyContextAwareCommandHandlerAsync.TestString = null; - MyContextAwareEventHandler.TestString = null; - MyContextAwareEventHandlerAsync.TestString = null; - _policyRegistry = new DefaultPolicy(); _resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); - _requestContextFactory = new SpyContextFactory { CreateWasCalled = false }; + _requestContextFactory = new SpyContextFactory + { + CreateWasCalled = false + }; } - [Fact] - public void When_A_Request_Context_Is_Provided_On_A_Send() + [Test] + public async Task When_A_Request_Context_Is_Provided_On_A_Send() { //arrange var registry = new SubscriberRegistry(); registry.Register(); - var handlerFactory = new SimpleHandlerFactorySync(_ => new MyContextAwareCommandHandler()); + var contextCapture = new ContextCapture(); + var handlerFactory = new SimpleHandlerFactorySync(_ => new MyContextAwareCommandHandler(contextCapture)); var spyRequestContextFactory = new SpyContextFactory(); var policyRegistry = new DefaultPolicy(); - - var commandProcessor = new CommandProcessor( - registry, - handlerFactory, - spyRequestContextFactory, - policyRegistry, - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory() - ); - + var commandProcessor = new CommandProcessor(registry, handlerFactory, spyRequestContextFactory, policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); //act var context = new RequestContext(); var testBagValue = Guid.NewGuid().ToString(); - context.Bag.AddOrUpdate("TestString", testBagValue, (_, _) => testBagValue) ; + context.Bag.AddOrUpdate("TestString", testBagValue, (_, _) => testBagValue); commandProcessor.Send(new MyCommand(), context); - //assert - Assert.False(spyRequestContextFactory.CreateWasCalled); - Assert.Equal(testBagValue, MyContextAwareCommandHandler.TestString); - Assert.Contains("MyContextAwareCommandHandler", context.Bag); - Assert.Equal("I was called and set the context", context.Bag["MyContextAwareCommandHandler"]); + await Assert.That(spyRequestContextFactory.CreateWasCalled).IsFalse(); + await Assert.That(contextCapture.TestString).IsEqualTo(testBagValue); + await Assert.That(context.Bag.Keys).Contains("MyContextAwareCommandHandler"); + await Assert.That(context.Bag["MyContextAwareCommandHandler"]).IsEqualTo("I was called and set the context"); } - [Fact] + [Test] public async Task When_A_Request_Context_Is_Provided_On_A_Send_Async() { //arrange var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyContextAwareCommandHandlerAsync()); + var contextCapture = new ContextCapture(); + var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyContextAwareCommandHandlerAsync(contextCapture)); var spyRequestContextFactory = new SpyContextFactory(); var policyRegistry = new DefaultPolicy(); - - var commandProcessor = new CommandProcessor( - registry, - handlerFactory, - spyRequestContextFactory, - policyRegistry, - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory() - ); - + var commandProcessor = new CommandProcessor(registry, handlerFactory, spyRequestContextFactory, policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); //act var context = new RequestContext(); var testBagValue = Guid.NewGuid().ToString(); context.Bag.AddOrUpdate("TestString", testBagValue, (_, _) => testBagValue); await commandProcessor.SendAsync(new MyCommand(), context); - //assert - Assert.False(spyRequestContextFactory.CreateWasCalled); - Assert.Equal(testBagValue, MyContextAwareCommandHandlerAsync.TestString); - Assert.Contains("MyContextAwareCommandHandler", context.Bag); - Assert.Equal("I was called and set the context", context.Bag["MyContextAwareCommandHandler"]); + await Assert.That(spyRequestContextFactory.CreateWasCalled).IsFalse(); + await Assert.That(contextCapture.TestString).IsEqualTo(testBagValue); + await Assert.That(context.Bag.Keys).Contains("MyContextAwareCommandHandler"); + await Assert.That(context.Bag["MyContextAwareCommandHandler"]).IsEqualTo("I was called and set the context"); } - [Fact] - public void When_A_Request_Context_Is_Provided_On_A_Publish() + [Test] + public async Task When_A_Request_Context_Is_Provided_On_A_Publish() { //arrange var registry = new SubscriberRegistry(); registry.Register(); - var handlerFactory = new SimpleHandlerFactorySync(_ => new MyContextAwareEventHandler()); - - var commandProcessor = new CommandProcessor( - registry, - handlerFactory, - _requestContextFactory, - _policyRegistry, - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory() - ); - + var contextCapture = new ContextCapture(); + var handlerFactory = new SimpleHandlerFactorySync(_ => new MyContextAwareEventHandler(contextCapture)); + var commandProcessor = new CommandProcessor(registry, handlerFactory, _requestContextFactory, _policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); //act var context = new RequestContext(); var testBagValue = Guid.NewGuid().ToString(); context.Bag.AddOrUpdate("TestString", testBagValue, (_, _) => testBagValue); commandProcessor.Publish(new MyEvent(), context); - //assert - Assert.False(_requestContextFactory.CreateWasCalled); - Assert.Equal(testBagValue, MyContextAwareEventHandler.TestString); - Assert.Contains("MyContextAwareEventHandler", context.Bag); - Assert.Equal("I was called and set the context", context.Bag["MyContextAwareEventHandler"]); + await Assert.That(_requestContextFactory.CreateWasCalled).IsFalse(); + await Assert.That(contextCapture.TestString).IsEqualTo(testBagValue); + await Assert.That(context.Bag.Keys).Contains("MyContextAwareEventHandler"); + await Assert.That(context.Bag["MyContextAwareEventHandler"]).IsEqualTo("I was called and set the context"); } - [Fact] + [Test] public async Task When_A_Request_Context_Is_Provided_On_A_Publish_Async() { //arrange var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyContextAwareEventHandlerAsync()); - - var commandProcessor = new CommandProcessor( - registry, - handlerFactory, - _requestContextFactory, - _policyRegistry, - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory() - ); - + var contextCapture = new ContextCapture(); + var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyContextAwareEventHandlerAsync(contextCapture)); + var commandProcessor = new CommandProcessor(registry, handlerFactory, _requestContextFactory, _policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); //act var context = new RequestContext(); var testBagValue = Guid.NewGuid().ToString(); context.Bag.AddOrUpdate("TestString", testBagValue, (_, _) => testBagValue); await commandProcessor.PublishAsync(new MyEvent(), context); - //assert - Assert.False(_requestContextFactory.CreateWasCalled); - Assert.Equal(testBagValue, MyContextAwareEventHandlerAsync.TestString); - Assert.Contains("MyContextAwareEventHandler", context.Bag); - Assert.Equal("I was called and set the context", context.Bag["MyContextAwareEventHandler"]); + await Assert.That(_requestContextFactory.CreateWasCalled).IsFalse(); + await Assert.That(contextCapture.TestString).IsEqualTo(testBagValue); + await Assert.That(context.Bag.Keys).Contains("MyContextAwareEventHandler"); + await Assert.That(context.Bag["MyContextAwareEventHandler"]).IsEqualTo("I was called and set the context"); } - [Fact] - public void When_A_Request_Context_Is_Provided_On_A_Deposit() + [Test] + public async Task When_A_Request_Context_Is_Provided_On_A_Deposit() { //arrange - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), - null); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - var fakeTimeProvider = new FakeTimeProvider(); var routingKey = new RoutingKey("MyCommand"); - - var producerRegistry = - new ProducerRegistry(new Dictionary - { - { - routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication{RequestType = typeof(MyCommand), Topic = routingKey}) - }, - }); - + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication { RequestType = typeof(MyCommand), Topic = routingKey }) }, }); var timeProvider = new FakeTimeProvider(); var tracer = new BrighterTracer(timeProvider); - var fakeOutbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - - var bus = new OutboxProducerMediator( - producerRegistry, - _resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - fakeOutbox - ); - - var commandProcessor = new CommandProcessor( - _requestContextFactory, - _policyRegistry, - new ResiliencePipelineRegistry(), - bus, - new InMemorySchedulerFactory() - ); - + var fakeOutbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + var bus = new OutboxProducerMediator(producerRegistry, _resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), fakeOutbox); + var commandProcessor = new CommandProcessor(_requestContextFactory, _policyRegistry, new ResiliencePipelineRegistry(), bus, new InMemorySchedulerFactory()); //act var context = new RequestContext(); var testBagValue = Guid.NewGuid().ToString(); - context.Bag.AddOrUpdate("TestString", testBagValue, (_, _) => testBagValue) ; + context.Bag.AddOrUpdate("TestString", testBagValue, (_, _) => testBagValue); commandProcessor.DepositPost(new MyCommand(), context); - //assert - Assert.False(_requestContextFactory.CreateWasCalled); + await Assert.That(_requestContextFactory.CreateWasCalled).IsFalse(); } - [Fact] + [Test] public async Task When_A_Request_Context_Is_Provided_On_A_Deposit_Async() { //arrange - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyCommandMessageMapperAsync())); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyCommandMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - var timeProvider = new FakeTimeProvider(); var routingKey = new RoutingKey("MyCommand"); - - var producerRegistry = - new ProducerRegistry(new Dictionary - { - { - routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication{RequestType = typeof(MyCommand), Topic = routingKey}) - }, - }); - + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication { RequestType = typeof(MyCommand), Topic = routingKey }) }, }); var tracer = new BrighterTracer(timeProvider); - var fakeOutbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - - var bus = new OutboxProducerMediator( - producerRegistry, - _resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - fakeOutbox - ); - - var commandProcessor = new CommandProcessor( - _requestContextFactory, - _policyRegistry, - new ResiliencePipelineRegistry(), - bus, - new InMemorySchedulerFactory() - ); - + var fakeOutbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + var bus = new OutboxProducerMediator(producerRegistry, _resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), fakeOutbox); + var commandProcessor = new CommandProcessor(_requestContextFactory, _policyRegistry, new ResiliencePipelineRegistry(), bus, new InMemorySchedulerFactory()); //act var context = new RequestContext(); var testBagValue = Guid.NewGuid().ToString(); context.Bag.AddOrUpdate("TestString", testBagValue, (_, _) => testBagValue); await commandProcessor.DepositPostAsync(new MyCommand(), context); - //assert - Assert.False(_requestContextFactory.CreateWasCalled); + await Assert.That(_requestContextFactory.CreateWasCalled).IsFalse(); } - [Fact] - public void When_A_Request_Context_Is_Provided_On_A_Clear() + [Test] + public async Task When_A_Request_Context_Is_Provided_On_A_Clear() { //arrange - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), - null); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - var timeProvider = new FakeTimeProvider(); var routingKey = new RoutingKey("MyCommand"); - - var producerRegistry = - new ProducerRegistry(new Dictionary - { - { routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication{RequestType = typeof(MyCommand), Topic = routingKey})} - }); - + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication { RequestType = typeof(MyCommand), Topic = routingKey }) } }); var tracer = new BrighterTracer(timeProvider); - var fakeOutbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - - var bus = new OutboxProducerMediator( - producerRegistry, - _resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - fakeOutbox - ); - - var commandProcessor = new CommandProcessor( - _requestContextFactory, - _policyRegistry, - new ResiliencePipelineRegistry(), - bus, - new InMemorySchedulerFactory() - ); - - var myCommand = new MyCommand() {Id = Guid.NewGuid().ToString()}; + var fakeOutbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + var bus = new OutboxProducerMediator(producerRegistry, _resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), fakeOutbox); + var commandProcessor = new CommandProcessor(_requestContextFactory, _policyRegistry, new ResiliencePipelineRegistry(), bus, new InMemorySchedulerFactory()); + var myCommand = new MyCommand() + { + Id = Guid.NewGuid().ToString() + }; var message = new Message(new MessageHeader(myCommand.Id, new("MyCommand"), MessageType.MT_COMMAND), new MessageBody("test content")); bus.AddToOutbox(message, new RequestContext()); - //act var context = new RequestContext(); var testBagValue = Guid.NewGuid().ToString(); - context.Bag.AddOrUpdate("TestString", testBagValue, (_, _) => testBagValue) ; - commandProcessor.ClearOutbox(new []{myCommand.Id}, context); - + context.Bag.AddOrUpdate("TestString", testBagValue, (_, _) => testBagValue); + commandProcessor.ClearOutbox(new[] { myCommand.Id }, context); //assert - Assert.False(_requestContextFactory.CreateWasCalled); + await Assert.That(_requestContextFactory.CreateWasCalled).IsFalse(); } - [Fact] + [Test] public async Task When_A_Request_Context_Is_Provided_On_A_Clear_Async() { //arrange - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyCommandMessageMapperAsync())); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyCommandMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - var timeProvider = new FakeTimeProvider(); var routingKey = new RoutingKey("MyCommand"); - - var producerRegistry = - new ProducerRegistry(new Dictionary - { - { - routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication{RequestType = typeof(MyCommand), Topic = routingKey} ) - }, - }); - + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication { RequestType = typeof(MyCommand), Topic = routingKey }) }, }); var tracer = new BrighterTracer(timeProvider); var fakeOutbox = new InMemoryOutbox(timeProvider); - - var bus = new OutboxProducerMediator( - producerRegistry, - _resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - fakeOutbox - ); - - var commandProcessor = new CommandProcessor( - _requestContextFactory, - _policyRegistry, - new ResiliencePipelineRegistry(), - bus, - new InMemorySchedulerFactory() - ); - - var myCommand = new MyCommand() {Id = Guid.NewGuid().ToString()}; + var bus = new OutboxProducerMediator(producerRegistry, _resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), fakeOutbox); + var commandProcessor = new CommandProcessor(_requestContextFactory, _policyRegistry, new ResiliencePipelineRegistry(), bus, new InMemorySchedulerFactory()); + var myCommand = new MyCommand() + { + Id = Guid.NewGuid().ToString() + }; var message = new Message(new MessageHeader(myCommand.Id, new("MyCommand"), MessageType.MT_COMMAND), new MessageBody("test content")); bus.AddToOutbox(message, new RequestContext()); - //act var context = new RequestContext(); var testBagValue = Guid.NewGuid().ToString(); - context.Bag.AddOrUpdate("TestString", testBagValue, (_, _) => testBagValue) ; + context.Bag.AddOrUpdate("TestString", testBagValue, (_, _) => testBagValue); await commandProcessor.ClearOutboxAsync([myCommand.Id], context); - //assert - Assert.False(_requestContextFactory.CreateWasCalled); - - } - - public void Dispose() - { - MyContextAwareCommandHandler.TestString = null; - MyContextAwareCommandHandlerAsync.TestString = null; - MyContextAwareEventHandler.TestString = null; - MyContextAwareEventHandlerAsync.TestString = null; + await Assert.That(_requestContextFactory.CreateWasCalled).IsFalse(); } } diff --git a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/When_No_Request_Context_Is_Provided.cs b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/When_No_Request_Context_Is_Provided.cs index 4ea8805d77..8c3836abba 100644 --- a/tests/Paramore.Brighter.Core.Tests/CommandProcessors/When_No_Request_Context_Is_Provided.cs +++ b/tests/Paramore.Brighter.Core.Tests/CommandProcessors/When_No_Request_Context_Is_Provided.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using System.Transactions; @@ -7,318 +7,191 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.CommandProcessors; - -public class RequestContextFromFactoryTests : IDisposable +public class RequestContextFromFactoryTests { private readonly SpyContextFactory _requestContextFactory; private readonly IPolicyRegistry _policyRegistry; - private readonly ResiliencePipelineRegistry _resiliencePipelineRegistry; - + private readonly ResiliencePipelineRegistry _resiliencePipelineRegistry; public RequestContextFromFactoryTests() { - MyContextAwareCommandHandler.TestString = null; - MyContextAwareCommandHandlerAsync.TestString = null; - MyContextAwareEventHandler.TestString = null; - MyContextAwareEventHandlerAsync.TestString = null; - _policyRegistry = new DefaultPolicy(); _resiliencePipelineRegistry = new ResiliencePipelineRegistry().AddBrighterDefault(); - _requestContextFactory = new SpyContextFactory { Context = null, CreateWasCalled = false }; + _requestContextFactory = new SpyContextFactory + { + Context = null, + CreateWasCalled = false + }; } - [Fact] - public void When_No_Request_Context_Is_Provided_On_A_Send() + [Test] + public async Task When_No_Request_Context_Is_Provided_On_A_Send() { - //arrange - var registry = new SubscriberRegistry(); - registry.Register(); - var handlerFactory = new SimpleHandlerFactorySync(_ => new MyContextAwareCommandHandler()); - var myCommand = new MyCommand(); - - var commandProcessor = new CommandProcessor(registry, handlerFactory, _requestContextFactory, new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - - //act - commandProcessor.Send(myCommand); - - //assert - Assert.True(_requestContextFactory.CreateWasCalled); - Assert.Equal(_requestContextFactory.Context!.Bag["TestString"].ToString(), MyContextAwareCommandHandler.TestString); - Assert.Equal("I was called and set the context", _requestContextFactory.Context.Bag["MyContextAwareCommandHandler"]); + //arrange + var registry = new SubscriberRegistry(); + registry.Register(); + var contextCapture = new ContextCapture(); + var handlerFactory = new SimpleHandlerFactorySync(_ => new MyContextAwareCommandHandler(contextCapture)); + var myCommand = new MyCommand(); + var commandProcessor = new CommandProcessor(registry, handlerFactory, _requestContextFactory, new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); + //act + commandProcessor.Send(myCommand); + //assert + await Assert.That(_requestContextFactory.CreateWasCalled).IsTrue(); + await Assert.That(contextCapture.TestString).IsEqualTo(_requestContextFactory.Context!.Bag["TestString"].ToString()); + await Assert.That(_requestContextFactory.Context.Bag["MyContextAwareCommandHandler"]).IsEqualTo("I was called and set the context"); } - [Fact] + [Test] public async Task When_No_Request_Context_Is_Provided_On_A_Send_Async() { //arrange var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyContextAwareCommandHandlerAsync()); + var contextCapture = new ContextCapture(); + var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyContextAwareCommandHandlerAsync(contextCapture)); var myCommand = new MyCommand(); - var commandProcessor = new CommandProcessor(registry, handlerFactory, _requestContextFactory, new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - //act await commandProcessor.SendAsync(myCommand); - //assert - Assert.True(_requestContextFactory.CreateWasCalled); - Assert.Equal(_requestContextFactory.Context!.Bag["TestString"].ToString(), MyContextAwareCommandHandlerAsync.TestString); - Assert.Equal("I was called and set the context", _requestContextFactory.Context.Bag["MyContextAwareCommandHandler"]); + await Assert.That(_requestContextFactory.CreateWasCalled).IsTrue(); + await Assert.That(contextCapture.TestString).IsEqualTo(_requestContextFactory.Context!.Bag["TestString"].ToString()); + await Assert.That(_requestContextFactory.Context.Bag["MyContextAwareCommandHandler"]).IsEqualTo("I was called and set the context"); } - [Fact] - public void When_No_Request_Context_Is_Provided_On_A_Publish() + [Test] + public async Task When_No_Request_Context_Is_Provided_On_A_Publish() { //arrange var registry = new SubscriberRegistry(); registry.Register(); - var handlerFactory = new SimpleHandlerFactorySync(_ => new MyContextAwareEventHandler()); + var contextCapture = new ContextCapture(); + var handlerFactory = new SimpleHandlerFactorySync(_ => new MyContextAwareEventHandler(contextCapture)); var myEvent = new MyEvent(); - - var commandProcessor = new CommandProcessor(registry, handlerFactory, _requestContextFactory, new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); - + var commandProcessor = new CommandProcessor(registry, handlerFactory, _requestContextFactory, new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); //act commandProcessor.Publish(myEvent); - //assert - Assert.True(_requestContextFactory.CreateWasCalled); - Assert.Equal(_requestContextFactory.Context.Bag["TestString"].ToString(), MyContextAwareEventHandler.TestString); - Assert.Equal("I was called and set the context", _requestContextFactory.Context.Bag["MyContextAwareEventHandler"]); + await Assert.That(_requestContextFactory.CreateWasCalled).IsTrue(); + await Assert.That(contextCapture.TestString).IsEqualTo(_requestContextFactory.Context.Bag["TestString"].ToString()); + await Assert.That(_requestContextFactory.Context.Bag["MyContextAwareEventHandler"]).IsEqualTo("I was called and set the context"); } - [Fact] + [Test] public async Task When_No_Request_Context_Is_Provided_On_A_Publish_Async() { //arrange var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyContextAwareEventHandlerAsync()); + var contextCapture = new ContextCapture(); + var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyContextAwareEventHandlerAsync(contextCapture)); var myEvent = new MyEvent(); - var commandProcessor = new CommandProcessor(registry, handlerFactory, _requestContextFactory, new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - //act await commandProcessor.PublishAsync(myEvent); - //assert - Assert.True(_requestContextFactory.CreateWasCalled); - Assert.Equal(_requestContextFactory.Context.Bag["TestString"].ToString(), MyContextAwareEventHandlerAsync.TestString); - Assert.Equal("I was called and set the context", _requestContextFactory.Context.Bag["MyContextAwareEventHandler"]); + await Assert.That(_requestContextFactory.CreateWasCalled).IsTrue(); + await Assert.That(contextCapture.TestString).IsEqualTo(_requestContextFactory.Context.Bag["TestString"].ToString()); + await Assert.That(_requestContextFactory.Context.Bag["MyContextAwareEventHandler"]).IsEqualTo("I was called and set the context"); } - [Fact] - public void When_No_Request_Context_Is_Provided_On_A_Deposit() + [Test] + public async Task When_No_Request_Context_Is_Provided_On_A_Deposit() { - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), - null); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - var timeProvider = new FakeTimeProvider(); var routingKey = new RoutingKey("MyCommand"); - - var producerRegistry = - new ProducerRegistry(new Dictionary - { - { - routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication{RequestType = typeof(MyCommand), Topic = routingKey}) - } - }); - + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication { RequestType = typeof(MyCommand), Topic = routingKey }) } }); var tracer = new BrighterTracer(); - var fakeOutbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - - var bus = new OutboxProducerMediator( - producerRegistry, - _resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - fakeOutbox - ); - - var commandProcessor = new CommandProcessor( - _requestContextFactory, - _policyRegistry, - new ResiliencePipelineRegistry(), - bus, - new InMemorySchedulerFactory() - ); - + var fakeOutbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + var bus = new OutboxProducerMediator(producerRegistry, _resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), fakeOutbox); + var commandProcessor = new CommandProcessor(_requestContextFactory, _policyRegistry, new ResiliencePipelineRegistry(), bus, new InMemorySchedulerFactory()); //act commandProcessor.DepositPost(new MyCommand()); - //assert - Assert.True(_requestContextFactory.CreateWasCalled); + await Assert.That(_requestContextFactory.CreateWasCalled).IsTrue(); } - [Fact] + [Test] public async Task When_No_Request_Context_Is_Provided_On_A_Deposit_Async() { - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyCommandMessageMapperAsync())); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyCommandMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - var timeProvider = new FakeTimeProvider(); var routingKey = new RoutingKey("MyCommand"); - - var producerRegistry = - new ProducerRegistry(new Dictionary - { - { - routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication{RequestType = typeof(MyCommand), Topic = routingKey}) - }, - }); - + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication { RequestType = typeof(MyCommand), Topic = routingKey }) }, }); var tracer = new BrighterTracer(); - var fakeOutbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - - var bus = new OutboxProducerMediator( - producerRegistry, - _resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - fakeOutbox - ); - - var commandProcessor = new CommandProcessor( - _requestContextFactory, - _policyRegistry, - new ResiliencePipelineRegistry(), - bus, - new InMemorySchedulerFactory() - ); - + var fakeOutbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + var bus = new OutboxProducerMediator(producerRegistry, _resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), fakeOutbox); + var commandProcessor = new CommandProcessor(_requestContextFactory, _policyRegistry, new ResiliencePipelineRegistry(), bus, new InMemorySchedulerFactory()); //act await commandProcessor.DepositPostAsync(new MyCommand()); - //assert - Assert.True(_requestContextFactory.CreateWasCalled); + await Assert.That(_requestContextFactory.CreateWasCalled).IsTrue(); } - [Fact] - public void When_No_Request_Context_Is_Provided_On_A_Clear() + [Test] + public async Task When_No_Request_Context_Is_Provided_On_A_Clear() { //arrange - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), - null); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - var timeProvider = new FakeTimeProvider(); var routingKey = new RoutingKey("MyCommand"); - - var producerRegistry = - new ProducerRegistry(new Dictionary - { - { routingKey, new InMemoryMessageProducer(new InternalBus(), instrumentationOptions:InstrumentationOptions.All) - { - Publication = new Publication{RequestType = typeof(MyCommand), Topic = routingKey} - } }, - }); - + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, new InMemoryMessageProducer(new InternalBus(), instrumentationOptions: InstrumentationOptions.All) { Publication = new Publication { RequestType = typeof(MyCommand), Topic = routingKey } } }, }); var tracer = new BrighterTracer(); - var fakeOutbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - - var bus = new OutboxProducerMediator( - producerRegistry, - _resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - fakeOutbox - ); - - var commandProcessor = new CommandProcessor( - _requestContextFactory, - _policyRegistry, - new ResiliencePipelineRegistry(), - bus, - new InMemorySchedulerFactory() - ); - - var myCommand = new MyCommand() {Id = Guid.NewGuid().ToString()}; + var fakeOutbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + var bus = new OutboxProducerMediator(producerRegistry, _resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), fakeOutbox); + var commandProcessor = new CommandProcessor(_requestContextFactory, _policyRegistry, new ResiliencePipelineRegistry(), bus, new InMemorySchedulerFactory()); + var myCommand = new MyCommand() + { + Id = Guid.NewGuid().ToString() + }; var message = new Message(new MessageHeader(myCommand.Id, routingKey, MessageType.MT_COMMAND), new MessageBody("test content")); bus.AddToOutbox(message, new RequestContext()); - //act - commandProcessor.ClearOutbox(new []{myCommand.Id}); - + commandProcessor.ClearOutbox(new[] { myCommand.Id }); //assert - Assert.True(_requestContextFactory.CreateWasCalled); + await Assert.That(_requestContextFactory.CreateWasCalled).IsTrue(); } - [Fact] + [Test] public async Task When_A_Request_Context_Is_Provided_On_A_Clear_Async() { //arrange - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyCommandMessageMapperAsync())); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyCommandMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - var timeProvider = new FakeTimeProvider(); var routingKey = new RoutingKey("MyCommand"); - - var producerRegistry = - new ProducerRegistry(new Dictionary - { - { routingKey, new InMemoryMessageProducer(new InternalBus(), instrumentationOptions:InstrumentationOptions.All) - { - Publication = new Publication{RequestType = typeof(MyCommand), Topic = routingKey} - } }, - }); - + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, new InMemoryMessageProducer(new InternalBus(), instrumentationOptions: InstrumentationOptions.All) { Publication = new Publication { RequestType = typeof(MyCommand), Topic = routingKey } } }, }); var tracer = new BrighterTracer(); - var fakeOutbox = new InMemoryOutbox(timeProvider) {Tracer = tracer}; - - var bus = new OutboxProducerMediator( - producerRegistry, - _resiliencePipelineRegistry, - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - fakeOutbox - ); - - var commandProcessor = new CommandProcessor( - _requestContextFactory, - _policyRegistry, - new ResiliencePipelineRegistry(), - bus, - new InMemorySchedulerFactory() - ); - - var myCommand = new MyCommand() {Id = Guid.NewGuid().ToString()}; + var fakeOutbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + var bus = new OutboxProducerMediator(producerRegistry, _resiliencePipelineRegistry, messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), fakeOutbox); + var commandProcessor = new CommandProcessor(_requestContextFactory, _policyRegistry, new ResiliencePipelineRegistry(), bus, new InMemorySchedulerFactory()); + var myCommand = new MyCommand() + { + Id = Guid.NewGuid().ToString() + }; var message = new Message(new MessageHeader(myCommand.Id, routingKey, MessageType.MT_COMMAND), new MessageBody("test content")); bus.AddToOutbox(message, new RequestContext()); - //act - await commandProcessor.ClearOutboxAsync(new []{myCommand.Id}); - + await commandProcessor.ClearOutboxAsync(new[] { myCommand.Id }); //assert - Assert.True(_requestContextFactory.CreateWasCalled); - - } - - public void Dispose() - { - MyContextAwareCommandHandler.TestString = null; - MyContextAwareCommandHandlerAsync.TestString = null; - MyContextAwareEventHandler.TestString = null; - MyContextAwareEventHandlerAsync.TestString = null; + await Assert.That(_requestContextFactory.CreateWasCalled).IsTrue(); } } diff --git a/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_compresses_a_large_payload.cs b/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_compresses_a_large_payload.cs index de9ef64a2d..3ee05a7e63 100644 --- a/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_compresses_a_large_payload.cs +++ b/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_compresses_a_large_payload.cs @@ -1,13 +1,11 @@ -using System; +using System; using System.IO.Compression; using System.Net.Mime; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Extensions; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Compression; - public class CompressLargePayloadTests { private readonly CompressPayloadTransformer _transformer; @@ -15,89 +13,56 @@ public class CompressLargePayloadTests private readonly RoutingKey _topic = new("test_topic"); private const ushort GZIP_LEAD_BYTES = 0x8b1f; private const byte ZLIB_LEAD_BYTE = 0x78; - public CompressLargePayloadTests() { _transformer = new CompressPayloadTransformer(); - string body = DataGenerator.CreateString(6000); - _message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _topic, MessageType.MT_EVENT, timeStamp: DateTime.UtcNow), - new MessageBody(body, new ContentType(MediaTypeNames.Application.Json), CharacterEncoding.UTF8)); + _message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _topic, MessageType.MT_EVENT, timeStamp: DateTime.UtcNow), new MessageBody(body, new ContentType(MediaTypeNames.Application.Json), CharacterEncoding.UTF8)); } - [Fact] - public void When_a_message_gzip_compresses_a_large_payload() + [Test] + public async Task When_a_message_gzip_compresses_a_large_payload() { _transformer.InitializeWrapFromAttributeParams(CompressionMethod.GZip, CompressionLevel.Optimal, 5); - var compressedMessage = _transformer.Wrap(_message, new Publication{Topic = new RoutingKey(_topic)}); - + var compressedMessage = await _transformer.WrapAsync(_message, new Publication { Topic = new RoutingKey(_topic) }); //look for gzip in the bytes - Assert.NotNull(compressedMessage.Body.Bytes); - Assert.True(compressedMessage.Body.Bytes.Length >= 2); - Assert.Equal(GZIP_LEAD_BYTES, BitConverter.ToUInt16(compressedMessage.Body.Bytes, 0)); - + await Assert.That(compressedMessage.Body.Bytes).IsNotNull(); + await Assert.That(compressedMessage.Body.Bytes.Length >= 2).IsTrue(); + await Assert.That(BitConverter.ToUInt16(compressedMessage.Body.Bytes, 0)).IsEqualTo(GZIP_LEAD_BYTES); //mime types - Assert.Equal( - new ContentType("application/gzip"), - compressedMessage.Header.ContentType); - Assert.Equal( - new ContentType(MediaTypeNames.Application.Json){ CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }, - compressedMessage.Header.Bag[CompressPayloadTransformer.ORIGINAL_CONTENTTYPE_HEADER]); - Assert.Equal( - new ContentType("application/gzip"), - compressedMessage.Body.ContentType); + await Assert.That(compressedMessage.Header.ContentType).IsEqualTo(new ContentType("application/gzip")); + await Assert.That(compressedMessage.Header.Bag[CompressPayloadTransformer.ORIGINAL_CONTENTTYPE_HEADER]).IsEqualTo(new ContentType(MediaTypeNames.Application.Json) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }.ToString()); + await Assert.That(compressedMessage.Body.ContentType).IsEqualTo(new ContentType("application/gzip")); } - [Fact] - public void When_a_message_zlib_compresses_a_large_payload() + [Test] + public async Task When_a_message_zlib_compresses_a_large_payload() { _transformer.InitializeWrapFromAttributeParams(CompressionMethod.Zlib, CompressionLevel.Optimal, 5); - var compressedMessage = _transformer.Wrap(_message, new Publication{ Topic = new RoutingKey(_topic)}); - + var compressedMessage = await _transformer.WrapAsync(_message, new Publication { Topic = new RoutingKey(_topic) }); //look for gzip in the bytes - Assert.NotNull(compressedMessage.Body.Bytes); - Assert.True(compressedMessage.Body.Bytes.Length >= 2); - Assert.Equal( - new ContentType("application/deflate"), - compressedMessage.Body.ContentType); - Assert.Equal(ZLIB_LEAD_BYTE, compressedMessage.Body.Bytes[0]); - + await Assert.That(compressedMessage.Body.Bytes).IsNotNull(); + await Assert.That(compressedMessage.Body.Bytes.Length >= 2).IsTrue(); + await Assert.That(compressedMessage.Body.ContentType).IsEqualTo(new ContentType("application/deflate")); + await Assert.That(compressedMessage.Body.Bytes[0]).IsEqualTo(ZLIB_LEAD_BYTE); //mime types - Assert.Equal( - new ContentType(CompressPayloadTransformer.DEFLATE), - compressedMessage.Header.ContentType - ); - Assert.Equal( - new ContentType(MediaTypeNames.Application.Json){ CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }, - compressedMessage.Header.Bag[CompressPayloadTransformer.ORIGINAL_CONTENTTYPE_HEADER]); - Assert.Equal( - new ContentType(CompressPayloadTransformer.DEFLATE), - compressedMessage.Body.ContentType); + await Assert.That(compressedMessage.Header.ContentType).IsEqualTo(new ContentType(CompressPayloadTransformer.DEFLATE)); + await Assert.That(compressedMessage.Header.Bag[CompressPayloadTransformer.ORIGINAL_CONTENTTYPE_HEADER]).IsEqualTo(new ContentType(MediaTypeNames.Application.Json) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }.ToString()); + await Assert.That(compressedMessage.Body.ContentType).IsEqualTo(new ContentType(CompressPayloadTransformer.DEFLATE)); } - [Fact] - public void When_a_message_brotli_compresses_a_large_payload() + [Test] + public async Task When_a_message_brotli_compresses_a_large_payload() { _transformer.InitializeWrapFromAttributeParams(CompressionMethod.Brotli, CompressionLevel.Optimal, 5); - var compressedMessage = _transformer.Wrap(_message, new Publication{Topic = new RoutingKey(_topic)}); - + var compressedMessage = await _transformer.WrapAsync(_message, new Publication { Topic = new RoutingKey(_topic) }); //look for gzip in the bytes - Assert.NotNull(compressedMessage.Body.Bytes); - Assert.True(compressedMessage.Body.Bytes.Length >= 2); - Assert.Equal( - new ContentType("application/br"), - compressedMessage.Body.ContentType); - + await Assert.That(compressedMessage.Body.Bytes).IsNotNull(); + await Assert.That(compressedMessage.Body.Bytes.Length >= 2).IsTrue(); + await Assert.That(compressedMessage.Body.ContentType).IsEqualTo(new ContentType("application/br")); //mime types - Assert.Equal( - new ContentType(CompressPayloadTransformer.BROTLI), - compressedMessage.Header.ContentType); - Assert.Equal( - new ContentType(MediaTypeNames.Application.Json){CharSet = CharacterEncoding.UTF8.FromCharacterEncoding()}.ToString(), - compressedMessage.Header.Bag[CompressPayloadTransformer.ORIGINAL_CONTENTTYPE_HEADER]); - Assert.Equal( - new ContentType(CompressPayloadTransformer.BROTLI), - compressedMessage.Body.ContentType); + await Assert.That(compressedMessage.Header.ContentType).IsEqualTo(new ContentType(CompressPayloadTransformer.BROTLI)); + await Assert.That(compressedMessage.Header.Bag[CompressPayloadTransformer.ORIGINAL_CONTENTTYPE_HEADER]).IsEqualTo(new ContentType(MediaTypeNames.Application.Json) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }.ToString()); + await Assert.That(compressedMessage.Body.ContentType).IsEqualTo(new ContentType(CompressPayloadTransformer.BROTLI)); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_compresses_a_large_payload_async.cs b/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_compresses_a_large_payload_async.cs index 81204f9dc0..d26b4cfa35 100644 --- a/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_compresses_a_large_payload_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_compresses_a_large_payload_async.cs @@ -1,14 +1,12 @@ -using System; +using System; using System.IO.Compression; using System.Net.Mime; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Extensions; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Compression; - public class AsyncCompressLargePayloadTests { private readonly CompressPayloadTransformer _transformer; @@ -16,80 +14,59 @@ public class AsyncCompressLargePayloadTests private readonly RoutingKey _topic = new("test_topic"); private const ushort GZIP_LEAD_BYTES = 0x8b1f; private const byte ZLIB_LEAD_BYTE = 0x78; - public AsyncCompressLargePayloadTests() { _transformer = new CompressPayloadTransformer(); - string body = DataGenerator.CreateString(6000); - _message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _topic, MessageType.MT_EVENT, timeStamp: DateTime.UtcNow), - new MessageBody(body, new ContentType(MediaTypeNames.Application.Json), CharacterEncoding.UTF8)); + _message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _topic, MessageType.MT_EVENT, timeStamp: DateTime.UtcNow), new MessageBody(body, new ContentType(MediaTypeNames.Application.Json), CharacterEncoding.UTF8)); } - [Fact] + [Test] public async Task When_a_message_gzip_compresses_a_large_payload() { _transformer.InitializeWrapFromAttributeParams(CompressionMethod.GZip, CompressionLevel.Optimal, 5); - var compressedMessage = await _transformer.WrapAsync(_message, new Publication{Topic = new RoutingKey(_topic)}); - + var compressedMessage = await _transformer.WrapAsync(_message, new Publication { Topic = new RoutingKey(_topic) }); //look for gzip in the bytes - Assert.NotNull(compressedMessage.Body.Bytes); - Assert.True(compressedMessage.Body.Bytes.Length >= 2); - Assert.Equal(GZIP_LEAD_BYTES, BitConverter.ToUInt16(compressedMessage.Body.Bytes, 0)); - + await Assert.That(compressedMessage.Body.Bytes).IsNotNull(); + await Assert.That(compressedMessage.Body.Bytes.Length >= 2).IsTrue(); + await Assert.That(BitConverter.ToUInt16(compressedMessage.Body.Bytes, 0)).IsEqualTo(GZIP_LEAD_BYTES); //mime types - Assert.Equal( - new ContentType("application/gzip"){CharSet = CharacterEncoding.UTF8.FromCharacterEncoding()}, - compressedMessage.Header.ContentType); - Assert.Equal(new ContentType("application/gzip"){CharSet = CharacterEncoding.UTF8.FromCharacterEncoding()}, - compressedMessage.Body.ContentType); - Assert.Equal( - new ContentType(MediaTypeNames.Application.Json) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }.ToString(), - compressedMessage.Header.Bag[CompressPayloadTransformer.ORIGINAL_CONTENTTYPE_HEADER]); + await Assert.That(compressedMessage.Header.ContentType).IsEqualTo(new ContentType("application/gzip") { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }); + await Assert.That(compressedMessage.Body.ContentType).IsEqualTo(new ContentType("application/gzip") { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }); + await Assert.That(compressedMessage.Header.Bag[CompressPayloadTransformer.ORIGINAL_CONTENTTYPE_HEADER]).IsEqualTo(new ContentType(MediaTypeNames.Application.Json) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }.ToString()); } - [Fact] + [Test] public async Task When_a_message_zlib_compresses_a_large_payload() { _transformer.InitializeWrapFromAttributeParams(CompressionMethod.Zlib, CompressionLevel.Optimal, 5); - var compressedMessage = await _transformer.WrapAsync(_message, new Publication{Topic = new RoutingKey(_topic)}); - + var compressedMessage = await _transformer.WrapAsync(_message, new Publication { Topic = new RoutingKey(_topic) }); //look for gzip in the bytes - Assert.NotNull(compressedMessage.Body.Bytes); - Assert.True(compressedMessage.Body.Bytes.Length >= 2); - Assert.Equal(new ContentType("application/deflate").MediaType, compressedMessage.Body.ContentType!.MediaType); - Assert.Equal(ZLIB_LEAD_BYTE, compressedMessage.Body.Bytes[0]); - + await Assert.That(compressedMessage.Body.Bytes).IsNotNull(); + await Assert.That(compressedMessage.Body.Bytes.Length >= 2).IsTrue(); + await Assert.That(compressedMessage.Body.ContentType!.MediaType).IsEqualTo(new ContentType("application/deflate").MediaType); + await Assert.That(compressedMessage.Body.Bytes[0]).IsEqualTo(ZLIB_LEAD_BYTE); //mime types - Assert.Equal( - new ContentType(CompressPayloadTransformer.DEFLATE){ CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }, - compressedMessage.Header.ContentType); - Assert.Equal( - new ContentType(MediaTypeNames.Application.Json){CharSet = CharacterEncoding.UTF8.FromCharacterEncoding()}.ToString(), - compressedMessage.Header.Bag[CompressPayloadTransformer.ORIGINAL_CONTENTTYPE_HEADER]); - Assert.Equal( - new ContentType(CompressPayloadTransformer.DEFLATE){CharSet = CharacterEncoding.UTF8.FromCharacterEncoding()}, - compressedMessage.Body.ContentType); + await Assert.That(compressedMessage.Header.ContentType).IsEqualTo(new ContentType(CompressPayloadTransformer.DEFLATE) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }); + await Assert.That(compressedMessage.Header.Bag[CompressPayloadTransformer.ORIGINAL_CONTENTTYPE_HEADER]).IsEqualTo(new ContentType(MediaTypeNames.Application.Json) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }.ToString()); + await Assert.That(compressedMessage.Body.ContentType).IsEqualTo(new ContentType(CompressPayloadTransformer.DEFLATE) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }); } - [Fact] + [Test] public async Task When_a_message_brotli_compresses_a_large_payload() { _transformer.InitializeWrapFromAttributeParams(CompressionMethod.Brotli, CompressionLevel.Optimal, 5); - var compressedMessage = await _transformer.WrapAsync(_message, new Publication{Topic = new RoutingKey(_topic)}); - + var compressedMessage = await _transformer.WrapAsync(_message, new Publication { Topic = new RoutingKey(_topic) }); //look for gzip in the bytes - Assert.NotNull(compressedMessage.Body.Bytes); - Assert.True(compressedMessage.Body.Bytes.Length >= 2); - + await Assert.That(compressedMessage.Body.Bytes).IsNotNull(); + await Assert.That(compressedMessage.Body.Bytes.Length >= 2).IsTrue(); //mime types - var contentType = new ContentType("application/br"){CharSet = CharacterEncoding.UTF8.FromCharacterEncoding()}; - Assert.Equal(contentType, compressedMessage.Body.ContentType!); - Assert.Equal(contentType, compressedMessage.Header.ContentType!); - Assert.Equal( - new ContentType(MediaTypeNames.Application.Json){CharSet = CharacterEncoding.UTF8.FromCharacterEncoding()}.ToString(), - compressedMessage.Header.Bag[CompressPayloadTransformer.ORIGINAL_CONTENTTYPE_HEADER] - ); + var contentType = new ContentType("application/br") + { + CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() + }; + await Assert.That(compressedMessage.Body.ContentType!).IsEqualTo(contentType); + await Assert.That(compressedMessage.Header.ContentType!).IsEqualTo(contentType); + await Assert.That(compressedMessage.Header.Bag[CompressPayloadTransformer.ORIGINAL_CONTENTTYPE_HEADER]).IsEqualTo(new ContentType(MediaTypeNames.Application.Json) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }.ToString()); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_is_not_compressed.cs b/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_is_not_compressed.cs index 59a21c02e7..e34a6d5fe9 100644 --- a/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_is_not_compressed.cs +++ b/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_is_not_compressed.cs @@ -1,91 +1,55 @@ -using System; +using System; using System.Net.Mime; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Compression; - public class UncompressedPayloadTests { - - [Fact] - public void When_a_message_is_not_gzip_compressed() + [Test] + public async Task When_a_message_is_not_gzip_compressed() { - //arrange var transformer = new CompressPayloadTransformer(); transformer.InitializeUnwrapFromAttributeParams(CompressionMethod.GZip); - var smallContent = "small message"; var contentType = new ContentType(MediaTypeNames.Application.Json); - var body = new MessageBody(smallContent, contentType); - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), new("test_topic"), MessageType.MT_EVENT, - timeStamp: DateTime.UtcNow, contentType: contentType - ), - body - ); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), new("test_topic"), MessageType.MT_EVENT, timeStamp: DateTime.UtcNow, contentType: contentType), body); //act - var msg = transformer.Unwrap(message); - + var msg = await transformer.UnwrapAsync(message); //assert - Assert.Equal(smallContent, msg.Body.Value); + await Assert.That(msg.Body.Value).IsEqualTo(smallContent); } - - [Fact] - public void When_a_message_is_not_zlib_compressed() + + [Test] + public async Task When_a_message_is_not_zlib_compressed() { - //arrange var transformer = new CompressPayloadTransformer(); transformer.InitializeUnwrapFromAttributeParams(CompressionMethod.Zlib); - var smallContent = "small message"; var contentType = new ContentType(MediaTypeNames.Application.Json); - var body = new MessageBody(smallContent, contentType); - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), new("test_topic"), MessageType.MT_EVENT, - timeStamp: DateTime.UtcNow, contentType: contentType - ), - body - ); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), new("test_topic"), MessageType.MT_EVENT, timeStamp: DateTime.UtcNow, contentType: contentType), body); //act - var msg = transformer.Unwrap(message); - + var msg = await transformer.UnwrapAsync(message); //assert - Assert.Equal(smallContent, msg.Body.Value); + await Assert.That(msg.Body.Value).IsEqualTo(smallContent); } - - [Fact] - public void When_a_message_is_not_brotli_compressed() + + [Test] + public async Task When_a_message_is_not_brotli_compressed() { - //arrange var transformer = new CompressPayloadTransformer(); transformer.InitializeUnwrapFromAttributeParams(CompressionMethod.Brotli); - var smallContent = "small message"; var contentType = new ContentType(MediaTypeNames.Application.Json); - var body = new MessageBody(smallContent, contentType); - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), new("test_topic"), MessageType.MT_EVENT, - timeStamp: DateTime.UtcNow, contentType: contentType - ), - body - ); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), new("test_topic"), MessageType.MT_EVENT, timeStamp: DateTime.UtcNow, contentType: contentType), body); //act - var msg = transformer.Unwrap(message); - + var msg = await transformer.UnwrapAsync(message); //assert - Assert.Equal(smallContent, msg.Body.Value); + await Assert.That(msg.Body.Value).IsEqualTo(smallContent); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_is_not_compressed_async.cs b/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_is_not_compressed_async.cs index 619f1cb0e0..0286f726f8 100644 --- a/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_is_not_compressed_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_is_not_compressed_async.cs @@ -1,88 +1,56 @@ -using System; +using System; using System.Net.Mime; using System.Threading.Tasks; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Compression; - public class AsyncUncompressedPayloadTests { - [Fact] + [Test] public async Task When_a_message_is_not_gzip_compressed() { //arrange var transformer = new CompressPayloadTransformer(); transformer.InitializeUnwrapFromAttributeParams(CompressionMethod.GZip); - var smallContent = "small message"; var contentType = new ContentType(MediaTypeNames.Application.Json); - var body = new MessageBody(smallContent, contentType); - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), new("test_topic"), MessageType.MT_EVENT, - timeStamp: DateTime.UtcNow, contentType: contentType - ), - body - ); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), new("test_topic"), MessageType.MT_EVENT, timeStamp: DateTime.UtcNow, contentType: contentType), body); //act var msg = await transformer.UnwrapAsync(message); - //assert - Assert.Equal(smallContent, msg.Body.Value); + await Assert.That(msg.Body.Value).IsEqualTo(smallContent); } - [Fact] + [Test] public async Task When_a_message_is_not_zlib_compressed() { //arrange var transformer = new CompressPayloadTransformer(); transformer.InitializeUnwrapFromAttributeParams(CompressionMethod.Zlib); - var smallContent = "small message"; var contentType = new ContentType(MediaTypeNames.Application.Json); - var body = new MessageBody(smallContent, contentType); - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), new("test_topic"), MessageType.MT_EVENT, - timeStamp: DateTime.UtcNow, contentType: contentType - ), - body - ); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), new("test_topic"), MessageType.MT_EVENT, timeStamp: DateTime.UtcNow, contentType: contentType), body); //act var msg = await transformer.UnwrapAsync(message); - //assert - Assert.Equal(smallContent, msg.Body.Value); + await Assert.That(msg.Body.Value).IsEqualTo(smallContent); } - [Fact] + [Test] public async Task When_a_message_is_not_brotli_compressed() { //arrange var transformer = new CompressPayloadTransformer(); transformer.InitializeUnwrapFromAttributeParams(CompressionMethod.Brotli); - var smallContent = "small message"; var contentType = new ContentType(MediaTypeNames.Application.Json); - var body = new MessageBody(smallContent, contentType); - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), new("test_topic"), MessageType.MT_EVENT, - timeStamp: DateTime.UtcNow, contentType: contentType - ), - body - ); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), new("test_topic"), MessageType.MT_EVENT, timeStamp: DateTime.UtcNow, contentType: contentType), body); //act var msg = await transformer.UnwrapAsync(message); - //assert - Assert.Equal(smallContent, msg.Body.Value); + await Assert.That(msg.Body.Value).IsEqualTo(smallContent); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_is_under_the_threshold.cs b/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_is_under_the_threshold.cs index 3768ccc2b6..22dc021151 100644 --- a/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_is_under_the_threshold.cs +++ b/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_is_under_the_threshold.cs @@ -1,41 +1,30 @@ -using System; +using System; using System.IO.Compression; using System.Net.Mime; using Paramore.Brighter.Extensions; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Compression; - public class SmallPayloadNotCompressedTests { private readonly CompressPayloadTransformer _transformer; private readonly Message _message; private readonly RoutingKey _topic = new("test_topic"); - public SmallPayloadNotCompressedTests() { _transformer = new CompressPayloadTransformer(); _transformer.InitializeWrapFromAttributeParams(CompressionMethod.GZip, CompressionLevel.Optimal, 5); - string body = "small message"; var contentType = new ContentType(MediaTypeNames.Application.Json); - _message = new Message( - new MessageHeader(Id.Random(), _topic, MessageType.MT_EVENT, - timeStamp: DateTime.UtcNow, contentType: contentType), - new MessageBody(body, contentType, CharacterEncoding.UTF8) - ); + _message = new Message(new MessageHeader(Id.Random(), _topic, MessageType.MT_EVENT, timeStamp: DateTime.UtcNow, contentType: contentType), new MessageBody(body, contentType, CharacterEncoding.UTF8)); } - [Fact] - public void When_a_message_is_under_the_threshold() + [Test] + public async Task When_a_message_is_under_the_threshold() { - var uncompressedMessage = _transformer.Wrap(_message, new Publication{Topic = _topic}); - + var uncompressedMessage = await _transformer.WrapAsync(_message, new Publication { Topic = _topic }); //look for gzip in the bytes - Assert.Equal( - new ContentType(MediaTypeNames.Application.Json){CharSet = CharacterEncoding.UTF8.FromCharacterEncoding()}, - uncompressedMessage.Body.ContentType); - Assert.Equal(_message.Body.Value, uncompressedMessage.Body.Value); + await Assert.That(uncompressedMessage.Body.ContentType).IsEqualTo(new ContentType(MediaTypeNames.Application.Json) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }); + await Assert.That(uncompressedMessage.Body.Value).IsEqualTo(_message.Body.Value); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_is_under_the_threshold_async.cs b/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_is_under_the_threshold_async.cs index 845249e5d3..83fec6a6a3 100644 --- a/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_is_under_the_threshold_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Compression/When_a_message_is_under_the_threshold_async.cs @@ -1,41 +1,31 @@ -using System; +using System; using System.IO.Compression; using System.Net.Mime; using System.Threading.Tasks; using Paramore.Brighter.Extensions; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Compression; - public class AsyncSmallPayloadNotCompressedTests { private readonly CompressPayloadTransformer _transformer; private readonly Message _message; private readonly RoutingKey _topic = new("test_topic"); private const ushort GZIP_LEAD_BYTES = 0x8b1f; - public AsyncSmallPayloadNotCompressedTests() { _transformer = new CompressPayloadTransformer(); _transformer.InitializeWrapFromAttributeParams(CompressionMethod.GZip, CompressionLevel.Optimal, 5); - string body = "small message"; - _message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _topic, MessageType.MT_EVENT, - timeStamp: DateTime.UtcNow, contentType: new ContentType(MediaTypeNames.Application.Json) - ), - new MessageBody(body, new ContentType(MediaTypeNames.Application.Json), CharacterEncoding.UTF8) - ); + _message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _topic, MessageType.MT_EVENT, timeStamp: DateTime.UtcNow, contentType: new ContentType(MediaTypeNames.Application.Json)), new MessageBody(body, new ContentType(MediaTypeNames.Application.Json), CharacterEncoding.UTF8)); } - [Fact] + [Test] public async Task When_a_message_is_under_the_threshold() { - var uncompressedMessage = await _transformer.WrapAsync(_message, new Publication{Topic = new RoutingKey(_topic)}); - + var uncompressedMessage = await _transformer.WrapAsync(_message, new Publication { Topic = new RoutingKey(_topic) }); //look for gzip in the bytes - Assert.Equal(new ContentType(MediaTypeNames.Application.Json){CharSet = CharacterEncoding.UTF8.FromCharacterEncoding()}, uncompressedMessage.Body.ContentType); - Assert.Equal(_message.Body.Value, uncompressedMessage.Body.Value); + await Assert.That(uncompressedMessage.Body.ContentType).IsEqualTo(new ContentType(MediaTypeNames.Application.Json) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }); + await Assert.That(uncompressedMessage.Body.Value).IsEqualTo(_message.Body.Value); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Compression/When_decompressing_a_large_payload_in_a_message.cs b/tests/Paramore.Brighter.Core.Tests/Compression/When_decompressing_a_large_payload_in_a_message.cs index a25fc970f3..d6454da204 100644 --- a/tests/Paramore.Brighter.Core.Tests/Compression/When_decompressing_a_large_payload_in_a_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/Compression/When_decompressing_a_large_payload_in_a_message.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.IO.Compression; using System.Net.Mime; @@ -6,134 +6,79 @@ using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Extensions; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Compression; - public class UncompressLargePayloadTests { - [Fact] - public void When_decompressing_a_large_gzip_payload_in_a_message() + [Test] + public async Task When_decompressing_a_large_gzip_payload_in_a_message() { //arrange var transformer = new CompressPayloadTransformer(); transformer.InitializeUnwrapFromAttributeParams(CompressionMethod.GZip); - var largeContent = DataGenerator.CreateString(6000); - using var input = new MemoryStream(Encoding.ASCII.GetBytes(largeContent)); using var output = new MemoryStream(); - Stream compressionStream = new GZipStream(output, CompressionLevel.Optimal); - string mimeType = CompressPayloadTransformer.GZIP; input.CopyToAsync(compressionStream); compressionStream.FlushAsync(); - var body = new MessageBody(output.ToArray(), new ContentType(mimeType)); - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey("test_topic"), MessageType.MT_EVENT, - timeStamp: DateTime.UtcNow, contentType: new ContentType(mimeType) - ), - body - ); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey("test_topic"), MessageType.MT_EVENT, timeStamp: DateTime.UtcNow, contentType: new ContentType(mimeType)), body); message.Header.Bag[CompressPayloadTransformer.ORIGINAL_CONTENTTYPE_HEADER] = MediaTypeNames.Application.Json; - //act - var msg = transformer.Unwrap(message); - + var msg = await transformer.UnwrapAsync(message); //assert - Assert.Equal(largeContent, msg.Body.Value); - Assert.Equal(new ContentType(MediaTypeNames.Application.Json){CharSet = CharacterEncoding.UTF8.FromCharacterEncoding()}, - msg.Body.ContentType); - Assert.Equal(new ContentType(MediaTypeNames.Application.Json){ CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }, - msg.Header.ContentType); + await Assert.That(msg.Body.Value).IsEqualTo(largeContent); + await Assert.That(msg.Body.ContentType).IsEqualTo(new ContentType(MediaTypeNames.Application.Json) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }); + await Assert.That(msg.Header.ContentType).IsEqualTo(new ContentType(MediaTypeNames.Application.Json) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }); } - - [Fact] - public void When_decompressing_a_large_zlib_payload_in_a_message() + + [Test] + public async Task When_decompressing_a_large_zlib_payload_in_a_message() { //arrange var transformer = new CompressPayloadTransformer(); transformer.InitializeUnwrapFromAttributeParams(CompressionMethod.Zlib); - var largeContent = DataGenerator.CreateString(6000); - using var input = new MemoryStream(Encoding.ASCII.GetBytes(largeContent)); using var output = new MemoryStream(); - Stream compressionStream = new ZLibStream(output, CompressionLevel.Optimal); - string mimeType = CompressPayloadTransformer.DEFLATE; input.CopyToAsync(compressionStream); compressionStream.FlushAsync(); - var body = new MessageBody(output.ToArray(), new ContentType(mimeType)); - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey("test_topic"), MessageType.MT_EVENT, - timeStamp:DateTime.UtcNow, contentType: new ContentType(mimeType) - ), - body - ); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey("test_topic"), MessageType.MT_EVENT, timeStamp: DateTime.UtcNow, contentType: new ContentType(mimeType)), body); message.Header.Bag[CompressPayloadTransformer.ORIGINAL_CONTENTTYPE_HEADER] = MediaTypeNames.Application.Json; - - //act - var msg = transformer.Unwrap(message); - + //act + var msg = await transformer.UnwrapAsync(message); //assert - Assert.Equal(largeContent, msg.Body.Value); - Assert.Equal( - new ContentType(MediaTypeNames.Application.Json){ CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }, - msg.Body.ContentType); - Assert.Equal( - new ContentType(MediaTypeNames.Application.Json){ CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }, - msg.Header.ContentType); + await Assert.That(msg.Body.Value).IsEqualTo(largeContent); + await Assert.That(msg.Body.ContentType).IsEqualTo(new ContentType(MediaTypeNames.Application.Json) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }); + await Assert.That(msg.Header.ContentType).IsEqualTo(new ContentType(MediaTypeNames.Application.Json) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }); } - - [Fact] - public void When_decompressing_a_large_brotli_payload_in_a_message() + + [Test] + public async Task When_decompressing_a_large_brotli_payload_in_a_message() { //arrange var transformer = new CompressPayloadTransformer(); transformer.InitializeUnwrapFromAttributeParams(CompressionMethod.Brotli); - var largeContent = DataGenerator.CreateString(6000); - using var input = new MemoryStream(Encoding.ASCII.GetBytes(largeContent)); using var output = new MemoryStream(); - Stream compressionStream = new BrotliStream(output, CompressionLevel.Optimal); - string mimeType = CompressPayloadTransformer.BROTLI; input.CopyToAsync(compressionStream); compressionStream.FlushAsync(); - var body = new MessageBody(output.ToArray(), new ContentType(mimeType)); - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey("test_topic"), MessageType.MT_EVENT, - timeStamp: DateTime.UtcNow, contentType: new ContentType(mimeType) - ), - body - ); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey("test_topic"), MessageType.MT_EVENT, timeStamp: DateTime.UtcNow, contentType: new ContentType(mimeType)), body); message.Header.Bag[CompressPayloadTransformer.ORIGINAL_CONTENTTYPE_HEADER] = MediaTypeNames.Application.Json; - //act - var msg = transformer.Unwrap(message); - - //assert - Assert.Equal(largeContent, msg.Body.Value); - Assert.Equal( - new ContentType(MediaTypeNames.Application.Json){CharSet = CharacterEncoding.UTF8.FromCharacterEncoding()}, - msg.Body.ContentType); - Assert.Equal( - new ContentType(MediaTypeNames.Application.Json){ CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }, - msg.Header.ContentType); - + var msg = await transformer.UnwrapAsync(message); + //assert + await Assert.That(msg.Body.Value).IsEqualTo(largeContent); + await Assert.That(msg.Body.ContentType).IsEqualTo(new ContentType(MediaTypeNames.Application.Json) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }); + await Assert.That(msg.Header.ContentType).IsEqualTo(new ContentType(MediaTypeNames.Application.Json) { CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() }); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Compression/When_decompressing_a_large_payload_in_a_message_async.cs b/tests/Paramore.Brighter.Core.Tests/Compression/When_decompressing_a_large_payload_in_a_message_async.cs index ad097ef79e..1e04ec8a5c 100644 --- a/tests/Paramore.Brighter.Core.Tests/Compression/When_decompressing_a_large_payload_in_a_message_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Compression/When_decompressing_a_large_payload_in_a_message_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.IO.Compression; using System.Net.Mime; @@ -7,128 +7,92 @@ using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Extensions; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Compression; - public class AsyncUncompressLargePayloadTests { private readonly RoutingKey _routingKey = new RoutingKey("test_topic"); - - [Fact] + [Test] public async Task When_decompressing_a_large_gzip_payload_in_a_message() { //arrange var transformer = new CompressPayloadTransformer(); transformer.InitializeUnwrapFromAttributeParams(CompressionMethod.GZip); - var largeContent = DataGenerator.CreateString(6000); - using var input = new MemoryStream(Encoding.ASCII.GetBytes(largeContent)); using var output = new MemoryStream(); - Stream compressionStream = new GZipStream(output, CompressionLevel.Optimal); - string mimeType = CompressPayloadTransformer.GZIP; await input.CopyToAsync(compressionStream); await compressionStream.FlushAsync(); - var body = new MessageBody(output.ToArray(), new ContentType(mimeType)); - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT, - timeStamp:DateTime.UtcNow, contentType: new ContentType(mimeType) - ), - body - ); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT, timeStamp: DateTime.UtcNow, contentType: new ContentType(mimeType)), body); message.Header.Bag[CompressPayloadTransformer.ORIGINAL_CONTENTTYPE_HEADER] = MediaTypeNames.Application.Json; - //act var msg = await transformer.UnwrapAsync(message); - //assert - Assert.Equal(largeContent, msg.Body.Value); - var expected = new ContentType(MediaTypeNames.Application.Json){CharSet = CharacterEncoding.UTF8.FromCharacterEncoding()}; - Assert.Equal(expected, msg.Body.ContentType); - Assert.Equal(expected, msg.Header.ContentType); + await Assert.That(msg.Body.Value).IsEqualTo(largeContent); + var expected = new ContentType(MediaTypeNames.Application.Json) + { + CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() + }; + await Assert.That(msg.Body.ContentType).IsEqualTo(expected); + await Assert.That(msg.Header.ContentType).IsEqualTo(expected); } - - [Fact] + + [Test] public async Task When_decompressing_a_large_zlib_payload_in_a_message() { //arrange var transformer = new CompressPayloadTransformer(); transformer.InitializeUnwrapFromAttributeParams(CompressionMethod.Zlib); - var largeContent = DataGenerator.CreateString(6000); - using var input = new MemoryStream(Encoding.ASCII.GetBytes(largeContent)); using var output = new MemoryStream(); - Stream compressionStream = new ZLibStream(output, CompressionLevel.Optimal); - string mimeType = CompressPayloadTransformer.DEFLATE; await input.CopyToAsync(compressionStream); await compressionStream.FlushAsync(); - var body = new MessageBody(output.ToArray(), new ContentType(mimeType)); - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT, - timeStamp: DateTime.UtcNow, contentType: new ContentType(mimeType) - ), - body - ); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT, timeStamp: DateTime.UtcNow, contentType: new ContentType(mimeType)), body); message.Header.Bag[CompressPayloadTransformer.ORIGINAL_CONTENTTYPE_HEADER] = MediaTypeNames.Application.Json; - - //act + //act var msg = await transformer.UnwrapAsync(message); - //assert - Assert.Equal(largeContent, msg.Body.Value); - var expected = new ContentType(MediaTypeNames.Application.Json){CharSet = CharacterEncoding.UTF8.FromCharacterEncoding()}; - Assert.Equal(expected, msg.Body.ContentType); - Assert.Equal(expected, msg.Header.ContentType); + await Assert.That(msg.Body.Value).IsEqualTo(largeContent); + var expected = new ContentType(MediaTypeNames.Application.Json) + { + CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() + }; + await Assert.That(msg.Body.ContentType).IsEqualTo(expected); + await Assert.That(msg.Header.ContentType).IsEqualTo(expected); } - - [Fact] + + [Test] public async Task When_decompressing_a_large_brotli_payload_in_a_message() { //arrange var transformer = new CompressPayloadTransformer(); transformer.InitializeUnwrapFromAttributeParams(CompressionMethod.Brotli); - var largeContent = DataGenerator.CreateString(6000); - using var input = new MemoryStream(Encoding.ASCII.GetBytes(largeContent)); using var output = new MemoryStream(); - Stream compressionStream = new BrotliStream(output, CompressionLevel.Optimal); - string mimeType = CompressPayloadTransformer.BROTLI; await input.CopyToAsync(compressionStream); await compressionStream.FlushAsync(); - var body = new MessageBody(output.ToArray(), new ContentType(mimeType)); - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT, - timeStamp: DateTime.UtcNow, contentType: new ContentType(mimeType) - ), - body - ); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT, timeStamp: DateTime.UtcNow, contentType: new ContentType(mimeType)), body); message.Header.Bag[CompressPayloadTransformer.ORIGINAL_CONTENTTYPE_HEADER] = MediaTypeNames.Application.Json; - //act - var msg = await transformer.UnwrapAsync(message); - - //assert - Assert.Equal(largeContent, msg.Body.Value); - var expected = new ContentType(MediaTypeNames.Application.Json){CharSet = CharacterEncoding.UTF8.FromCharacterEncoding()}; - Assert.Equal(expected, msg.Body.ContentType); - Assert.Equal(expected, msg.Header.ContentType); + var msg = await transformer.UnwrapAsync(message); + //assert + await Assert.That(msg.Body.Value).IsEqualTo(largeContent); + var expected = new ContentType(MediaTypeNames.Application.Json) + { + CharSet = CharacterEncoding.UTF8.FromCharacterEncoding() + }; + await Assert.That(msg.Body.ContentType).IsEqualTo(expected); + await Assert.That(msg.Header.ContentType).IsEqualTo(expected); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Context/When_Accessing_A_Request_Context.cs b/tests/Paramore.Brighter.Core.Tests/Context/When_Accessing_A_Request_Context.cs index 81c9c8c07c..36a800a320 100644 --- a/tests/Paramore.Brighter.Core.Tests/Context/When_Accessing_A_Request_Context.cs +++ b/tests/Paramore.Brighter.Core.Tests/Context/When_Accessing_A_Request_Context.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using OpenTelemetry; @@ -9,55 +9,40 @@ using Paramore.Brighter.FeatureSwitch.Providers; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Context; - -public class RequestContextTests +public class RequestContextTests { - [Fact] - public void When_Accessing_A_Request_Context() + [Test] + public async Task When_Accessing_A_Request_Context() { //arrange var builder = Sdk.CreateTracerProviderBuilder(); - var exportedActivities = new List(); - var traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(exportedActivities) - .Build(); - + var traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(exportedActivities).Build(); var activitySource = new ActivitySource("Paramore.Brighter.Tests"); var span = activitySource.StartActivity(); - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey("test"), MessageType.MT_COMMAND), - new MessageBody("test content")); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey("test"), MessageType.MT_COMMAND), new MessageBody("test content")); //act - var context = new RequestContext { - FeatureSwitches = FluentConfigRegistryBuilder - .With() - .StatusOf() - .Is(FeatureSwitchStatus.On) - .Build(), - Policies = new PolicyRegistry{ - { "key", Policy.NoOp() } + FeatureSwitches = FluentConfigRegistryBuilder.With().StatusOf().Is(FeatureSwitchStatus.On).Build(), + Policies = new PolicyRegistry + { + { + "key", + Policy.NoOp() + } } }; context.Bag.AddOrUpdate("key", "value", (key, oldValue) => "value"); context.Span = span; - context.OriginatingMessage = message; - + context.OriginatingMessage = message; //assert - Assert.Equal(context.Bag["key"], "value"); - Assert.NotNull(context.Policies["key"]); - Assert.Equal(span?.Id, context.Span?.Id); - Assert.NotNull(context.OriginatingMessage); - Assert.Equal(context.OriginatingMessage.Header.MessageId, message.Header.MessageId); - + await Assert.That(context.Bag["key"]).IsEqualTo("value"); + await Assert.That(context.Policies["key"]).IsNotNull(); + await Assert.That(context.Span?.Id).IsEqualTo(span?.Id); + await Assert.That(context.OriginatingMessage).IsNotNull(); + await Assert.That(message.Header.MessageId).IsEqualTo(context.OriginatingMessage.Header.MessageId); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Context/When_Creating_A_Request_Context.cs b/tests/Paramore.Brighter.Core.Tests/Context/When_Creating_A_Request_Context.cs index b3c3e5f9bc..5a6fc7b5ab 100644 --- a/tests/Paramore.Brighter.Core.Tests/Context/When_Creating_A_Request_Context.cs +++ b/tests/Paramore.Brighter.Core.Tests/Context/When_Creating_A_Request_Context.cs @@ -1,23 +1,18 @@ -using Xunit; - namespace Paramore.Brighter.Core.Tests.Context; - public class RequestContextFactoryTests { - [Fact] - public void When_Creating_A_Request_Context() + [Test] + public async Task When_Creating_A_Request_Context() { //arrange var requestContextFactory = new InMemoryRequestContextFactory(); - //act var context = requestContextFactory.Create(); - //assert - Assert.NotNull(context); - Assert.NotNull(context.Bag); - Assert.Null(context.Policies); - Assert.Null(context.FeatureSwitches); - Assert.Null(context.Span); + await Assert.That(context).IsNotNull(); + await Assert.That(context.Bag).IsNotNull(); + await Assert.That(context.Policies).IsNull(); + await Assert.That(context.FeatureSwitches).IsNull(); + await Assert.That(context.Span).IsNull(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_configuring_a_control_bus.cs b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_configuring_a_control_bus.cs index 6ac41e7f5a..b8cef6bb66 100644 --- a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_configuring_a_control_bus.cs +++ b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_configuring_a_control_bus.cs @@ -1,7 +1,6 @@ using System; using FakeItEasy; using Paramore.Brighter.Observability; -using Xunit; using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.ServiceActivator.ControlBus; using Paramore.Brighter.ServiceActivator.Ports.Commands; @@ -13,30 +12,20 @@ public class ControlBusBuilderTests private Dispatcher _controlBus; private readonly ControlBusReceiverBuilder _busReceiverBuilder; private readonly string _hostName = "tests"; - public ControlBusBuilderTests() { var dispatcher = A.Fake(); var bus = new InternalBus(); - - _busReceiverBuilder = (ControlBusReceiverBuilder - .With() - .Dispatcher(dispatcher) - .ProducerRegistryFactory(new InMemoryProducerRegistryFactory(bus, - [ - new Publication{Topic = new RoutingKey("MyTopic"), RequestType = typeof(ConfigurationCommand)} - ], InstrumentationOptions.All)) - .ChannelFactory(new InMemoryChannelFactory(bus, TimeProvider.System)) as ControlBusReceiverBuilder)!; + _busReceiverBuilder = (ControlBusReceiverBuilder.With().Dispatcher(dispatcher).ProducerRegistryFactory(new InMemoryProducerRegistryFactory(bus, [new Publication { Topic = new RoutingKey("MyTopic"), RequestType = typeof(ConfigurationCommand) }], InstrumentationOptions.All)).ChannelFactory(new InMemoryChannelFactory(bus, TimeProvider.System)) as ControlBusReceiverBuilder)!; } - [Fact] - public void When_configuring_a_control_bus() + [Test] + public async Task When_configuring_a_control_bus() { _controlBus = _busReceiverBuilder.Build(_hostName); - - Assert.Contains(_controlBus.Subscriptions, cn => cn.Name == $"{_hostName}.{ControlBusReceiverBuilder.CONFIGURATION}"); - Assert.Contains(_controlBus.Subscriptions, cn => cn.Name == $"{_hostName}.{ControlBusReceiverBuilder.HEARTBEAT}"); - Assert.NotNull(_controlBus.CommandProcessor); + await Assert.That(_controlBus.Subscriptions).Contains(cn => cn.Name == $"{_hostName}.{ControlBusReceiverBuilder.CONFIGURATION}"); + await Assert.That(_controlBus.Subscriptions).Contains(cn => cn.Name == $"{_hostName}.{ControlBusReceiverBuilder.HEARTBEAT}"); + await Assert.That(_controlBus.CommandProcessor).IsNotNull(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_creating_a_control_bus_sender.cs b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_creating_a_control_bus_sender.cs index bbc8fd63ed..91664df783 100644 --- a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_creating_a_control_bus_sender.cs +++ b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_creating_a_control_bus_sender.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Transactions; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.ControlBus { @@ -12,27 +11,18 @@ public class ControlBusSenderFactoryTests private readonly IAmAControlBusSenderFactory _senderFactory; private readonly IAmAnOutboxSync _outbox; private readonly IAmAMessageProducerSync _gateway; - public ControlBusSenderFactoryTests() { _outbox = new InMemoryOutbox(TimeProvider.System); _gateway = new InMemoryMessageProducer(new InternalBus()); - _senderFactory = new ControlBusSenderFactory(); } - [Fact] - public void When_creating_a_control_bus_sender() + [Test] + public async Task When_creating_a_control_bus_sender() { - _sender = _senderFactory.Create( - _outbox, - new ProducerRegistry(new Dictionary - { - {new RoutingKey("MyTopic"), _gateway}, - }), - tracer: new BrighterTracer()); - - Assert.NotNull(_sender); + _sender = _senderFactory.Create(_outbox, new ProducerRegistry(new Dictionary { { new RoutingKey("MyTopic"), _gateway }, }), tracer: new BrighterTracer()); + await Assert.That(_sender).IsNotNull(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_from_a_configuration_command_from_a_message.cs b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_from_a_configuration_command_from_a_message.cs index 4ae95bf043..0e0ddf0551 100644 --- a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_from_a_configuration_command_from_a_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_from_a_configuration_command_from_a_message.cs @@ -1,33 +1,28 @@ -using Xunit; using Paramore.Brighter.ServiceActivator.Ports; using Paramore.Brighter.ServiceActivator.Ports.Commands; namespace Paramore.Brighter.Core.Tests.ControlBus { - public class ConfigurationCommandMessageMapperTests + public class ConfigurationCommandMessageMapperTests { private readonly IAmAMessageMapper _mapper; private readonly Message _message; private ConfigurationCommand _command; - public ConfigurationCommandMessageMapperTests() { _mapper = new ConfigurationCommandMessageMapper(); - var command = new ConfigurationCommand(ConfigurationCommandType.CM_STARTALL, "getallthethings"); - _message = _mapper.MapToMessage(command, new Publication(){Topic = new RoutingKey("myTopic")}); + _message = _mapper.MapToMessage(command, new Publication() { Topic = new RoutingKey("myTopic") }); } - [Fact] - public void When_mapping_from_a_configuration_command_from_a_message() + [Test] + public async Task When_mapping_from_a_configuration_command_from_a_message() { _command = _mapper.MapToRequest(_message); - // Should rehydrate the command type - Assert.Equal(ConfigurationCommandType.CM_STARTALL, _command.Type); + await Assert.That(_command.Type).IsEqualTo(ConfigurationCommandType.CM_STARTALL); // Should rehydrate the connection name - Assert.Equal(new SubscriptionName("getallthethings"), _command.SubscriptionName); - + await Assert.That(_command.SubscriptionName).IsEqualTo(new SubscriptionName("getallthethings")); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_from_a_heartbeat_reply_to_a_message.cs b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_from_a_heartbeat_reply_to_a_message.cs index 69a100973a..5036c379ed 100644 --- a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_from_a_heartbeat_reply_to_a_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_from_a_heartbeat_reply_to_a_message.cs @@ -1,5 +1,4 @@ -using System; -using Xunit; +using System; using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.ServiceActivator.Ports.Commands; using Paramore.Brighter.ServiceActivator.Ports.Mappers; @@ -14,47 +13,39 @@ public class HeartbeatReplyToMessageMapperTests private const string TOPIC = "test.topic"; private readonly string _correlationId = Guid.NewGuid().ToString(); private readonly Publication _publication; - public HeartbeatReplyToMessageMapperTests() { _mapper = new HeartbeatReplyCommandMessageMapper(); _request = new HeartbeatReply("Test.Hostname", new ReplyAddress(TOPIC, _correlationId)); - var firstConsumer = new RunningConsumer(new ConsumerName("Test.Consumer1"), ConsumerState.Open); _request.Consumers.Add(firstConsumer); - - var secondConsumer = new RunningConsumer(new ConsumerName("More.Consumers2"),ConsumerState.Shut ); + var secondConsumer = new RunningConsumer(new ConsumerName("More.Consumers2"), ConsumerState.Shut); _request.Consumers.Add(secondConsumer); - - _publication = new Publication { Topic = new RoutingKey(TOPIC) }; + _publication = new Publication + { + Topic = new RoutingKey(TOPIC) + }; } - [Fact] - public void When_mapping_from_a_heartbeat_reply_to_a_message() + [Test] + public async Task When_mapping_from_a_heartbeat_reply_to_a_message() { _message = _mapper.MapToMessage(_request, _publication); - //Should put the reply to as the topic - Assert.Equal(new RoutingKey(TOPIC), _message.Header.Topic); - + await Assert.That(_message.Header.Topic).IsEqualTo(new RoutingKey(TOPIC)); //Should put the correlation_id in the header - Assert.Equal(_correlationId, _message.Header.CorrelationId); - + await Assert.That(_message.Header.CorrelationId.Value).IsEqualTo(_correlationId); // Should put the correlation_id in the reply - Assert.Equal(_correlationId, _request.CorrelationId.ToString()); - + await Assert.That(_request.CorrelationId.ToString()).IsEqualTo(_correlationId); // Reply correlation id should be set to the sender's address correlation id - Assert.Equal(_request.CorrelationId, Reply.SenderCorrelationIdOrDefault(_request.SendersAddress)); - + await Assert.That(Reply.SenderCorrelationIdOrDefault(_request.SendersAddress)).IsEqualTo(_request.CorrelationId); //Should put the connections into the body - Assert.Contains("\"consumerName\":\"Test.Consumer1\"", _message.Body.Value); - Assert.Contains("\"state\":\"Open", _message.Body.Value); - Assert.Contains("\"consumerName\":\"More.Consumers2\"", _message.Body.Value); - Assert.Contains("\"state\":\"Shut", _message.Body.Value); - - + await Assert.That(_message.Body.Value).Contains("\"consumerName\":\"Test.Consumer1\""); + await Assert.That(_message.Body.Value).Contains("\"state\":\"Open"); + await Assert.That(_message.Body.Value).Contains("\"consumerName\":\"More.Consumers2\""); + await Assert.That(_message.Body.Value).Contains("\"state\":\"Shut"); //Should put the hostname in the message body - Assert.Contains("\"hostName\":\"Test.Hostname\"", _message.Body.Value); + await Assert.That(_message.Body.Value).Contains("\"hostName\":\"Test.Hostname\""); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_from_a_heartbeat_request_to_a_message.cs b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_from_a_heartbeat_request_to_a_message.cs index 472d894f82..c557d24154 100644 --- a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_from_a_heartbeat_request_to_a_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_from_a_heartbeat_request_to_a_message.cs @@ -1,5 +1,4 @@ -using System; -using Xunit; +using System; using Paramore.Brighter.ServiceActivator.Ports.Commands; using Paramore.Brighter.ServiceActivator.Ports.Mappers; @@ -13,29 +12,28 @@ public class HearbeatRequestToMessageMapperTests private const string TOPIC = "test.topic"; private readonly string _correlationId = Guid.NewGuid().ToString(); private readonly Publication _publication; - public HearbeatRequestToMessageMapperTests() { _mapper = new HeartbeatRequestCommandMessageMapper(); - _request = new HeartbeatRequest(new ReplyAddress(TOPIC, _correlationId)); - - _publication = new Publication { Topic = new RoutingKey(TOPIC) }; + _publication = new Publication + { + Topic = new RoutingKey(TOPIC) + }; } - [Fact] - public void When_mapping_from_a_heartbeat_request_to_a_message() + [Test] + public async Task When_mapping_from_a_heartbeat_request_to_a_message() { _message = _mapper.MapToMessage(_request, _publication); - //Should serialize the message_type to the header - Assert.Equal(MessageType.MT_COMMAND, _message.Header.MessageType); + await Assert.That(_message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); //Should serialize the message_id to the message body - Assert.Contains($"\"id\":\"{_request.Id}\"", _message.Body.Value); + await Assert.That(_message.Body.Value).Contains($"\"id\":\"{_request.Id}\""); //Should serialize the topic to the message body - Assert.Equal(TOPIC, _message.Header.ReplyTo); + await Assert.That(_message.Header.ReplyTo?.Value).IsEqualTo(TOPIC); //Should serialize the correlation_id to the message body - Assert.Equal(_correlationId, _message.Header.CorrelationId); + await Assert.That(_message.Header.CorrelationId.Value).IsEqualTo(_correlationId); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_from_a_message_to_a_heartbeat_reply.cs b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_from_a_message_to_a_heartbeat_reply.cs index e0ac3610ee..438bef30d2 100644 --- a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_from_a_message_to_a_heartbeat_reply.cs +++ b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_from_a_message_to_a_heartbeat_reply.cs @@ -1,5 +1,4 @@ -using System; -using Xunit; +using System; using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.ServiceActivator.Ports.Commands; using Paramore.Brighter.ServiceActivator.Ports.Mappers; @@ -14,36 +13,30 @@ public class HeartbeatMessageToReplyTests private const string MESSAGE_BODY = "{\r\n \"HostName\": \"Test.Hostname\",\r\n \"Consumers\": [\r\n {\r\n \"ConsumerName\": \"Test.Subscription\",\r\n \"State\": 1\r\n },\r\n {\r\n \"ConsumerName\": \"More.Consumers\",\r\n \"State\": 0\r\n }\r\n ]\r\n}"; private readonly RoutingKey _routingKey = new("test.topic"); private readonly string _correlationId = Guid.NewGuid().ToString(); - public HeartbeatMessageToReplyTests() { _mapper = new HeartbeatReplyCommandMessageMapper(); - var header = new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND, - timeStamp: DateTime.UtcNow, correlationId:_correlationId - ); + var header = new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow, correlationId: _correlationId); var body = new MessageBody(MESSAGE_BODY); _message = new Message(header, body); } - [Fact] - public void When_mapping_from_a_message_to_a_heartbeat_reply() + [Test] + public async Task When_mapping_from_a_message_to_a_heartbeat_reply() { _request = _mapper.MapToRequest(_message); - // Should set the sender address topic - Assert.Equal(_routingKey, _request.SendersAddress.Topic); + await Assert.That(_request.SendersAddress.Topic).IsEqualTo(_routingKey); // Should set the sender correlation_id - Assert.Equal(_correlationId, _request.SendersAddress.CorrelationId); - + await Assert.That(_request.SendersAddress.CorrelationId.Value).IsEqualTo(_correlationId); // Reply should have the same correlation id as the original message - Assert.NotEqual(Reply.SenderCorrelationIdOrDefault(_request.SendersAddress), Id.Empty); - Assert.Equal(_request.CorrelationId, Reply.SenderCorrelationIdOrDefault(_request.SendersAddress)); - + await Assert.That(Id.Empty).IsNotEqualTo(Reply.SenderCorrelationIdOrDefault(_request.SendersAddress)); + await Assert.That(Reply.SenderCorrelationIdOrDefault(_request.SendersAddress)).IsEqualTo(_request.CorrelationId); // Should set the hostName - Assert.Equal("Test.Hostname", _request.HostName); + await Assert.That(_request.HostName).IsEqualTo("Test.Hostname"); // Should contain the consumers - Assert.Contains(_request.Consumers, rc => rc.ConsumerName == "Test.Subscription" && rc.State == ConsumerState.Open); - Assert.Contains(_request.Consumers, rc => rc.ConsumerName == "More.Consumers" && rc.State == ConsumerState.Shut); + await Assert.That(_request.Consumers).Contains(rc => rc.ConsumerName == "Test.Subscription" && rc.State == ConsumerState.Open); + await Assert.That(_request.Consumers).Contains(rc => rc.ConsumerName == "More.Consumers" && rc.State == ConsumerState.Shut); } - } -} + } +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_from_a_message_to_a_heartbeat_request.cs b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_from_a_message_to_a_heartbeat_request.cs index f2f26a3db2..6a38b577b0 100644 --- a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_from_a_message_to_a_heartbeat_request.cs +++ b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_from_a_message_to_a_heartbeat_request.cs @@ -1,5 +1,4 @@ using System; -using Xunit; using Paramore.Brighter.ServiceActivator.Ports.Commands; using Paramore.Brighter.ServiceActivator.Ports.Mappers; @@ -13,36 +12,25 @@ public class HeartbeatMessageToRequestTests private const string TOPIC = "test.topic"; private readonly string _correlationId = Guid.NewGuid().ToString(); private readonly string _commandId = Guid.NewGuid().ToString(); - public HeartbeatMessageToRequestTests() { _mapper = new HeartbeatRequestCommandMessageMapper(); - var messageHeader = new MessageHeader( - Guid.NewGuid().ToString(), - new("Heartbeat"), - MessageType.MT_COMMAND, - timeStamp: DateTime.UtcNow, - correlationId:_correlationId, - replyTo:new RoutingKey(TOPIC)); - + var messageHeader = new MessageHeader(Guid.NewGuid().ToString(), new("Heartbeat"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow, correlationId: _correlationId, replyTo: new RoutingKey(TOPIC)); var body = String.Format("\"Id\": \"{0}\"", _commandId); var messageBody = new MessageBody("{" + body + "}"); _message = new Message(messageHeader, messageBody); } - [Fact] - public void When_mapping_from_a_message_to_a_heartbeat_request() + [Test] + public async Task When_mapping_from_a_message_to_a_heartbeat_request() { _request = _mapper.MapToRequest(_message); - - // Should put the message reply topic into the address - Assert.Equal(new RoutingKey(TOPIC), _request.ReplyAddress.Topic); + await Assert.That(_request.ReplyAddress.Topic.Value).IsEqualTo(TOPIC); // Should put the message correlation id into the address - Assert.Equal(_correlationId, _request.ReplyAddress.CorrelationId); + await Assert.That(_request.ReplyAddress.CorrelationId.Value).IsEqualTo(_correlationId); // Should set the id of the request - Assert.Equal(_commandId, _request.Id); - + await Assert.That(_request.Id.Value).IsEqualTo(_commandId); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_to_a_wire_message_from_a_configuration_command.cs b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_to_a_wire_message_from_a_configuration_command.cs index 8f4fe364a6..fa0dab950e 100644 --- a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_to_a_wire_message_from_a_configuration_command.cs +++ b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_mapping_to_a_wire_message_from_a_configuration_command.cs @@ -1,4 +1,3 @@ -using Xunit; using Paramore.Brighter.ServiceActivator.Ports; using Paramore.Brighter.ServiceActivator.Ports.Commands; @@ -10,31 +9,28 @@ public class ConfigurationCommandToMessageMapperTests private Message _message; private readonly ConfigurationCommand _command; private readonly Publication _publication; - public ConfigurationCommandToMessageMapperTests() { _mapper = new ConfigurationCommandMessageMapper(); - _command = new ConfigurationCommand(ConfigurationCommandType.CM_STARTALL, new SubscriptionName("getallthethings")); - - _publication = new Publication { Topic = new RoutingKey("ConfigurationCommand") }; + _publication = new Publication + { + Topic = new RoutingKey("ConfigurationCommand") + }; } - - [Fact] - public void When_mapping_to_a_wire_message_from_a_configuration_command() + [Test] + public async Task When_mapping_to_a_wire_message_from_a_configuration_command() { _message = _mapper.MapToMessage(_command, _publication); - // Should serialize the command type to the message body - Assert.Contains("\"type\":\"CM_STARTALL", _message.Body.Value); + await Assert.That(_message.Body.Value).Contains("\"type\":\"CM_STARTALL"); // Should serialize the message type to the header - Assert.Equal(MessageType.MT_COMMAND, _message.Header.MessageType); + await Assert.That(_message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); // Should serialize the connection name to the message body - Assert.Contains("\"subscriptionName\":\"getallthethings\"", _message.Body.Value); + await Assert.That(_message.Body.Value).Contains("\"subscriptionName\":\"getallthethings\""); // Should serialize the message id to the message body - Assert.Contains($"\"id\":\"{_command.Id.Value}\"", _message.Body.Value); - + await Assert.That(_message.Body.Value).Contains($"\"id\":\"{_command.Id.Value}\""); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_receiving_a_start_message_for_a_connection.cs b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_receiving_a_start_message_for_a_connection.cs index d3fd10319d..90be4b687b 100644 --- a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_receiving_a_start_message_for_a_connection.cs +++ b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_receiving_a_start_message_for_a_connection.cs @@ -19,11 +19,8 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using FakeItEasy; -using Xunit; using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.ServiceActivator.Ports.Commands; using Paramore.Brighter.ServiceActivator.Ports.Handlers; @@ -36,7 +33,6 @@ public class ConfigurationCommandStartTests private readonly ConfigurationCommandHandler _configurationCommandHandler; private readonly ConfigurationCommand _configurationCommand; private readonly IDispatcher _dispatcher; - public ConfigurationCommandStartTests() { _dispatcher = A.Fake(); @@ -44,13 +40,12 @@ public ConfigurationCommandStartTests() _configurationCommand = new ConfigurationCommand(ConfigurationCommandType.CM_STARTCHANNEL, new SubscriptionName(SubscriptionName)); } - [Fact] - public void When_receiving_a_start_message_for_a_connection() + [Test] + public async Task When_receiving_a_start_message_for_a_connection() { _configurationCommandHandler.Handle(_configurationCommand); - //_should_call_stop_for_the_given_connection A.CallTo(() => _dispatcher.Shut(new SubscriptionName(SubscriptionName))); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_receiving_a_stop_message_for_a_connection.cs b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_receiving_a_stop_message_for_a_connection.cs index 6a0d358d3b..6bdc62ce79 100644 --- a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_receiving_a_stop_message_for_a_connection.cs +++ b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_receiving_a_stop_message_for_a_connection.cs @@ -1,5 +1,4 @@ using FakeItEasy; -using Xunit; using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.ServiceActivator.Ports.Commands; using Paramore.Brighter.ServiceActivator.Ports.Handlers; @@ -12,7 +11,6 @@ public class ConfigurationCommandStopTests private readonly ConfigurationCommandHandler _configurationCommandHandler; private readonly ConfigurationCommand _configurationCommand; private readonly IDispatcher _dispatcher; - public ConfigurationCommandStopTests() { _dispatcher = A.Fake(); @@ -20,13 +18,12 @@ public ConfigurationCommandStopTests() _configurationCommand = new ConfigurationCommand(ConfigurationCommandType.CM_STOPCHANNEL, new SubscriptionName(SUBSCRIPTION_NAME)); } - [Fact] - public void When_receiving_a_stop_message_for_a_connection() + [Test] + public async Task When_receiving_a_stop_message_for_a_connection() { _configurationCommandHandler.Handle(_configurationCommand); - //_should_call_stop_for_the_given_connection - A.CallTo(() => _dispatcher.Shut( new SubscriptionName(SUBSCRIPTION_NAME))); + A.CallTo(() => _dispatcher.Shut(new SubscriptionName(SUBSCRIPTION_NAME))); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_receiving_an_all_start_message.cs b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_receiving_an_all_start_message.cs index 4595ada73c..bcc5569c6a 100644 --- a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_receiving_an_all_start_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_receiving_an_all_start_message.cs @@ -19,11 +19,8 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using FakeItEasy; -using Xunit; using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.ServiceActivator.Ports.Commands; using Paramore.Brighter.ServiceActivator.Ports.Handlers; @@ -35,7 +32,6 @@ public class ConfigurationCommandAllStartTests private readonly ConfigurationCommandHandler _configurationCommandHandler; private readonly ConfigurationCommand _configurationCommand; private readonly IDispatcher _dispatcher; - public ConfigurationCommandAllStartTests() { _dispatcher = A.Fake(); @@ -43,13 +39,12 @@ public ConfigurationCommandAllStartTests() _configurationCommand = new ConfigurationCommand(ConfigurationCommandType.CM_STARTALL, ""); } - [Fact] - public void When_receiving_an_all_start_message() + [Test] + public async Task When_receiving_an_all_start_message() { _configurationCommandHandler.Handle(_configurationCommand); - //_should_call_receive_on_the_dispatcher A.CallTo(() => _dispatcher.Receive()).MustHaveHappened(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_receiving_an_all_stop_message.cs b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_receiving_an_all_stop_message.cs index d58607b705..ba9b388c3f 100644 --- a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_receiving_an_all_stop_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_receiving_an_all_stop_message.cs @@ -19,11 +19,8 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using FakeItEasy; -using Xunit; using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.ServiceActivator.Ports.Commands; using Paramore.Brighter.ServiceActivator.Ports.Handlers; @@ -35,7 +32,6 @@ public class ConfigurationCommandAllStopTests private readonly ConfigurationCommandHandler _configurationCommandHandler; private readonly ConfigurationCommand _configurationCommand; private readonly IDispatcher _dispatcher; - public ConfigurationCommandAllStopTests() { _dispatcher = A.Fake(); @@ -43,13 +39,12 @@ public ConfigurationCommandAllStopTests() _configurationCommand = new ConfigurationCommand(ConfigurationCommandType.CM_STOPALL, ""); } - [Fact] - public void When_receiving_an_all_stop_message() + [Test] + public async Task When_receiving_an_all_stop_message() { _configurationCommandHandler.Handle(_configurationCommand); - //_should_call_end_on_the_dispatcher A.CallTo(() => _dispatcher.End()).MustHaveHappened(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_recieving_a_heartbeat_message.cs b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_recieving_a_heartbeat_message.cs index ab3b785727..b8865a9d8b 100644 --- a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_recieving_a_heartbeat_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_recieving_a_heartbeat_message.cs @@ -1,10 +1,8 @@ -using System; +using System; using System.Collections.Generic; -using System.Reflection; using FakeItEasy; using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; -using Xunit; using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.ServiceActivator.Ports.Commands; using Paramore.Brighter.ServiceActivator.Ports.Handlers; @@ -21,46 +19,38 @@ public class HeartbeatMessageTests private readonly HeartbeatRequestCommandHandler _handler; private readonly HeartbeatRequest _heartbeatRequest; private readonly string _hostName; - public HeartbeatMessageTests() { var dispatcher = A.Fake(); var firstConsumer = A.Fake(); var secondConsumer = A.Fake(); - A.CallTo(() => firstConsumer.Name).Returns(new ConsumerName(TEST_FIRST_CONNECTION_NAME)); A.CallTo(() => firstConsumer.State).Returns(ConsumerState.Open); - A.CallTo(() => secondConsumer.Name).Returns(new ConsumerName(TEST_SECOND_CONNECTION_NAME)); A.CallTo(() => secondConsumer.State).Returns(ConsumerState.Shut); - - A.CallTo(() => dispatcher.Consumers).Returns(new List {firstConsumer, secondConsumer}); - - var hostName = new HostName($"{Environment.MachineName}.{Assembly.GetEntryAssembly()?.FullName}"); + A.CallTo(() => dispatcher.Consumers).Returns(new List { firstConsumer, secondConsumer }); + var hostName = new HostName($"{Environment.MachineName}.{System.Reflection.Assembly.GetEntryAssembly()?.FullName}"); A.CallTo(() => dispatcher.HostName).Returns(hostName); _hostName = hostName; - _heartbeatRequest = new HeartbeatRequest(new ReplyAddress(TEST_ROUTING_KEY, _correlationId)); _handler = new HeartbeatRequestCommandHandler(_spyCommandProcessor, dispatcher); } - [Fact] - public void When_recieving_a_heartbeat_message() + [Test] + public async Task When_recieving_a_heartbeat_message() { _handler.Handle(_heartbeatRequest); - // Should post back a heartbeat response - Assert.True(_spyCommandProcessor.WasCalled(CommandType.Post)); + await Assert.That(_spyCommandProcessor.WasCalled(CommandType.Post)).IsTrue(); // Should have diagnostic information in the response var heartbeatEvent = _spyCommandProcessor.Observe(); - Assert.Equal(_hostName, heartbeatEvent.HostName); - Assert.Equal(new RoutingKey(TEST_ROUTING_KEY), heartbeatEvent.SendersAddress.Topic); - Assert.Equal(_correlationId, heartbeatEvent.SendersAddress.CorrelationId); - Assert.Equal(TEST_FIRST_CONNECTION_NAME, heartbeatEvent.Consumers[0].ConsumerName.ToString()); - Assert.Equal(ConsumerState.Open, heartbeatEvent.Consumers[0].State); - Assert.Equal(TEST_SECOND_CONNECTION_NAME, heartbeatEvent.Consumers[1].ConsumerName.ToString()); - Assert.Equal(ConsumerState.Shut, heartbeatEvent.Consumers[1].State); - + await Assert.That(heartbeatEvent.HostName).IsEqualTo(_hostName); + await Assert.That(heartbeatEvent.SendersAddress.Topic).IsEqualTo(new RoutingKey(TEST_ROUTING_KEY)); + await Assert.That(heartbeatEvent.SendersAddress.CorrelationId.Value).IsEqualTo(_correlationId); + await Assert.That(heartbeatEvent.Consumers[0].ConsumerName.ToString()).IsEqualTo(TEST_FIRST_CONNECTION_NAME); + await Assert.That(heartbeatEvent.Consumers[0].State).IsEqualTo(ConsumerState.Open); + await Assert.That(heartbeatEvent.Consumers[1].ConsumerName.ToString()).IsEqualTo(TEST_SECOND_CONNECTION_NAME); + await Assert.That(heartbeatEvent.Consumers[1].State).IsEqualTo(ConsumerState.Shut); } - } -} + } +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_we_build_a_control_bus_we_can_send_configuration_messages_to_it.cs b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_we_build_a_control_bus_we_can_send_configuration_messages_to_it.cs index 92960241d3..65f95f0f54 100644 --- a/tests/Paramore.Brighter.Core.Tests/ControlBus/When_we_build_a_control_bus_we_can_send_configuration_messages_to_it.cs +++ b/tests/Paramore.Brighter.Core.Tests/ControlBus/When_we_build_a_control_bus_we_can_send_configuration_messages_to_it.cs @@ -1,9 +1,7 @@ using System; -using System.Reflection; using FakeItEasy; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Observability; -using Xunit; using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.ServiceActivator.ControlBus; using Paramore.Brighter.ServiceActivator.Ports.Commands; @@ -16,38 +14,24 @@ public class ControlBusTests private readonly Dispatcher _controlBus; private readonly ConfigurationCommand _configurationCommand; private Exception _exception; - public ControlBusTests() { - var topic = new RoutingKey(Environment.MachineName + Assembly.GetEntryAssembly()?.GetName()); + var topic = new RoutingKey(Environment.MachineName + System.Reflection.Assembly.GetEntryAssembly()?.GetName()); _dispatcher = A.Fake(); var bus = new InternalBus(); - - ControlBusReceiverBuilder busReceiverBuilder = (ControlBusReceiverBuilder) ControlBusReceiverBuilder - .With() - .Dispatcher(_dispatcher) - .ProducerRegistryFactory(new InMemoryProducerRegistryFactory( - bus, - [ - new Publication{Topic = topic, RequestType = typeof(ConfigurationCommand)} - ], InstrumentationOptions.All)) - .ChannelFactory(new InMemoryChannelFactory(bus, TimeProvider.System)); - + ControlBusReceiverBuilder busReceiverBuilder = (ControlBusReceiverBuilder)ControlBusReceiverBuilder.With().Dispatcher(_dispatcher).ProducerRegistryFactory(new InMemoryProducerRegistryFactory(bus, [new Publication { Topic = topic, RequestType = typeof(ConfigurationCommand) }], InstrumentationOptions.All)).ChannelFactory(new InMemoryChannelFactory(bus, TimeProvider.System)); _controlBus = busReceiverBuilder.Build("tests"); - _configurationCommand = new ConfigurationCommand(ConfigurationCommandType.CM_STARTALL, ""); - } - [Fact] - public void When_we_build_a_control_bus_we_can_send_configuration_messages_to_it() + [Test] + public async Task When_we_build_a_control_bus_we_can_send_configuration_messages_to_it() { _exception = Catch.Exception(() => _controlBus.CommandProcessor.Send(_configurationCommand)); - //Should not raise exceptions for missing handlers - Assert.Null(_exception); + await Assert.That(_exception).IsNull(); //Should call the dispatcher to start it A.CallTo(() => _dispatcher.Receive()).MustHaveHappened(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Defer/When_async_handler_succeeds_should_not_defer_message.cs b/tests/Paramore.Brighter.Core.Tests/Defer/When_async_handler_succeeds_should_not_defer_message.cs index 0d0a360fe2..1d847a6a99 100644 --- a/tests/Paramore.Brighter.Core.Tests/Defer/When_async_handler_succeeds_should_not_defer_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/Defer/When_async_handler_succeeds_should_not_defer_message.cs @@ -19,16 +19,13 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.Defer.TestDoubles; using Paramore.Brighter.Defer.Handlers; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Defer { @@ -36,13 +33,11 @@ public class When_async_handler_succeeds_should_not_defer_message { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _command = new(); - public When_async_handler_succeeds_should_not_defer_message() { //Arrange var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var handlerFactory = new SimpleHandlerFactoryAsync(type => { if (type == typeof(MySucceedingDeferHandlerAsync)) @@ -51,28 +46,21 @@ public When_async_handler_succeeds_should_not_defer_message() return new DeferMessageOnErrorHandlerAsync(); throw new ArgumentOutOfRangeException(nameof(type), type.Name, null); }); - MySucceedingDeferHandlerAsync.HandlerCalled = false; - - _commandProcessor = new CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory() - ); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task It_should_complete_without_throwing() { //Act - var exception = await Record.ExceptionAsync(() => _commandProcessor.SendAsync(_command)); + Exception? exception = null; + try { await _commandProcessor.SendAsync(_command); } + catch (Exception e) { exception = e; } //Assert - Assert.Null(exception); // No exception thrown - Assert.True(MySucceedingDeferHandlerAsync.HandlerCalled); // Handler was invoked + await Assert.That(exception).IsNull(); // No exception thrown + await Assert.That(MySucceedingDeferHandlerAsync.HandlerCalled).IsTrue(); // Handler was invoked } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Defer/When_async_handler_throws_exception_should_defer_message.cs b/tests/Paramore.Brighter.Core.Tests/Defer/When_async_handler_throws_exception_should_defer_message.cs index ae5dee1798..ab26bb367b 100644 --- a/tests/Paramore.Brighter.Core.Tests/Defer/When_async_handler_throws_exception_should_defer_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/Defer/When_async_handler_throws_exception_should_defer_message.cs @@ -19,9 +19,7 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Threading.Tasks; using Paramore.Brighter.Actions; @@ -29,7 +27,6 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.Defer.TestDoubles; using Paramore.Brighter.Defer.Handlers; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Defer { @@ -37,13 +34,11 @@ public class When_async_handler_throws_exception_should_defer_message { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _command = new(); - public When_async_handler_throws_exception_should_defer_message() { //Arrange var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var handlerFactory = new SimpleHandlerFactoryAsync(type => { if (type == typeof(MyFailingDeferHandlerAsync)) @@ -52,31 +47,21 @@ public When_async_handler_throws_exception_should_defer_message() return new DeferMessageOnErrorHandlerAsync(); throw new ArgumentOutOfRangeException(nameof(type), type.Name, null); }); - MyFailingDeferHandlerAsync.HandlerCalled = false; - - _commandProcessor = new CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory() - ); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task It_should_throw_DeferMessageAction_with_original_exception_and_delay() { //Act - var exception = await Assert.ThrowsAsync(() => _commandProcessor.SendAsync(_command)); - + var exception = await Assert.That(() => _commandProcessor.SendAsync(_command)).ThrowsExactly(); //Assert - Assert.True(MyFailingDeferHandlerAsync.HandlerCalled); // Handler was invoked - Assert.Equal(MyFailingDeferHandlerAsync.EXCEPTION_MESSAGE, exception.Message); // Preserves original message - Assert.IsType(exception.InnerException); // Preserves original exception type - Assert.Equal(MyFailingDeferHandlerAsync.EXCEPTION_MESSAGE, exception.InnerException.Message); // Inner has same message - Assert.Equal(TimeSpan.FromMilliseconds(5000), exception.Delay); // Delay from attribute flows through + await Assert.That(MyFailingDeferHandlerAsync.HandlerCalled).IsTrue(); // Handler was invoked + await Assert.That(exception.Message).IsEqualTo(MyFailingDeferHandlerAsync.EXCEPTION_MESSAGE); // Preserves original message + await Assert.That(exception.InnerException).IsTypeOf(); // Preserves original exception type + await Assert.That(exception.InnerException.Message).IsEqualTo(MyFailingDeferHandlerAsync.EXCEPTION_MESSAGE); // Inner has same message + await Assert.That(exception.Delay).IsEqualTo(TimeSpan.FromMilliseconds(5000)); // Delay from attribute flows through } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Defer/When_getting_handler_type_from_defer_message_on_error_attribute.cs b/tests/Paramore.Brighter.Core.Tests/Defer/When_getting_handler_type_from_defer_message_on_error_attribute.cs index 99e4a7b8d0..2f9ada6fa8 100644 --- a/tests/Paramore.Brighter.Core.Tests/Defer/When_getting_handler_type_from_defer_message_on_error_attribute.cs +++ b/tests/Paramore.Brighter.Core.Tests/Defer/When_getting_handler_type_from_defer_message_on_error_attribute.cs @@ -19,51 +19,44 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using Paramore.Brighter.Defer.Attributes; using Paramore.Brighter.Defer.Handlers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Defer { public class When_getting_handler_type_from_defer_message_on_error_attribute { - [Fact] - public void It_should_return_correct_sync_handler_configuration() + [Test] + public async Task It_should_return_correct_sync_handler_configuration() { //Arrange var attribute = new DeferMessageOnErrorAttribute(step: 1, delayMilliseconds: 5000); - //Act var handlerType = attribute.GetHandlerType(); var initializerParams = attribute.InitializerParams(); - //Assert - Assert.Equal(typeof(DeferMessageOnErrorHandler<>), handlerType); // Returns the correct handler type - Assert.Equal(HandlerTiming.Before, attribute.Timing); // Must wrap subsequent handlers - Assert.Equal(1, attribute.Step); // Preserves the specified step - Assert.Single(initializerParams); // Has one initializer parameter - Assert.Equal(5000, initializerParams[0]); // Delay value flows through + await Assert.That(handlerType).IsEqualTo(typeof(DeferMessageOnErrorHandler<>)); // Returns the correct handler type + await Assert.That(attribute.Timing).IsEqualTo(HandlerTiming.Before); // Must wrap subsequent handlers + await Assert.That(attribute.Step).IsEqualTo(1); // Preserves the specified step + await Assert.That(initializerParams).HasSingleItem(); // Has one initializer parameter + await Assert.That(initializerParams[0]).IsEqualTo(5000); // Delay value flows through } - [Fact] - public void It_should_return_correct_async_handler_configuration() + [Test] + public async Task It_should_return_correct_async_handler_configuration() { //Arrange var attribute = new DeferMessageOnErrorAsyncAttribute(step: 2, delayMilliseconds: 3000); - //Act var handlerType = attribute.GetHandlerType(); var initializerParams = attribute.InitializerParams(); - //Assert - Assert.Equal(typeof(DeferMessageOnErrorHandlerAsync<>), handlerType); // Returns the correct async handler type - Assert.Equal(HandlerTiming.Before, attribute.Timing); // Must wrap subsequent handlers - Assert.Equal(2, attribute.Step); // Preserves the specified step - Assert.Single(initializerParams); // Has one initializer parameter - Assert.Equal(3000, initializerParams[0]); // Delay value flows through + await Assert.That(handlerType).IsEqualTo(typeof(DeferMessageOnErrorHandlerAsync<>)); // Returns the correct async handler type + await Assert.That(attribute.Timing).IsEqualTo(HandlerTiming.Before); // Must wrap subsequent handlers + await Assert.That(attribute.Step).IsEqualTo(2); // Preserves the specified step + await Assert.That(initializerParams).HasSingleItem(); // Has one initializer parameter + await Assert.That(initializerParams[0]).IsEqualTo(3000); // Delay value flows through } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Defer/When_handler_succeeds_should_not_defer_message.cs b/tests/Paramore.Brighter.Core.Tests/Defer/When_handler_succeeds_should_not_defer_message.cs index 492ac1a7f4..f7c2deccb7 100644 --- a/tests/Paramore.Brighter.Core.Tests/Defer/When_handler_succeeds_should_not_defer_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/Defer/When_handler_succeeds_should_not_defer_message.cs @@ -19,15 +19,12 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.Defer.TestDoubles; using Paramore.Brighter.Defer.Handlers; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Defer { @@ -35,13 +32,11 @@ public class When_handler_succeeds_should_not_defer_message { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _command = new(); - public When_handler_succeeds_should_not_defer_message() { //Arrange var registry = new SubscriberRegistry(); registry.Register(); - var handlerFactory = new SimpleHandlerFactorySync(type => { if (type == typeof(MySucceedingDeferHandler)) @@ -50,28 +45,21 @@ public When_handler_succeeds_should_not_defer_message() return new DeferMessageOnErrorHandler(); throw new ArgumentOutOfRangeException(nameof(type), type.Name, null); }); - MySucceedingDeferHandler.HandlerCalled = false; - - _commandProcessor = new CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory() - ); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void It_should_complete_without_throwing() + [Test] + public async Task It_should_complete_without_throwing() { //Act - var exception = Record.Exception(() => _commandProcessor.Send(_command)); + Exception? exception = null; + try { _commandProcessor.Send(_command); } + catch (Exception e) { exception = e; } //Assert - Assert.Null(exception); // No exception thrown - Assert.True(MySucceedingDeferHandler.HandlerCalled); // Handler was invoked + await Assert.That(exception).IsNull(); // No exception thrown + await Assert.That(MySucceedingDeferHandler.HandlerCalled).IsTrue(); // Handler was invoked } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Defer/When_handler_throws_exception_should_defer_message.cs b/tests/Paramore.Brighter.Core.Tests/Defer/When_handler_throws_exception_should_defer_message.cs index 9bc017b8f8..3aa99abb1d 100644 --- a/tests/Paramore.Brighter.Core.Tests/Defer/When_handler_throws_exception_should_defer_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/Defer/When_handler_throws_exception_should_defer_message.cs @@ -19,16 +19,13 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Paramore.Brighter.Actions; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.Defer.TestDoubles; using Paramore.Brighter.Defer.Handlers; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Defer { @@ -36,13 +33,11 @@ public class When_handler_throws_exception_should_defer_message { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _command = new(); - public When_handler_throws_exception_should_defer_message() { //Arrange var registry = new SubscriberRegistry(); registry.Register(); - var handlerFactory = new SimpleHandlerFactorySync(type => { if (type == typeof(MyFailingDeferHandler)) @@ -51,31 +46,21 @@ public When_handler_throws_exception_should_defer_message() return new DeferMessageOnErrorHandler(); throw new ArgumentOutOfRangeException(nameof(type), type.Name, null); }); - MyFailingDeferHandler.HandlerCalled = false; - - _commandProcessor = new CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory() - ); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void It_should_throw_DeferMessageAction_with_original_exception_and_delay() + [Test] + public async Task It_should_throw_DeferMessageAction_with_original_exception_and_delay() { //Act - var exception = Assert.Throws(() => _commandProcessor.Send(_command)); - + var exception = await Assert.That(() => _commandProcessor.Send(_command)).ThrowsExactly(); //Assert - Assert.True(MyFailingDeferHandler.HandlerCalled); // Handler was invoked - Assert.Equal(MyFailingDeferHandler.EXCEPTION_MESSAGE, exception.Message); // Preserves original message - Assert.IsType(exception.InnerException); // Preserves original exception type - Assert.Equal(MyFailingDeferHandler.EXCEPTION_MESSAGE, exception.InnerException.Message); // Inner has same message - Assert.Equal(TimeSpan.FromMilliseconds(5000), exception.Delay); // Delay from attribute flows through + await Assert.That(MyFailingDeferHandler.HandlerCalled).IsTrue(); // Handler was invoked + await Assert.That(exception.Message).IsEqualTo(MyFailingDeferHandler.EXCEPTION_MESSAGE); // Preserves original message + await Assert.That(exception.InnerException).IsTypeOf(); // Preserves original exception type + await Assert.That(exception.InnerException.Message).IsEqualTo(MyFailingDeferHandler.EXCEPTION_MESSAGE); // Inner has same message + await Assert.That(exception.Delay).IsEqualTo(TimeSpan.FromMilliseconds(5000)); // Delay from attribute flows through } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/DontAck/When_async_handler_throws_exception_should_dont_ack_message.cs b/tests/Paramore.Brighter.Core.Tests/DontAck/When_async_handler_throws_exception_should_dont_ack_message.cs index 83e0d533e9..d0392a0287 100644 --- a/tests/Paramore.Brighter.Core.Tests/DontAck/When_async_handler_throws_exception_should_dont_ack_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/DontAck/When_async_handler_throws_exception_should_dont_ack_message.cs @@ -19,9 +19,7 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Threading.Tasks; using Paramore.Brighter.Actions; @@ -29,21 +27,18 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.DontAck.TestDoubles; using Paramore.Brighter.DontAck.Handlers; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.DontAck { - public class When_async_handler_throws_exception_should_dont_ack_message : IDisposable + public class When_async_handler_throws_exception_should_dont_ack_message { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _command = new(); - public When_async_handler_throws_exception_should_dont_ack_message() { //Arrange var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var handlerFactory = new SimpleHandlerFactoryAsync(type => { if (type == typeof(MyFailingDontAckHandlerAsync)) @@ -52,35 +47,26 @@ public When_async_handler_throws_exception_should_dont_ack_message() return new DontAckOnErrorHandlerAsync(); throw new ArgumentOutOfRangeException(nameof(type), type.Name, null); }); - MyFailingDontAckHandlerAsync.HandlerCalled = false; - - _commandProcessor = new CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory() - ); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task It_should_throw_DontAckAction_with_original_exception() { //Act - var exception = await Assert.ThrowsAsync(() => _commandProcessor.SendAsync(_command)); - + var exception = await Assert.That(() => _commandProcessor.SendAsync(_command)).ThrowsExactly(); //Assert - Assert.True(MyFailingDontAckHandlerAsync.HandlerCalled); // Handler was invoked - Assert.Equal(MyFailingDontAckHandlerAsync.EXCEPTION_MESSAGE, exception.Message); // Preserves original message - Assert.IsType(exception.InnerException); // Preserves original exception type - Assert.Equal(MyFailingDontAckHandlerAsync.EXCEPTION_MESSAGE, exception.InnerException.Message); // Inner has same message + await Assert.That(MyFailingDontAckHandlerAsync.HandlerCalled).IsTrue(); // Handler was invoked + await Assert.That(exception.Message).IsEqualTo(MyFailingDontAckHandlerAsync.EXCEPTION_MESSAGE); // Preserves original message + await Assert.That(exception.InnerException).IsTypeOf(); // Preserves original exception type + await Assert.That(exception.InnerException.Message).IsEqualTo(MyFailingDontAckHandlerAsync.EXCEPTION_MESSAGE); // Inner has same message } + [After(Test)] public void Dispose() { CommandProcessor.ClearServiceBus(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/DontAck/When_handler_throws_exception_should_dont_ack_message.cs b/tests/Paramore.Brighter.Core.Tests/DontAck/When_handler_throws_exception_should_dont_ack_message.cs index 1264ed575f..980b8fd8e9 100644 --- a/tests/Paramore.Brighter.Core.Tests/DontAck/When_handler_throws_exception_should_dont_ack_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/DontAck/When_handler_throws_exception_should_dont_ack_message.cs @@ -19,30 +19,25 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Paramore.Brighter.Actions; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.DontAck.TestDoubles; using Paramore.Brighter.DontAck.Handlers; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.DontAck { - public class When_handler_throws_exception_should_dont_ack_message : IDisposable + public class When_handler_throws_exception_should_dont_ack_message { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _command = new(); - public When_handler_throws_exception_should_dont_ack_message() { //Arrange var registry = new SubscriberRegistry(); registry.Register(); - var handlerFactory = new SimpleHandlerFactorySync(type => { if (type == typeof(MyFailingDontAckHandler)) @@ -51,35 +46,26 @@ public When_handler_throws_exception_should_dont_ack_message() return new DontAckOnErrorHandler(); throw new ArgumentOutOfRangeException(nameof(type), type.Name, null); }); - MyFailingDontAckHandler.HandlerCalled = false; - - _commandProcessor = new CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory() - ); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void It_should_throw_DontAckAction_with_original_exception() + [Test] + public async Task It_should_throw_DontAckAction_with_original_exception() { //Act - var exception = Assert.Throws(() => _commandProcessor.Send(_command)); - + var exception = await Assert.That(() => _commandProcessor.Send(_command)).ThrowsExactly(); //Assert - Assert.True(MyFailingDontAckHandler.HandlerCalled); // Handler was invoked - Assert.Equal(MyFailingDontAckHandler.EXCEPTION_MESSAGE, exception.Message); // Preserves original message - Assert.IsType(exception.InnerException); // Preserves original exception type - Assert.Equal(MyFailingDontAckHandler.EXCEPTION_MESSAGE, exception.InnerException.Message); // Inner has same message + await Assert.That(MyFailingDontAckHandler.HandlerCalled).IsTrue(); // Handler was invoked + await Assert.That(exception.Message).IsEqualTo(MyFailingDontAckHandler.EXCEPTION_MESSAGE); // Preserves original message + await Assert.That(exception.InnerException).IsTypeOf(); // Preserves original exception type + await Assert.That(exception.InnerException.Message).IsEqualTo(MyFailingDontAckHandler.EXCEPTION_MESSAGE); // Inner has same message } + [After(Test)] public void Dispose() { CommandProcessor.ClearServiceBus(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/TestDoubles/MyFailsWithDivideByZeroHandler.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/TestDoubles/MyFailsWithDivideByZeroHandler.cs index 6f6d9865e9..c341f1b820 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/TestDoubles/MyFailsWithDivideByZeroHandler.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/TestDoubles/MyFailsWithDivideByZeroHandler.cs @@ -30,12 +30,7 @@ namespace Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles { internal sealed class MyFailsWithDivideByZeroHandler : RequestHandler { - public static bool ReceivedCommand { get; set; } - - static MyFailsWithDivideByZeroHandler() - { - ReceivedCommand = false; - } + public bool ReceivedCommand { get; private set; } [UsePolicy("MyDivideByZeroPolicy", 1)] public override MyCommand Handle(MyCommand myCommand) @@ -44,9 +39,6 @@ public override MyCommand Handle(MyCommand myCommand) throw new DivideByZeroException(); } - public static bool ShouldReceive(MyCommand myCommand) - { - return ReceivedCommand; - } + public bool ShouldReceive(MyCommand myCommand) => ReceivedCommand; } } diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/TestDoubles/MyFailsWithDivideByZeroHandlerAsync.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/TestDoubles/MyFailsWithDivideByZeroHandlerAsync.cs index dd046bbe2b..cc73cc2283 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/TestDoubles/MyFailsWithDivideByZeroHandlerAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/TestDoubles/MyFailsWithDivideByZeroHandlerAsync.cs @@ -32,12 +32,7 @@ namespace Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles { internal sealed class MyFailsWithDivideByZeroHandlerAsync : RequestHandlerAsync { - public static bool ReceivedCommand { get; set; } - - static MyFailsWithDivideByZeroHandlerAsync() - { - ReceivedCommand = false; - } + public bool ReceivedCommand { get; private set; } [UsePolicyAsync("MyDivideByZeroPolicy", 1)] public override async Task HandleAsync(MyCommand command, CancellationToken cancellationToken = default) @@ -52,9 +47,6 @@ public override async Task HandleAsync(MyCommand command, Cancellatio throw new DivideByZeroException(); } - public static bool ShouldReceive(MyCommand myCommand) - { - return ReceivedCommand; - } + public bool ShouldReceive(MyCommand myCommand) => ReceivedCommand; } } diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_A_Fallback_Is_Broken_Ciruit_Only.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_A_Fallback_Is_Broken_Ciruit_Only.cs index 9319a8ce4d..a22860287f 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_A_Fallback_Is_Broken_Ciruit_Only.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_A_Fallback_Is_Broken_Ciruit_Only.cs @@ -1,7 +1,6 @@ -using System; +using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly.Registry; using Microsoft.Extensions.DependencyInjection; @@ -15,36 +14,28 @@ public class FallbackHandlerBrokenCircuitTests private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private Exception _exception; - public FallbackHandlerBrokenCircuitTests() { var registry = new SubscriberRegistry(); registry.Register(); var policyRegistry = new PolicyRegistry(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddSingleton>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - MyFailsWithFallbackDivideByZeroHandler.ReceivedCommand = false; - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void When_A_Fallback_Is_Broken_Circuit_Only() + [Test] + public async Task When_A_Fallback_Is_Broken_Circuit_Only() { _exception = Catch.Exception(() => _commandProcessor.Send(_myCommand)); - //Should send the command to the command handler MyFailsWithUnsupportedExceptionForFallback.ShouldReceive(_myCommand); // Should bubble out the exception - Assert.NotNull(_exception); + await Assert.That(_exception).IsNotNull(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Raising_A_Broken_Circuit_Exception_Can_Fallback.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Raising_A_Broken_Circuit_Exception_Can_Fallback.cs index 7d8a3deaf2..5b0ed2f9e3 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Raising_A_Broken_Circuit_Exception_Can_Fallback.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Raising_A_Broken_Circuit_Exception_Can_Fallback.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,20 +12,17 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly.Registry; using Microsoft.Extensions.DependencyInjection; @@ -37,31 +34,24 @@ public class FallbackHandlerBrokenCircuitOnErrorTests { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); - public FallbackHandlerBrokenCircuitOnErrorTests() { var registry = new SubscriberRegistry(); registry.Register(); var policyRegistry = new PolicyRegistry(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddSingleton>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - MyFailsWithFallbackDivideByZeroHandler.ReceivedCommand = false; - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void When_Raising_A_Broken_Circuit_Exception_Can_Fallback() + [Test] + public async Task When_Raising_A_Broken_Circuit_Exception_Can_Fallback() { _commandProcessor.Send(_myCommand); - //_should_send_the_command_to_the_command_handler MyFailsWithFallbackBrokenCircuitHandler.ShouldReceive(_myCommand); //_should_call_the_fallback_chain @@ -70,4 +60,4 @@ public void When_Raising_A_Broken_Circuit_Exception_Can_Fallback() MyFailsWithFallbackBrokenCircuitHandler.ShouldSetException(_myCommand); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Raising_An_Exception_Can_Fallback.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Raising_An_Exception_Can_Fallback.cs index 0cc140eb7a..1130066f95 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Raising_An_Exception_Can_Fallback.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Raising_An_Exception_Can_Fallback.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,20 +12,17 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly.Registry; using Microsoft.Extensions.DependencyInjection; @@ -37,30 +34,24 @@ public class FallbackHandlerOnExceptionTests { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); - public FallbackHandlerOnExceptionTests() { var registry = new SubscriberRegistry(); registry.Register(); var policyRegistry = new PolicyRegistry(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddSingleton>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - MyFailsWithFallbackDivideByZeroHandler.ReceivedCommand = false; - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void When_Raising_An_Exception_Can_Fallback() + [Test] + public async Task When_Raising_An_Exception_Can_Fallback() { _commandProcessor.Send(_myCommand); - //_should_send_the_command_to_the_command_handler MyFailsWithFallbackDivideByZeroHandler.ShouldReceive(_myCommand); //_should_call_the_fallback_chain @@ -69,4 +60,4 @@ public void When_Raising_An_Exception_Can_Fallback() MyFailsWithFallbackDivideByZeroHandler.ShouldSetException(_myCommand); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Raising_An_Exception_Run_Fallback_Chain.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Raising_An_Exception_Run_Fallback_Chain.cs index 2fae1bf89b..a9f4e795ac 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Raising_An_Exception_Run_Fallback_Chain.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Raising_An_Exception_Run_Fallback_Chain.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,20 +12,17 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly.Registry; using Microsoft.Extensions.DependencyInjection; @@ -38,32 +35,25 @@ public class FallbackHandlerPipelineRunOnExceptionTests { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); - public FallbackHandlerPipelineRunOnExceptionTests() { var registry = new SubscriberRegistry(); registry.Register(); var policyRegistry = new PolicyRegistry(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddSingleton>(); container.AddSingleton>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - MyFailsWithFallbackMultipleHandlers.ReceivedCommand = false; - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void When_Raising_An_Exception_Run_Fallback_Chain() + [Test] + public async Task When_Raising_An_Exception_Run_Fallback_Chain() { _commandProcessor.Send(_myCommand); - //_should_send_the_command_to_the_command_handler MyFailsWithFallbackMultipleHandlers.ShouldReceive(_myCommand); //_should_call_the_fallback_chain @@ -72,4 +62,4 @@ public void When_Raising_An_Exception_Run_Fallback_Chain() MyFailsWithFallbackMultipleHandlers.ShouldSetException(_myCommand); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_Policy_Is_Not_In_The_Registry.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_Policy_Is_Not_In_The_Registry.cs index d82d9a248f..7b7d209e98 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_Policy_Is_Not_In_The_Registry.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_Policy_Is_Not_In_The_Registry.cs @@ -1,8 +1,7 @@ -using System; +using System; using System.Collections.Generic; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly.Registry; using Microsoft.Extensions.DependencyInjection; @@ -16,38 +15,31 @@ public class CommandProcessorMissingPolicyFromRegistryTests private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private Exception _exception; - public CommandProcessorMissingPolicyFromRegistryTests() { var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - MyDoesNotFailPolicyHandler.ReceivedCommand = false; - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } //We have to catch the final exception that bubbles out after retry - [Fact] - public void When_Sending_A_Command_And_The_Policy_Is_Not_In_The_Registry() + [Test] + public async Task When_Sending_A_Command_And_The_Policy_Is_Not_In_The_Registry() { _exception = Catch.Exception(() => _commandProcessor.Send(_myCommand)); - //Should throw an exception - Assert.IsType(_exception); + await Assert.That(_exception).IsTypeOf(); var innerException = _exception.InnerException; - Assert.NotNull(innerException); - Assert.IsType(innerException); + await Assert.That(innerException).IsNotNull(); + await Assert.That(innerException).IsTypeOf(); //Should give the name of the missing policy - Assert.Contains("The given key 'MyDivideByZeroPolicy' was not present in the dictionary.", innerException.Message); + await Assert.That(innerException.Message).Contains("The given key 'MyDivideByZeroPolicy' was not present in the dictionary."); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_Policy_Is_Not_In_The_Registry_Async.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_Policy_Is_Not_In_The_Registry_Async.cs index ceb87bc8b2..391be355c0 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_Policy_Is_Not_In_The_Registry_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_Policy_Is_Not_In_The_Registry_Async.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly.Registry; using Microsoft.Extensions.DependencyInjection; @@ -17,35 +16,29 @@ public class CommandProcessorMissingPolicyFromRegistryAsyncTests private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private Exception? _exception; - public CommandProcessorMissingPolicyFromRegistryAsyncTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - MyDoesNotFailPolicyHandlerAsync.ReceivedCommand = false; - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } //We have to catch the final exception that bubbles out after retry - [Fact] + [Test] public async Task When_Sending_A_Command_And_The_Policy_Is_Not_In_The_Registry_Async() { _exception = await Catch.ExceptionAsync(() => _commandProcessor.SendAsync(_myCommand)); - //Should throw an exception - Assert.IsType(_exception); + await Assert.That(_exception).IsTypeOf(); var innerException = _exception.InnerException; - Assert.NotNull(innerException); - Assert.IsType(innerException); + await Assert.That(innerException).IsNotNull(); + await Assert.That(innerException).IsTypeOf(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_ResiliencePipeline_Is_Not_In_The_Registry.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_ResiliencePipeline_Is_Not_In_The_Registry.cs index c36044c016..ceb1c741be 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_ResiliencePipeline_Is_Not_In_The_Registry.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_ResiliencePipeline_Is_Not_In_The_Registry.cs @@ -1,8 +1,7 @@ -using System; +using System; using System.Collections.Generic; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly.Registry; using Microsoft.Extensions.DependencyInjection; @@ -10,41 +9,33 @@ using Paramore.Brighter.Extensions.DependencyInjection; namespace Paramore.Brighter.Core.Tests.ExceptionPolicy; - public class CommandProcessorMissingResiliencePipelineFromRegistryTests { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private Exception? _exception; - public CommandProcessorMissingResiliencePipelineFromRegistryTests() { var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - MyDoesNotFailResiliencePipelineHandler.ReceivedCommand = false; - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } //We have to catch the final exception that bubbles out after retry - [Fact] - public void When_Sending_A_Command_And_The_Policy_Is_Not_In_The_Registry() + [Test] + public async Task When_Sending_A_Command_And_The_Policy_Is_Not_In_The_Registry() { _exception = Catch.Exception(() => _commandProcessor.Send(_myCommand)); - //Should throw an exception - Assert.IsType(_exception); + await Assert.That(_exception).IsTypeOf(); var innerException = _exception.InnerException; - Assert.NotNull(innerException); - Assert.IsType(innerException); + await Assert.That(innerException).IsNotNull(); + await Assert.That(innerException).IsTypeOf(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_ResiliencePipeline_Is_Not_In_The_Registry_Async.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_ResiliencePipeline_Is_Not_In_The_Registry_Async.cs index 64faf1fabb..65311ae853 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_ResiliencePipeline_Is_Not_In_The_Registry_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_ResiliencePipeline_Is_Not_In_The_Registry_Async.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly.Registry; using Microsoft.Extensions.DependencyInjection; @@ -11,40 +10,33 @@ using Paramore.Brighter.Extensions.DependencyInjection; namespace Paramore.Brighter.Core.Tests.ExceptionPolicy; - public class CommandProcessorMissingResiliencePipelineFromRegistryAsyncTests { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private Exception? _exception; - public CommandProcessorMissingResiliencePipelineFromRegistryAsyncTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - MyDoesNotFailResiliencePipelineHandlerAsync.ReceivedCommand = false; - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } //We have to catch the final exception that bubbles out after retry - [Fact] + [Test] public async Task When_Sending_A_Command_And_The_Policy_Is_Not_In_The_Registry_Async() { _exception = await Catch.ExceptionAsync(() => _commandProcessor.SendAsync(_myCommand)); - //Should throw an exception - Assert.IsType(_exception); + await Assert.That(_exception).IsTypeOf(); var innerException = _exception.InnerException; - Assert.NotNull(innerException); - Assert.IsType(innerException); + await Assert.That(innerException).IsNotNull(); + await Assert.That(innerException).IsTypeOf(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_TypeResiliencePipeline_Is_Not_In_The_Registry.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_TypeResiliencePipeline_Is_Not_In_The_Registry.cs index 8ea15766e4..523c81a024 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_TypeResiliencePipeline_Is_Not_In_The_Registry.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_TypeResiliencePipeline_Is_Not_In_The_Registry.cs @@ -1,8 +1,7 @@ -using System; +using System; using System.Collections.Generic; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly.Registry; using Microsoft.Extensions.DependencyInjection; @@ -10,43 +9,35 @@ using Paramore.Brighter.Extensions.DependencyInjection; namespace Paramore.Brighter.Core.Tests.ExceptionPolicy; - public class CommandProcessorMissingTypeResiliencePipelineFromRegistryTests { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private Exception? _exception; - public CommandProcessorMissingTypeResiliencePipelineFromRegistryTests() { var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - MyDoesNotFailTypeResiliencePipelineHandler.ReceivedCommand = false; - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } //We have to catch the final exception that bubbles out after retry - [Fact] - public void When_Sending_A_Command_And_The_Policy_Is_Not_In_The_Registry() + [Test] + public async Task When_Sending_A_Command_And_The_Policy_Is_Not_In_The_Registry() { _exception = Catch.Exception(() => _commandProcessor.Send(_myCommand)); - //Should throw an exception - Assert.IsType(_exception); + await Assert.That(_exception).IsTypeOf(); var innerException = _exception.InnerException; - Assert.NotNull(innerException); - Assert.IsType(innerException); + await Assert.That(innerException).IsNotNull(); + await Assert.That(innerException).IsTypeOf(); //Should give the name of the missing policy - Assert.Contains("Unable to find a generic resilience pipeline of 'MyCommand' associated with the key 'MyDivideByZeroPolicy'. Please ensure that either the generic resilience pipeline or the generic builder is registered.", innerException.Message); + await Assert.That(innerException.Message).Contains("Unable to find a generic resilience pipeline of 'MyCommand' associated with the key 'MyDivideByZeroPolicy'. Please ensure that either the generic resilience pipeline or the generic builder is registered."); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_TypeResiliencePipeline_Is_Not_In_The_Registry_Async.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_TypeResiliencePipeline_Is_Not_In_The_Registry_Async.cs index 50049fbcfd..8656f5b54b 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_TypeResiliencePipeline_Is_Not_In_The_Registry_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_And_The_TypeResiliencePipeline_Is_Not_In_The_Registry_Async.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly.Registry; using Microsoft.Extensions.DependencyInjection; @@ -11,40 +10,33 @@ using Paramore.Brighter.Extensions.DependencyInjection; namespace Paramore.Brighter.Core.Tests.ExceptionPolicy; - public class CommandProcessorMissingTypeResiliencePipelineFromRegistryAsyncTests { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private Exception? _exception; - public CommandProcessorMissingTypeResiliencePipelineFromRegistryAsyncTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - MyDoesNotFailTypeResiliencePipelineHandlerAsync.ReceivedCommand = false; - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } //We have to catch the final exception that bubbles out after retry - [Fact] + [Test] public async Task When_Sending_A_Command_And_The_Policy_Is_Not_In_The_Registry_Async() { _exception = await Catch.ExceptionAsync(() => _commandProcessor.SendAsync(_myCommand)); - //Should throw an exception - Assert.IsType(_exception); + await Assert.That(_exception).IsTypeOf(); var innerException = _exception.InnerException; - Assert.NotNull(innerException); - Assert.IsType(innerException); + await Assert.That(innerException).IsNotNull(); + await Assert.That(innerException).IsTypeOf(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Passes_Multiple_Policy_Checks.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Passes_Multiple_Policy_Checks.cs index d0c19cb0ff..b4276b3f4e 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Passes_Multiple_Policy_Checks.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Passes_Multiple_Policy_Checks.cs @@ -1,4 +1,4 @@ -using System; +using System; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; @@ -6,7 +6,6 @@ using Paramore.Brighter.Policies.Handlers; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests { @@ -15,54 +14,35 @@ public class CommandProcessorWithMultipleExceptionPoliciesNothingThrowTests private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private int _retryCount; - public CommandProcessorWithMultipleExceptionPoliciesNothingThrowTests() { var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions() - { - HandlerLifetime = ServiceLifetime.Transient - }); - - + container.AddSingleton(new BrighterOptions() { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - var policyRegistry = new PolicyRegistry(); - - var retryPolicy = Policy - .Handle() - .WaitAndRetry([TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(3)], (exception, timeSpan) => - { - _retryCount++; - }); - - var breakerPolicy = Policy.Handle() - .CircuitBreaker(1, TimeSpan.FromMilliseconds(500)); - + var retryPolicy = Policy.Handle().WaitAndRetry([TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(3)], (exception, timeSpan) => + { + _retryCount++; + }); + var breakerPolicy = Policy.Handle().CircuitBreaker(1, TimeSpan.FromMilliseconds(500)); policyRegistry.Add("MyDivideByZeroRetryPolicy", retryPolicy); policyRegistry.Add("MyDivideByZeroBreakerPolicy", breakerPolicy); - MyDoesNotFailMultiplePoliciesHandler.ReceivedCommand = false; - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void When_Sending_A_Command_That_Passes_Multiple_Policy_Checks() + [Test] + public async Task When_Sending_A_Command_That_Passes_Multiple_Policy_Checks() { _commandProcessor.Send(_myCommand); - // Should send the command to the command handler - Assert.True(MyDoesNotFailMultiplePoliciesHandler.ShouldReceive(_myCommand)); + await Assert.That(MyDoesNotFailMultiplePoliciesHandler.ShouldReceive(_myCommand)).IsTrue(); // Should not retry - Assert.Equal(0, _retryCount); + await Assert.That(_retryCount).IsEqualTo(0); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Passes_Policy_Check.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Passes_Policy_Check.cs index 090f1259e2..801e17f587 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Passes_Policy_Check.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Passes_Policy_Check.cs @@ -1,7 +1,6 @@ -using System; +using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly; using Polly.Registry; @@ -15,49 +14,34 @@ public class CommandProcessorWithExceptionPolicyNothingThrowTests private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private int _retryCount; - public CommandProcessorWithExceptionPolicyNothingThrowTests() { var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - var policyRegistry = new PolicyRegistry(); - - var policy = Policy - .Handle() - .WaitAndRetry([ - TimeSpan.FromSeconds(1), - TimeSpan.FromSeconds(2), - TimeSpan.FromSeconds(3) - ], (exception, timeSpan) => - { - _retryCount++; - }); + var policy = Policy.Handle().WaitAndRetry([TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(3)], (exception, timeSpan) => + { + _retryCount++; + }); policyRegistry.Add("MyDivideByZeroPolicy", policy); - MyDoesNotFailPolicyHandler.ReceivedCommand = false; - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } //We have to catch the final exception that bubbles out after retry - [Fact] - public void When_Sending_A_Command_That_Passes_Policy_Check() + [Test] + public async Task When_Sending_A_Command_That_Passes_Policy_Check() { _commandProcessor.Send(_myCommand); - // Should send the command to the command handler - Assert.True(MyDoesNotFailPolicyHandler.Shouldreceive(_myCommand)); + await Assert.That(MyDoesNotFailPolicyHandler.Shouldreceive(_myCommand)).IsTrue(); // Should not retry - Assert.Equal(0, _retryCount); + await Assert.That(_retryCount).IsEqualTo(0); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Passes_ResiliencePipeline_Check.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Passes_ResiliencePipeline_Check.cs index bb8650f749..c73f1bf531 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Passes_ResiliencePipeline_Check.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Passes_ResiliencePipeline_Check.cs @@ -1,8 +1,7 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly; using Polly.Registry; @@ -11,52 +10,38 @@ using Polly.Retry; namespace Paramore.Brighter.Core.Tests.ExceptionPolicy; - public class CommandProcessorWithExceptionResiliencePipelineNothingThrowTests { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private int _retryCount; - public CommandProcessorWithExceptionResiliencePipelineNothingThrowTests() { var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - var resiliencePipelineRegistry = new ResiliencePipelineRegistry(); - resiliencePipelineRegistry.TryAddBuilder("MyDivideByZeroPolicy", - (builder, _) => builder.AddRetry(new RetryStrategyOptions - { - BackoffType = DelayBackoffType.Linear, - Delay = TimeSpan.FromSeconds(1), - OnRetry = _ => - { - _retryCount++; - return new ValueTask(); - } - })); - + resiliencePipelineRegistry.TryAddBuilder("MyDivideByZeroPolicy", (builder, _) => builder.AddRetry(new RetryStrategyOptions { BackoffType = DelayBackoffType.Linear, Delay = TimeSpan.FromSeconds(1), OnRetry = _ => + { + _retryCount++; + return new ValueTask(); + } })); MyDoesNotFailResiliencePipelineHandler.ReceivedCommand = false; - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), resiliencePipelineRegistry, new InMemorySchedulerFactory()); } //We have to catch the final exception that bubbles out after retry - [Fact] - public void When_Sending_A_Command_That_Passes_Policy_Check() + [Test] + public async Task When_Sending_A_Command_That_Passes_Policy_Check() { _commandProcessor.Send(_myCommand); - // Should send the command to the command handler - Assert.True(MyDoesNotFailResiliencePipelineHandler.Shouldreceive(_myCommand)); + await Assert.That(MyDoesNotFailResiliencePipelineHandler.Shouldreceive(_myCommand)).IsTrue(); // Should not retry - Assert.Equal(0, _retryCount); + await Assert.That(_retryCount).IsEqualTo(0); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Passes_TypeResiliencePipeline_Check.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Passes_TypeResiliencePipeline_Check.cs index 30675bff30..bb3931a260 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Passes_TypeResiliencePipeline_Check.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Passes_TypeResiliencePipeline_Check.cs @@ -1,8 +1,7 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly; using Polly.Registry; @@ -11,52 +10,38 @@ using Polly.Retry; namespace Paramore.Brighter.Core.Tests.ExceptionPolicy; - public class CommandProcessorWithExceptionTypeResiliencePipelineNothingThrowTests { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private int _retryCount; - public CommandProcessorWithExceptionTypeResiliencePipelineNothingThrowTests() { var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - var resiliencePipelineRegistry = new ResiliencePipelineRegistry(); - resiliencePipelineRegistry.TryAddBuilder("MyDivideByZeroPolicy", - (builder, _) => builder.AddRetry(new RetryStrategyOptions - { - BackoffType = DelayBackoffType.Linear, - Delay = TimeSpan.FromSeconds(1), - OnRetry = _ => - { - _retryCount++; - return new ValueTask(); - } - })); - + resiliencePipelineRegistry.TryAddBuilder("MyDivideByZeroPolicy", (builder, _) => builder.AddRetry(new RetryStrategyOptions { BackoffType = DelayBackoffType.Linear, Delay = TimeSpan.FromSeconds(1), OnRetry = _ => + { + _retryCount++; + return new ValueTask(); + } })); MyDoesNotFailTypeResiliencePipelineHandler.ReceivedCommand = false; - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), resiliencePipelineRegistry, new InMemorySchedulerFactory()); } //We have to catch the final exception that bubbles out after retry - [Fact] - public void When_Sending_A_Command_That_Passes_Policy_Check() + [Test] + public async Task When_Sending_A_Command_That_Passes_Policy_Check() { _commandProcessor.Send(_myCommand); - // Should send the command to the command handler - Assert.True(MyDoesNotFailTypeResiliencePipelineHandler.Shouldreceive(_myCommand)); + await Assert.That(MyDoesNotFailTypeResiliencePipelineHandler.Shouldreceive(_myCommand)).IsTrue(); // Should not retry - Assert.Equal(0, _retryCount); + await Assert.That(_retryCount).IsEqualTo(0); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Repeatedely_Fails_Break_The_Circuit.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Repeatedely_Fails_Break_The_Circuit.cs index 3d572c65ee..3cb632e43b 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Repeatedely_Fails_Break_The_Circuit.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Repeatedely_Fails_Break_The_Circuit.cs @@ -1,7 +1,6 @@ -using System; +using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly; using Polly.CircuitBreaker; @@ -19,53 +18,46 @@ public class CommandProcessorWithCircuitBreakerTests private Exception _thirdException; private Exception _firstException; private Exception _secondException; - + private readonly ServiceProvider _provider; public CommandProcessorWithCircuitBreakerTests() { var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddSingleton>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - - var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); + _provider = container.BuildServiceProvider(); + var handlerFactory = new ServiceProviderHandlerFactory(_provider); var policyRegistry = new PolicyRegistry(); - - var policy = Policy - .Handle() - .CircuitBreaker(2, TimeSpan.FromMinutes(1)); - + var policy = Policy.Handle().CircuitBreaker(2, TimeSpan.FromMinutes(1)); policyRegistry.Add("MyDivideByZeroPolicy", policy); - - MyFailsWithDivideByZeroHandler.ReceivedCommand = false; - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - policyRegistry, new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } //We have to catch the final exception that bubbles out after retry - [Fact] - public void When_Sending_A_Command_That_Repeatedly_Fails_Break_The_Circuit() + [Test] + public async Task When_Sending_A_Command_That_Repeatedly_Fails_Break_The_Circuit() { //First two should be caught, and increment the count _firstException = Catch.Exception(() => _commandProcessor.Send(_myCommand)); _secondException = Catch.Exception(() => _commandProcessor.Send(_myCommand)); //this one should tell us that the circuit is broken _thirdException = Catch.Exception(() => _commandProcessor.Send(_myCommand)); - - // Should send the command to the command handler - Assert.True(MyFailsWithDivideByZeroHandler.ShouldReceive(_myCommand)); + await Assert.That(_provider.GetRequiredService().ShouldReceive(_myCommand)).IsTrue(); // Should bubble up the first exception - Assert.IsType(_firstException); + await Assert.That(_firstException).IsTypeOf(); // Should bubble up the second exception - Assert.IsType(_secondException); + await Assert.That(_secondException).IsTypeOf(); // Should break the circuit after two fails - Assert.IsType(_thirdException); + await Assert.That(_thirdException).IsTypeOf(); + } + + [After(Test)] + public void Dispose() + { + _provider.Dispose(); } } } diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Repeatedely_Fails_Break_The_Circuit_Async.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Repeatedely_Fails_Break_The_Circuit_Async.cs index 9324f7c871..ab1bcc1b25 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Repeatedely_Fails_Break_The_Circuit_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Repeatedely_Fails_Break_The_Circuit_Async.cs @@ -1,8 +1,7 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly; using Polly.CircuitBreaker; @@ -20,36 +19,25 @@ public class CommandProcessorWithCircuitBreakerAsyncTests private Exception? _thirdException; private Exception? _firstException; private Exception? _secondException; - + private readonly ServiceProvider _provider; public CommandProcessorWithCircuitBreakerAsyncTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddSingleton>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - - var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); + _provider = container.BuildServiceProvider(); + var handlerFactory = new ServiceProviderHandlerFactory(_provider); var policyRegistry = new PolicyRegistry(); - - var policy = Policy - .Handle() - .CircuitBreakerAsync(2, TimeSpan.FromMinutes(1)); - + var policy = Policy.Handle().CircuitBreakerAsync(2, TimeSpan.FromMinutes(1)); policyRegistry.Add("MyDivideByZeroPolicy", policy); - - MyFailsWithDivideByZeroHandlerAsync.ReceivedCommand = false; - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } //We have to catch the final exception that bubbles out after retry - [Fact] + [Test] public async Task When_Sending_A_Command_That_Repeatedly_Fails_Break_The_Circuit_Async() { //First two should be caught, and increment the count @@ -57,16 +45,20 @@ public async Task When_Sending_A_Command_That_Repeatedly_Fails_Break_The_Circuit _secondException = await Catch.ExceptionAsync(() => _commandProcessor.SendAsync(_myCommand)); //this one should tell us that the circuit is broken _thirdException = await Catch.ExceptionAsync(() => _commandProcessor.SendAsync(_myCommand)); - - // Should send the command to the command handler - Assert.True(MyFailsWithDivideByZeroHandlerAsync.ShouldReceive(_myCommand)); + await Assert.That(_provider.GetRequiredService().ShouldReceive(_myCommand)).IsTrue(); // Should bubble up the first exception - Assert.IsType(_firstException); + await Assert.That(_firstException).IsTypeOf(); // Should bubble up the second exception - Assert.IsType(_secondException); + await Assert.That(_secondException).IsTypeOf(); // Should break the circuit after two fails - Assert.IsType(_thirdException); + await Assert.That(_thirdException).IsTypeOf(); + } + + [After(Test)] + public void Dispose() + { + _provider.Dispose(); } } } diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Repeatedely_Fails_Break_The_Circuit_With_ResiliencePipeline.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Repeatedely_Fails_Break_The_Circuit_With_ResiliencePipeline.cs index a229d04c1a..77ea12c2f6 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Repeatedely_Fails_Break_The_Circuit_With_ResiliencePipeline.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Repeatedely_Fails_Break_The_Circuit_With_ResiliencePipeline.cs @@ -1,7 +1,6 @@ -using System; +using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly; using Polly.CircuitBreaker; @@ -11,7 +10,6 @@ using Paramore.Brighter.Extensions.DependencyInjection; namespace Paramore.Brighter.Core.Tests.ExceptionPolicy; - public class CommandProcessorWithCircuitBreakerAndResiliencePipelineTests { private readonly CommandProcessor _commandProcessor; @@ -19,53 +17,37 @@ public class CommandProcessorWithCircuitBreakerAndResiliencePipelineTests private Exception _thirdException; private Exception _firstException; private Exception _secondException; - public CommandProcessorWithCircuitBreakerAndResiliencePipelineTests() { var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddSingleton>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - var resiliencePipeline = new ResiliencePipelineRegistry(); - resiliencePipeline.TryAddBuilder("MyDivideByZeroPolicy", - (builder, _) => builder - .AddCircuitBreaker(new CircuitBreakerStrategyOptions - { - MinimumThroughput = 2, - BreakDuration = TimeSpan.FromMinutes(1) - })); - - + resiliencePipeline.TryAddBuilder("MyDivideByZeroPolicy", (builder, _) => builder.AddCircuitBreaker(new CircuitBreakerStrategyOptions { MinimumThroughput = 2, BreakDuration = TimeSpan.FromMinutes(1) })); MyFailsWithDivideByZeroWithResiliencePipelineHandler.ReceivedCommand = false; - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), resiliencePipeline, new InMemorySchedulerFactory()); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), resiliencePipeline, new InMemorySchedulerFactory()); } //We have to catch the final exception that bubbles out after retry - [Fact] - public void When_Sending_A_Command_That_Repeatedly_Fails_Break_The_Circuit() + [Test] + public async Task When_Sending_A_Command_That_Repeatedly_Fails_Break_The_Circuit() { //First two should be caught, and increment the count _firstException = Catch.Exception(() => _commandProcessor.Send(_myCommand)); _secondException = Catch.Exception(() => _commandProcessor.Send(_myCommand)); //this one should tell us that the circuit is broken _thirdException = Catch.Exception(() => _commandProcessor.Send(_myCommand)); - - // Should send the command to the command handler - Assert.True(MyFailsWithDivideByZeroWithResiliencePipelineHandler.ShouldReceive(_myCommand)); + await Assert.That(MyFailsWithDivideByZeroWithResiliencePipelineHandler.ShouldReceive(_myCommand)).IsTrue(); // Should bubble up the first exception - Assert.IsType(_firstException); + await Assert.That(_firstException).IsTypeOf(); // Should bubble up the second exception - Assert.IsType(_secondException); + await Assert.That(_secondException).IsTypeOf(); // Should break the circuit after two fails - Assert.IsType(_thirdException); + await Assert.That(_thirdException).IsTypeOf(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Retries_Then_Repeatedly_Fails_Breaks_The_Circuit.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Retries_Then_Repeatedly_Fails_Breaks_The_Circuit.cs index 7ba336c61c..99e2bbe67a 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Retries_Then_Repeatedly_Fails_Breaks_The_Circuit.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Retries_Then_Repeatedly_Fails_Breaks_The_Circuit.cs @@ -1,4 +1,4 @@ -using System; +using System; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; @@ -8,11 +8,10 @@ using Polly; using Polly.CircuitBreaker; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.ExceptionPolicy { - public class CommandProcessorWithBothRetryAndCircuitBreaker + public class CommandProcessorWithBothRetryAndCircuitBreaker { private readonly CommandProcessor _commandProcessor; private Exception _thirdException; @@ -20,80 +19,48 @@ public class CommandProcessorWithBothRetryAndCircuitBreaker private Exception _secondException; private int _retryCount; private Polly.Context _context; - public CommandProcessorWithBothRetryAndCircuitBreaker() { var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddSingleton>(); - container.AddSingleton(new BrighterOptions() - { - HandlerLifetime = ServiceLifetime.Transient - }); - - + container.AddSingleton(new BrighterOptions() { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - var policyRegistry = new PolicyRegistry(); - - var retryPolicy = Policy - .Handle() - .WaitAndRetry([ - TimeSpan.FromMilliseconds(10), - TimeSpan.FromMilliseconds(20), - TimeSpan.FromMilliseconds(30) - ], - (exception, timeSpan) => - _retryCount++ - ); - - var breakerPolicy = Policy.Handle() - .CircuitBreaker( - exceptionsAllowedBeforeBreaking: 2, - durationOfBreak: TimeSpan.FromSeconds(30), - onBreak: (exception, timespan, context) => - { - }, - onReset: context => _context = context - ); - + var retryPolicy = Policy.Handle().WaitAndRetry([TimeSpan.FromMilliseconds(10), TimeSpan.FromMilliseconds(20), TimeSpan.FromMilliseconds(30)], (exception, timeSpan) => _retryCount++); + var breakerPolicy = Policy.Handle().CircuitBreaker(exceptionsAllowedBeforeBreaking: 2, durationOfBreak: TimeSpan.FromSeconds(30), onBreak: (exception, timespan, context) => + { + }, onReset: context => _context = context); policyRegistry.Add("MyDivideByZeroRetryPolicy", retryPolicy); policyRegistry.Add("MyDivideByZeroBreakerPolicy", breakerPolicy); - - MyMultiplePoliciesFailsWithDivideByZeroHandler.ReceivedCommand = false; - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void When_Sending_A_Command_That_Retries_Then_Repeatedly_Fails_Breaks_The_Circuit() + [Test] + public async Task When_Sending_A_Command_That_Retries_Then_Repeatedly_Fails_Breaks_The_Circuit() { // First two should be caught, and increment the count _firstException = Catch.Exception(() => _commandProcessor.Send(new MyCommand())); // Should have retried three times - Assert.Equal(3, _retryCount); + await Assert.That(_retryCount).IsEqualTo(3); _retryCount = 0; _secondException = Catch.Exception(() => _commandProcessor.Send(new MyCommand())); // Should have retried three times - Assert.Equal(3, _retryCount); + await Assert.That(_retryCount).IsEqualTo(3); _retryCount = 0; - // This one should tell us that the circuit is broken _thirdException = Catch.Exception(() => _commandProcessor.Send(new MyCommand())); // Should not retry - Assert.Equal(0, _retryCount); - + await Assert.That(_retryCount).IsEqualTo(0); // Should bubble up the first exception - Assert.IsType(_firstException); + await Assert.That(_firstException).IsTypeOf(); // Should bubble up the second exception - Assert.IsType(_secondException); + await Assert.That(_secondException).IsTypeOf(); // Should bubble up the circuit breaker exception - Assert.IsType(_thirdException); + await Assert.That(_thirdException).IsTypeOf(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Retries_Then_Repeatedly_Fails_Breaks_The_Circuit_Async.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Retries_Then_Repeatedly_Fails_Breaks_The_Circuit_Async.cs index deed518a67..d574ae9a65 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Retries_Then_Repeatedly_Fails_Breaks_The_Circuit_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Retries_Then_Repeatedly_Fails_Breaks_The_Circuit_Async.cs @@ -8,11 +8,10 @@ using Polly; using Polly.CircuitBreaker; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.ExceptionPolicy { - public class CommandProcessorWithBothRetryAndCircuitBreakerAsync + public class CommandProcessorWithBothRetryAndCircuitBreakerAsync { private readonly CommandProcessor _commandProcessor; private Exception? _thirdException; @@ -20,80 +19,48 @@ public class CommandProcessorWithBothRetryAndCircuitBreakerAsync private Exception? _secondException; private int _retryCount; private Polly.Context _context; - public CommandProcessorWithBothRetryAndCircuitBreakerAsync() { var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddSingleton>(); - container.AddSingleton(new BrighterOptions() - { - HandlerLifetime = ServiceLifetime.Transient - }); - - + container.AddSingleton(new BrighterOptions() { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - var policyRegistry = new PolicyRegistry(); - - var retryPolicy = Policy - .Handle() - .WaitAndRetryAsync([ - TimeSpan.FromMilliseconds(10), - TimeSpan.FromMilliseconds(20), - TimeSpan.FromMilliseconds(30) - ], - (exception, timeSpan) => - _retryCount++ - ); - - var breakerPolicy = Policy.Handle() - .CircuitBreakerAsync( - exceptionsAllowedBeforeBreaking: 2, - durationOfBreak: TimeSpan.FromSeconds(30), - onBreak: (exception, timespan, context) => - { - }, - onReset: context => _context = context - ); - + var retryPolicy = Policy.Handle().WaitAndRetryAsync([TimeSpan.FromMilliseconds(10), TimeSpan.FromMilliseconds(20), TimeSpan.FromMilliseconds(30)], (exception, timeSpan) => _retryCount++); + var breakerPolicy = Policy.Handle().CircuitBreakerAsync(exceptionsAllowedBeforeBreaking: 2, durationOfBreak: TimeSpan.FromSeconds(30), onBreak: (exception, timespan, context) => + { + }, onReset: context => _context = context); policyRegistry.Add("MyDivideByZeroRetryPolicyAsync", retryPolicy); policyRegistry.Add("MyDivideByZeroBreakerPolicyAsync", breakerPolicy); - - MyMultiplePoliciesFailsWithDivideByZeroHandlerAsync.ReceivedCommand = false; - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task When_Sending_A_Command_That_Retries_Then_Repeatedly_Fails_Breaks_The_Circuit() { // First two should be caught, and increment the count _firstException = await Catch.ExceptionAsync(() => _commandProcessor.SendAsync(new MyCommand())); // Should have retried three times - Assert.Equal(3, _retryCount); + await Assert.That(_retryCount).IsEqualTo(3); _retryCount = 0; _secondException = await Catch.ExceptionAsync(() => _commandProcessor.SendAsync(new MyCommand())); // Should have retried three times - Assert.Equal(3, _retryCount); + await Assert.That(_retryCount).IsEqualTo(3); _retryCount = 0; - // This one should tell us that the circuit is broken _thirdException = await Catch.ExceptionAsync(() => _commandProcessor.SendAsync(new MyCommand())); // Should not retry - Assert.Equal(0, _retryCount); - + await Assert.That(_retryCount).IsEqualTo(0); // Should bubble up the first exception - Assert.IsType(_firstException); + await Assert.That(_firstException).IsTypeOf(); // Should bubble up the second exception - Assert.IsType(_secondException); + await Assert.That(_secondException).IsTypeOf(); // Should bubble up the circuit breaker exception - Assert.IsType(_thirdException); + await Assert.That(_thirdException).IsTypeOf(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Should_Retry_Failure.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Should_Retry_Failure.cs index 3bf49075be..2acab22b98 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Should_Retry_Failure.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Should_Retry_Failure.cs @@ -1,7 +1,6 @@ -using System; +using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly; using Polly.Registry; @@ -16,51 +15,38 @@ public class CommandProcessorWithRetryPolicyTests private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private int _retryCount; - + private readonly ServiceProvider _provider; public CommandProcessorWithRetryPolicyTests() { var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddSingleton>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - - var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); + _provider = container.BuildServiceProvider(); + var handlerFactory = new ServiceProviderHandlerFactory(_provider); var policyRegistry = new PolicyRegistry(); - - var policy = Policy - .Handle() - .WaitAndRetry([ - TimeSpan.FromMilliseconds(10), - TimeSpan.FromMilliseconds(20), - TimeSpan.FromMilliseconds(30) - ], - (exception, timeSpan) => - _retryCount++ - ); - + var policy = Policy.Handle().WaitAndRetry([TimeSpan.FromMilliseconds(10), TimeSpan.FromMilliseconds(20), TimeSpan.FromMilliseconds(30)], (exception, timeSpan) => _retryCount++); policyRegistry.Add("MyDivideByZeroPolicy", policy); - - MyFailsWithDivideByZeroHandler.ReceivedCommand = false; - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } //We have to catch the final exception that bubbles out after retry - [Fact] - public void When_Sending_A_Command_That_Should_Retry_Failure() + [Test] + public async Task When_Sending_A_Command_That_Should_Retry_Failure() { Catch.Exception(() => _commandProcessor.Send(_myCommand)); - //_should_send_the_command_to_the_command_handler - Assert.True(MyFailsWithDivideByZeroHandler.ShouldReceive(_myCommand)); + await Assert.That(_provider.GetRequiredService().ShouldReceive(_myCommand)).IsTrue(); //_should_retry_three_times - Assert.Equal(3, _retryCount); + await Assert.That(_retryCount).IsEqualTo(3); + } + + [After(Test)] + public void Dispose() + { + _provider.Dispose(); } } } diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Should_Retry_Failure_Async.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Should_Retry_Failure_Async.cs index 17ea873045..f3dab1edcd 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Should_Retry_Failure_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_A_Command_That_Should_Retry_Failure_Async.cs @@ -1,8 +1,7 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly; using Polly.Registry; @@ -12,63 +11,46 @@ namespace Paramore.Brighter.Core.Tests.ExceptionPolicy { - public class CommandProcessorWithRetryPolicyAsyncTests : IDisposable + public class CommandProcessorWithRetryPolicyAsyncTests { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private int _retryCount; private ServiceProvider _provider; - public CommandProcessorWithRetryPolicyAsyncTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddSingleton>(); container.AddSingleton>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); _provider = container.BuildServiceProvider(); var handlerFactory = new ServiceProviderHandlerFactory(_provider); - var policyRegistry = new PolicyRegistry(); - - var policy = Policy - .Handle() - .WaitAndRetryAsync([ - TimeSpan.FromMilliseconds(10), - TimeSpan.FromMilliseconds(20), - TimeSpan.FromMilliseconds(30) - ], - (exception, timeSpan) => - _retryCount++ - ); - + var policy = Policy.Handle().WaitAndRetryAsync([TimeSpan.FromMilliseconds(10), TimeSpan.FromMilliseconds(20), TimeSpan.FromMilliseconds(30)], (exception, timeSpan) => _retryCount++); policyRegistry.Add("MyDivideByZeroPolicy", policy); - _provider.GetService().ReceivedCommand = false; - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } //We have to catch the final exception that bubbles out after retry - [Fact] + [Test] public async Task When_Sending_A_Command_That_Should_Retry_Failure_Async() { await Catch.ExceptionAsync(() => _commandProcessor.SendAsync(_myCommand)); - //_should_send_the_command_to_the_command_handler var zeroHandlerAsync = _provider.GetService(); - Assert.True(zeroHandlerAsync!.ShouldReceive(_myCommand)); + await Assert.That(zeroHandlerAsync!.ShouldReceive(_myCommand)).IsTrue(); //_should_retry_three_times - Assert.Equal(3, _retryCount); + await Assert.That(_retryCount).IsEqualTo(3); } + [After(Test)] public void Dispose() { _provider?.Dispose(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_An_Async_Command_That_Passes_ResiliencePipeline_Check.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_An_Async_Command_That_Passes_ResiliencePipeline_Check.cs index e9720d2b6c..2706540a6c 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_An_Async_Command_That_Passes_ResiliencePipeline_Check.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_An_Async_Command_That_Passes_ResiliencePipeline_Check.cs @@ -2,7 +2,6 @@ using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly; using Polly.Registry; @@ -11,52 +10,38 @@ using Polly.Retry; namespace Paramore.Brighter.Core.Tests.ExceptionPolicy; - public class CommandProcessorWithExceptionResiliencePipelineNothingThrowAsyncTests { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private int _retryCount; - public CommandProcessorWithExceptionResiliencePipelineNothingThrowAsyncTests() { //Arrange var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - var resiliencePipelineRegistry = new ResiliencePipelineRegistry(); - resiliencePipelineRegistry.TryAddBuilder("MyDivideByZeroPolicy", - (builder, _) => builder.AddRetry(new RetryStrategyOptions - { - BackoffType = DelayBackoffType.Linear, - Delay = TimeSpan.FromSeconds(1), - OnRetry = _ => - { - _retryCount++; - return new ValueTask(); - } - })); - + resiliencePipelineRegistry.TryAddBuilder("MyDivideByZeroPolicy", (builder, _) => builder.AddRetry(new RetryStrategyOptions { BackoffType = DelayBackoffType.Linear, Delay = TimeSpan.FromSeconds(1), OnRetry = _ => + { + _retryCount++; + return new ValueTask(); + } })); MyDoesNotFailResiliencePipelineHandlerAsync.ReceivedCommand = false; - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), resiliencePipelineRegistry, new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task When_Sending_An_Async_Command_That_Passes_ResiliencePipeline_Check() { //Act await _commandProcessor.SendAsync(_myCommand); - //Assert - Assert.True(MyDoesNotFailResiliencePipelineHandlerAsync.Shouldreceive(_myCommand)); - Assert.Equal(0, _retryCount); + await Assert.That(MyDoesNotFailResiliencePipelineHandlerAsync.Shouldreceive(_myCommand)).IsTrue(); + await Assert.That(_retryCount).IsEqualTo(0); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_An_Async_Command_That_Passes_TypeResiliencePipeline_Check.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_An_Async_Command_That_Passes_TypeResiliencePipeline_Check.cs index 88c120ab80..24adf0650e 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_An_Async_Command_That_Passes_TypeResiliencePipeline_Check.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_An_Async_Command_That_Passes_TypeResiliencePipeline_Check.cs @@ -2,7 +2,6 @@ using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly; using Polly.Registry; @@ -11,52 +10,38 @@ using Polly.Retry; namespace Paramore.Brighter.Core.Tests.ExceptionPolicy; - public class CommandProcessorWithExceptionTypeResiliencePipelineNothingThrowAsyncTests { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private int _retryCount; - public CommandProcessorWithExceptionTypeResiliencePipelineNothingThrowAsyncTests() { //Arrange var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - var resiliencePipelineRegistry = new ResiliencePipelineRegistry(); - resiliencePipelineRegistry.TryAddBuilder("MyDivideByZeroPolicy", - (builder, _) => builder.AddRetry(new RetryStrategyOptions - { - BackoffType = DelayBackoffType.Linear, - Delay = TimeSpan.FromSeconds(1), - OnRetry = _ => - { - _retryCount++; - return new ValueTask(); - } - })); - + resiliencePipelineRegistry.TryAddBuilder("MyDivideByZeroPolicy", (builder, _) => builder.AddRetry(new RetryStrategyOptions { BackoffType = DelayBackoffType.Linear, Delay = TimeSpan.FromSeconds(1), OnRetry = _ => + { + _retryCount++; + return new ValueTask(); + } })); MyDoesNotFailTypeResiliencePipelineHandlerAsync.ReceivedCommand = false; - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), resiliencePipelineRegistry, new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task When_Sending_An_Async_Command_That_Passes_TypeResiliencePipeline_Check() { //Act await _commandProcessor.SendAsync(_myCommand); - //Assert - Assert.True(MyDoesNotFailTypeResiliencePipelineHandlerAsync.Shouldreceive(_myCommand)); - Assert.Equal(0, _retryCount); + await Assert.That(MyDoesNotFailTypeResiliencePipelineHandlerAsync.Shouldreceive(_myCommand)).IsTrue(); + await Assert.That(_retryCount).IsEqualTo(0); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_An_Async_Command_That_Repeatedely_Fails_Break_The_Circuit_With_ResiliencePipeline.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_An_Async_Command_That_Repeatedely_Fails_Break_The_Circuit_With_ResiliencePipeline.cs index 1d0198941c..590a9a4d45 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_An_Async_Command_That_Repeatedely_Fails_Break_The_Circuit_With_ResiliencePipeline.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_An_Async_Command_That_Repeatedely_Fails_Break_The_Circuit_With_ResiliencePipeline.cs @@ -2,7 +2,6 @@ using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly; using Polly.CircuitBreaker; @@ -12,7 +11,6 @@ using Paramore.Brighter.Extensions.DependencyInjection; namespace Paramore.Brighter.Core.Tests.ExceptionPolicy; - public class CommandProcessorWithCircuitBreakerAndResiliencePipelineAsyncTests { private readonly CommandProcessor _commandProcessor; @@ -20,35 +18,22 @@ public class CommandProcessorWithCircuitBreakerAndResiliencePipelineAsyncTests private Exception _thirdException; private Exception _firstException; private Exception _secondException; - public CommandProcessorWithCircuitBreakerAndResiliencePipelineAsyncTests() { var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddSingleton>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - var resiliencePipeline = new ResiliencePipelineRegistry(); - resiliencePipeline.TryAddBuilder("MyDivideByZeroPolicy", - (builder, _) => builder - .AddCircuitBreaker(new CircuitBreakerStrategyOptions - { - MinimumThroughput = 2, - BreakDuration = TimeSpan.FromMinutes(1) - })); - + resiliencePipeline.TryAddBuilder("MyDivideByZeroPolicy", (builder, _) => builder.AddCircuitBreaker(new CircuitBreakerStrategyOptions { MinimumThroughput = 2, BreakDuration = TimeSpan.FromMinutes(1) })); MyFailsWithDivideByZeroWithResiliencePipelineHandlerAsync.ReceivedCommand = false; - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), resiliencePipeline, new InMemorySchedulerFactory()); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), resiliencePipeline, new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task When_Sending_An_Async_Command_That_Repeatedly_Fails_Break_The_Circuit() { //First two should be caught, and increment the count @@ -56,14 +41,13 @@ public async Task When_Sending_An_Async_Command_That_Repeatedly_Fails_Break_The_ _secondException = await Catch.ExceptionAsync(() => _commandProcessor.SendAsync(_myCommand)); //this one should tell us that the circuit is broken _thirdException = await Catch.ExceptionAsync(() => _commandProcessor.SendAsync(_myCommand)); - // Should send the command to the command handler - Assert.True(MyFailsWithDivideByZeroWithResiliencePipelineHandlerAsync.ShouldReceive(_myCommand)); + await Assert.That(MyFailsWithDivideByZeroWithResiliencePipelineHandlerAsync.ShouldReceive(_myCommand)).IsTrue(); // Should bubble up the first exception - Assert.IsType(_firstException); + await Assert.That(_firstException).IsTypeOf(); // Should bubble up the second exception - Assert.IsType(_secondException); + await Assert.That(_secondException).IsTypeOf(); // Should break the circuit after two fails - Assert.IsType(_thirdException); + await Assert.That(_thirdException).IsTypeOf(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_Different_Async_Commands_That_Share_A_ResiliencePipeline.cs b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_Different_Async_Commands_That_Share_A_ResiliencePipeline.cs index 0700ec3481..e3978b7982 100644 --- a/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_Different_Async_Commands_That_Share_A_ResiliencePipeline.cs +++ b/tests/Paramore.Brighter.Core.Tests/ExceptionPolicy/When_Sending_Different_Async_Commands_That_Share_A_ResiliencePipeline.cs @@ -2,7 +2,6 @@ using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.ExceptionPolicy.TestDoubles; -using Xunit; using Paramore.Brighter.Policies.Handlers; using Polly; using Polly.Registry; @@ -11,53 +10,39 @@ using Polly.Retry; namespace Paramore.Brighter.Core.Tests.ExceptionPolicy; - public class CommandProcessorWithSharedResiliencePipelineAsyncTests { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private readonly MyOtherCommand _myOtherCommand = new MyOtherCommand(); - public CommandProcessorWithSharedResiliencePipelineAsyncTests() { //Arrange var registry = new SubscriberRegistry(); registry.RegisterAsync(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient(); container.AddTransient>(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - var resiliencePipelineRegistry = new ResiliencePipelineRegistry(); - resiliencePipelineRegistry.TryAddBuilder("SharedRetryPolicy", - (builder, _) => builder.AddRetry(new RetryStrategyOptions - { - BackoffType = DelayBackoffType.Linear, - Delay = TimeSpan.FromSeconds(1), - MaxRetryAttempts = 1 - })); - + resiliencePipelineRegistry.TryAddBuilder("SharedRetryPolicy", (builder, _) => builder.AddRetry(new RetryStrategyOptions { BackoffType = DelayBackoffType.Linear, Delay = TimeSpan.FromSeconds(1), MaxRetryAttempts = 1 })); MyCommandHandlerWithSharedPipelineAsync.ReceivedCommand = false; MyOtherCommandHandlerWithSharedPipelineAsync.ReceivedCommand = false; - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), resiliencePipelineRegistry, new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task When_Sending_Different_Async_Commands_That_Share_A_ResiliencePipeline() { //Act await _commandProcessor.SendAsync(_myCommand); await _commandProcessor.SendAsync(_myOtherCommand); - //Assert - Assert.True(MyCommandHandlerWithSharedPipelineAsync.ReceivedCommand); - Assert.True(MyOtherCommandHandlerWithSharedPipelineAsync.ReceivedCommand); + await Assert.That(MyCommandHandlerWithSharedPipelineAsync.ReceivedCommand).IsTrue(); + await Assert.That(MyOtherCommandHandlerWithSharedPipelineAsync.ReceivedCommand).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Config_Off.cs b/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Config_Off.cs index 83ea55d509..4afa5315be 100644 --- a/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Config_Off.cs +++ b/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Config_Off.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.FeatureSwitch.TestDoubles; @@ -6,7 +6,6 @@ using Paramore.Brighter.FeatureSwitch.Providers; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; using Paramore.Brighter.FeatureSwitch.Handlers; using Paramore.Brighter.Observability; @@ -16,58 +15,37 @@ public class CommandProcessorWithFeatureSwitchOffByConfigInPipelineTests { private readonly MyCommand _myCommand = new(); private readonly MyCommandAsync _myAsyncCommand = new(); - private readonly CommandProcessor _commandProcessor; private readonly ServiceProvider _provider; - public CommandProcessorWithFeatureSwitchOffByConfigInPipelineTests() { SubscriberRegistry registry = new(); registry.Register(); registry.RegisterAsync(); - - IAmAFeatureSwitchRegistry featureSwitchRegistry = FluentConfigRegistryBuilder - .With() - .StatusOf().Is(FeatureSwitchStatus.Off) - .StatusOf().Is(FeatureSwitchStatus.Off) - .Build(); - + IAmAFeatureSwitchRegistry featureSwitchRegistry = FluentConfigRegistryBuilder.With().StatusOf().Is(FeatureSwitchStatus.Off).StatusOf().Is(FeatureSwitchStatus.Off).Build(); var container = new ServiceCollection(); container.AddSingleton(); container.AddSingleton(); container.AddTransient>(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); _provider = container.BuildServiceProvider(); ServiceProviderHandlerFactory handlerFactory = new(_provider); - - _commandProcessor = CommandProcessorBuilder - .StartNew() - .ConfigureFeatureSwitches(featureSwitchRegistry) - .Handlers(new HandlerConfiguration(registry, handlerFactory)) - .DefaultResilience() - .NoExternalBus() - .ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All) - .RequestContextFactory(new InMemoryRequestContextFactory()) - .RequestSchedulerFactory(new InMemorySchedulerFactory()) - .Build(); + _commandProcessor = CommandProcessorBuilder.StartNew().ConfigureFeatureSwitches(featureSwitchRegistry).Handlers(new HandlerConfiguration(registry, handlerFactory)).DefaultResilience().NoExternalBus().ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All).RequestContextFactory(new InMemoryRequestContextFactory()).RequestSchedulerFactory(new InMemorySchedulerFactory()).Build(); } - [Fact] - public void When_Sending_A_Command_To_The_Processor_When_A_Feature_Switch_Is_Off_By_Fluent_Config() + [Test] + public async Task When_Sending_A_Command_To_The_Processor_When_A_Feature_Switch_Is_Off_By_Fluent_Config() { _commandProcessor.Send(_myCommand); - - Assert.False(_provider.GetService()!.DidReceive()); + await Assert.That(_provider.GetService()!.DidReceive()).IsFalse(); } - [Fact] + [Test] public async Task When_Sending_A_Async_Command_To_The_Processor_When_A_Feature_Switch_Is_Off_By_Fluent_Config() { await _commandProcessor.SendAsync(_myAsyncCommand); - - Assert.False(_provider.GetService()!.DidReceive()); + await Assert.That(_provider.GetService()!.DidReceive()).IsFalse(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Config_On.cs b/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Config_On.cs index 9b2a16f76f..a28b1dd8c7 100644 --- a/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Config_On.cs +++ b/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Config_On.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.FeatureSwitch.TestDoubles; @@ -6,7 +6,6 @@ using Paramore.Brighter.FeatureSwitch.Providers; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; using Paramore.Brighter.FeatureSwitch.Handlers; using Paramore.Brighter.Observability; @@ -16,58 +15,37 @@ public class CommandProcessorWithFeatureSwitchOnByConfigInPipelineTests { private readonly MyCommand _myCommand = new(); private readonly MyCommandAsync _myAsyncCommand = new(); - private readonly CommandProcessor _commandProcessor; readonly ServiceProvider _provider; - public CommandProcessorWithFeatureSwitchOnByConfigInPipelineTests() { SubscriberRegistry registry = new(); registry.Register(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddSingleton(); container.AddTransient>(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); _provider = container.BuildServiceProvider(); ServiceProviderHandlerFactory handlerFactory = new(_provider); - - IAmAFeatureSwitchRegistry fluentConfig = FluentConfigRegistryBuilder - .With() - .StatusOf().Is(FeatureSwitchStatus.On) - .StatusOf().Is(FeatureSwitchStatus.On) - .Build(); - - _commandProcessor = CommandProcessorBuilder - .StartNew() - .ConfigureFeatureSwitches(fluentConfig) - .Handlers(new HandlerConfiguration(registry, handlerFactory)) - .DefaultResilience() - .NoExternalBus() - .ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All) - .RequestContextFactory(new InMemoryRequestContextFactory()) - .RequestSchedulerFactory(new InMemorySchedulerFactory()) - .Build(); + IAmAFeatureSwitchRegistry fluentConfig = FluentConfigRegistryBuilder.With().StatusOf().Is(FeatureSwitchStatus.On).StatusOf().Is(FeatureSwitchStatus.On).Build(); + _commandProcessor = CommandProcessorBuilder.StartNew().ConfigureFeatureSwitches(fluentConfig).Handlers(new HandlerConfiguration(registry, handlerFactory)).DefaultResilience().NoExternalBus().ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All).RequestContextFactory(new InMemoryRequestContextFactory()).RequestSchedulerFactory(new InMemorySchedulerFactory()).Build(); } - [Fact] - public void When_Sending_A_Command_To_The_Processor_When_A_Feature_Switch_Is_On_By_Fluent_Config() + [Test] + public async Task When_Sending_A_Command_To_The_Processor_When_A_Feature_Switch_Is_On_By_Fluent_Config() { _commandProcessor.Send(_myCommand); - - Assert.True(_provider.GetService()!.DidReceive()); + await Assert.That(_provider.GetService()!.DidReceive()).IsTrue(); } - - [Fact] + + [Test] public async Task When_Sending_A_Async_Command_To_The_Processor_When_A_Feature_Switch_Is_On_By_Fluent_Config() { await _commandProcessor.SendAsync(_myAsyncCommand); - - Assert.True(_provider.GetService()!.DidReceive()); + await Assert.That(_provider.GetService()!.DidReceive()).IsTrue(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Missing_Config_Exception.cs b/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Missing_Config_Exception.cs index 38a9e90efd..4e95ab8b00 100644 --- a/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Missing_Config_Exception.cs +++ b/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Missing_Config_Exception.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.FeatureSwitch.TestDoubles; @@ -6,7 +6,6 @@ using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; using Paramore.Brighter.FeatureSwitch.Handlers; using Paramore.Brighter.Observability; @@ -16,57 +15,38 @@ public class FeatureSwitchByConfigMissingConfigStrategyExceptionTests { private readonly MyCommand _myCommand = new(); private readonly MyCommandAsync _myAsyncCommand = new(); - private readonly CommandProcessor _commandProcessor; private readonly ServiceProvider _provider; private Exception _exception; - public FeatureSwitchByConfigMissingConfigStrategyExceptionTests() { SubscriberRegistry registry = new(); registry.Register(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddSingleton(); container.AddTransient>(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); _provider = container.BuildServiceProvider(); ServiceProviderHandlerFactory handlerFactory = new(_provider); - IAmAFeatureSwitchRegistry featureSwitchRegistry = new FakeConfigRegistry(); - featureSwitchRegistry.MissingConfigStrategy = MissingConfigStrategy.Exception; + _commandProcessor = CommandProcessorBuilder.StartNew().ConfigureFeatureSwitches(featureSwitchRegistry).Handlers(new HandlerConfiguration(registry, handlerFactory)).DefaultResilience().NoExternalBus().ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All).RequestContextFactory(new InMemoryRequestContextFactory()).RequestSchedulerFactory(new InMemorySchedulerFactory()).Build(); + } - _commandProcessor = CommandProcessorBuilder - .StartNew() - .ConfigureFeatureSwitches(featureSwitchRegistry) - .Handlers(new HandlerConfiguration(registry, handlerFactory)) - .DefaultResilience() - .NoExternalBus() - .ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All) - .RequestContextFactory(new InMemoryRequestContextFactory()) - .RequestSchedulerFactory(new InMemorySchedulerFactory()) - .Build(); - } - - [Fact] - public void When_Sending_A_Command_To_The_Processor_When_A_Feature_Switch_Has_No_Config_And_Strategy_Is_Exception() + [Test] + public async Task When_Sending_A_Command_To_The_Processor_When_A_Feature_Switch_Has_No_Config_And_Strategy_Is_Exception() { _exception = Catch.Exception(() => _commandProcessor.Send(_myCommand)); + await Assert.That(_exception).IsTypeOf(); + await Assert.That(_exception).IsNotNull(); + await Assert.That(_exception.Message).Contains($"Handler of type {nameof(MyFeatureSwitchedConfigHandler)} does not have a Feature Switch configuration!"); + await Assert.That(_provider.GetService()!.DidReceive()).IsFalse(); + } - Assert.IsType(_exception); - Assert.NotNull(_exception); - Assert.Contains($"Handler of type {nameof(MyFeatureSwitchedConfigHandler)} does not have a Feature Switch configuration!", _exception.Message); - - Assert.False(_provider.GetService()!.DidReceive()); - - } - - [Fact] + [Test] public async Task When_Sending_A_Async_Command_To_The_Processor_When_A_Feature_Switch_Has_No_Config_And_Strategy_Is_Exception() { try @@ -77,14 +57,11 @@ public async Task When_Sending_A_Async_Command_To_The_Processor_When_A_Feature_S { _exception = e; } - - - Assert.IsType(_exception); - Assert.NotNull(_exception); - Assert.Contains($"Handler of type {nameof(MyFeatureSwitchedConfigHandlerAsync)} does not have a Feature Switch configuration!", _exception.Message); - - Assert.False(_provider.GetService()!.DidReceive()); + await Assert.That(_exception).IsTypeOf(); + await Assert.That(_exception).IsNotNull(); + await Assert.That(_exception.Message).Contains($"Handler of type {nameof(MyFeatureSwitchedConfigHandlerAsync)} does not have a Feature Switch configuration!"); + await Assert.That(_provider.GetService()!.DidReceive()).IsFalse(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Missing_Config_SilentOff.cs b/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Missing_Config_SilentOff.cs index 0ca7c41946..dbadbc0ea6 100644 --- a/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Missing_Config_SilentOff.cs +++ b/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Missing_Config_SilentOff.cs @@ -1,11 +1,10 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.FeatureSwitch.TestDoubles; using Paramore.Brighter.FeatureSwitch; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; using Paramore.Brighter.FeatureSwitch.Handlers; using Paramore.Brighter.Observability; @@ -15,57 +14,40 @@ public class FeatureSwitchByConfigMissingConfigStrategySilentOffTests { private readonly MyCommand _myCommand = new(); private readonly MyCommandAsync _myAsyncCommand = new(); - private readonly CommandProcessor _commandProcessor; private readonly IServiceProvider _provider; - public FeatureSwitchByConfigMissingConfigStrategySilentOffTests() { SubscriberRegistry registry = new(); registry.Register(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddSingleton(); container.AddTransient>(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); _provider = container.BuildServiceProvider(); ServiceProviderHandlerFactory handlerFactory = new(_provider); - IAmAFeatureSwitchRegistry featureSwitchRegistry = new FakeConfigRegistry { MissingConfigStrategy = MissingConfigStrategy.SilentOff }; - - _commandProcessor = CommandProcessorBuilder - .StartNew() - .ConfigureFeatureSwitches(featureSwitchRegistry) - .Handlers(new HandlerConfiguration(registry, handlerFactory)) - .DefaultResilience() - .NoExternalBus() - .ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All) - .RequestContextFactory(new InMemoryRequestContextFactory()) - .RequestSchedulerFactory(new InMemorySchedulerFactory()) - .Build(); - } + _commandProcessor = CommandProcessorBuilder.StartNew().ConfigureFeatureSwitches(featureSwitchRegistry).Handlers(new HandlerConfiguration(registry, handlerFactory)).DefaultResilience().NoExternalBus().ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All).RequestContextFactory(new InMemoryRequestContextFactory()).RequestSchedulerFactory(new InMemorySchedulerFactory()).Build(); + } - [Fact] - public void When_Sending_A_Command_To_The_Processor_When_A_Feature_Switch_Has_No_Config_And_Strategy_Is_SilentOff() + [Test] + public async Task When_Sending_A_Command_To_The_Processor_When_A_Feature_Switch_Has_No_Config_And_Strategy_Is_SilentOff() { _commandProcessor.Send(_myCommand); - - Assert.False(_provider.GetService()!.DidReceive()); + await Assert.That(_provider.GetService()!.DidReceive()).IsFalse(); } - [Fact] + [Test] public async Task When_Sending_A_Async_Command_To_The_Processor_When_A_Feature_Switch_Has_No_Config_And_Strategy_Is_SilentOff() { await _commandProcessor.SendAsync(_myAsyncCommand); - - Assert.False(_provider.GetService()!.DidReceive()); + await Assert.That(_provider.GetService()!.DidReceive()).IsFalse(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Missing_Config_SilentOn.cs b/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Missing_Config_SilentOn.cs index 2e8b13820a..061e4ce7c1 100644 --- a/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Missing_Config_SilentOn.cs +++ b/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Missing_Config_SilentOn.cs @@ -1,11 +1,10 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.FeatureSwitch.TestDoubles; using Paramore.Brighter.FeatureSwitch; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; using Paramore.Brighter.FeatureSwitch.Handlers; using Paramore.Brighter.Observability; @@ -16,57 +15,39 @@ public class FeatureSwitchByConfigMissingConfigStrategySilentOnTests private readonly MyCommand _myCommand = new(); private readonly MyCommandAsync _myAsyncCommand = new(); private readonly ServiceProvider _provider; - - private readonly CommandProcessor _commandProcessor; - + private readonly CommandProcessor _commandProcessor; public FeatureSwitchByConfigMissingConfigStrategySilentOnTests() { SubscriberRegistry registry = new(); registry.Register(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddSingleton(); container.AddTransient>(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); _provider = container.BuildServiceProvider(); ServiceProviderHandlerFactory handlerFactory = new(_provider); - IAmAFeatureSwitchRegistry featureSwitchRegistry = new FakeConfigRegistry { MissingConfigStrategy = MissingConfigStrategy.SilentOn }; - - _commandProcessor = CommandProcessorBuilder - .StartNew() - .ConfigureFeatureSwitches(featureSwitchRegistry) - .Handlers(new HandlerConfiguration(registry, handlerFactory)) - .DefaultResilience() - .NoExternalBus() - .ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All) - .RequestContextFactory(new InMemoryRequestContextFactory()) - .RequestSchedulerFactory(new InMemorySchedulerFactory()) - .Build(); + _commandProcessor = CommandProcessorBuilder.StartNew().ConfigureFeatureSwitches(featureSwitchRegistry).Handlers(new HandlerConfiguration(registry, handlerFactory)).DefaultResilience().NoExternalBus().ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All).RequestContextFactory(new InMemoryRequestContextFactory()).RequestSchedulerFactory(new InMemorySchedulerFactory()).Build(); } - - [Fact] - public void When_Sending_A_Command_To_The_Processor_When_A_Feature_Switch_Has_No_Config_And_Strategy_Is_SilentOn() + [Test] + public async Task When_Sending_A_Command_To_The_Processor_When_A_Feature_Switch_Has_No_Config_And_Strategy_Is_SilentOn() { _commandProcessor.Send(_myCommand); - - Assert.True(_provider.GetService()!.DidReceive()); + await Assert.That(_provider.GetService()!.DidReceive()).IsTrue(); } - [Fact] + [Test] public async Task When_Sending_A_Async_Command_To_The_Processor_When_A_Feature_Switch_Has_No_Config_And_Strategy_Is_SilentOn() { await _commandProcessor.SendAsync(_myAsyncCommand); - - Assert.True(_provider.GetService()!.DidReceive()); + await Assert.That(_provider.GetService()!.DidReceive()).IsTrue(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Off.cs b/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Off.cs index f08e9025f0..0c720e427c 100644 --- a/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Off.cs +++ b/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Off.cs @@ -1,10 +1,9 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.FeatureSwitch.TestDoubles; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; using Paramore.Brighter.FeatureSwitch.Handlers; using Paramore.Brighter.Observability; @@ -14,49 +13,34 @@ public class CommandProcessorWithFeatureSwitchOffInPipelineTests { private readonly MyCommand _myCommand = new(); private readonly MyCommandAsync _myAsyncCommand = new(); - private readonly CommandProcessor _commandProcessor; - public CommandProcessorWithFeatureSwitchOffInPipelineTests() { SubscriberRegistry registry = new(); registry.Register(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddSingleton(); container.AddTransient>(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); ServiceProviderHandlerFactory handlerFactory = new(container.BuildServiceProvider()); - - _commandProcessor = CommandProcessorBuilder - .StartNew() - .Handlers(new HandlerConfiguration(registry, handlerFactory)) - .DefaultResilience() - .NoExternalBus() - .ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All) - .RequestContextFactory(new InMemoryRequestContextFactory()) - .RequestSchedulerFactory(new InMemorySchedulerFactory()) - .Build(); + _commandProcessor = CommandProcessorBuilder.StartNew().Handlers(new HandlerConfiguration(registry, handlerFactory)).DefaultResilience().NoExternalBus().ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All).RequestContextFactory(new InMemoryRequestContextFactory()).RequestSchedulerFactory(new InMemorySchedulerFactory()).Build(); } - [Fact] - public void When_Sending_A_Command_To_The_Processor_When_A_Feature_Switch_Is_Off() + [Test] + public async Task When_Sending_A_Command_To_The_Processor_When_A_Feature_Switch_Is_Off() { _commandProcessor.Send(_myCommand); - - Assert.False(MyFeatureSwitchedOffHandler.DidReceive()); + await Assert.That(MyFeatureSwitchedOffHandler.DidReceive()).IsFalse(); } - [Fact] + [Test] public async Task When_Sending_A_Async_Command_To_The_Processor_When_A_Feature_Switch_Is_Off() { await _commandProcessor.SendAsync(_myAsyncCommand); - - Assert.False(MyFeatureSwitchedOffHandlerAsync.DidReceive()); + await Assert.That(MyFeatureSwitchedOffHandlerAsync.DidReceive()).IsFalse(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Off_With_DontAck.cs b/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Off_With_DontAck.cs index ec08cf2d8d..454b1ed99e 100644 --- a/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Off_With_DontAck.cs +++ b/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Off_With_DontAck.cs @@ -19,9 +19,7 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Paramore.Brighter.Actions; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; @@ -30,56 +28,42 @@ THE SOFTWARE. */ using Paramore.Brighter.FeatureSwitch.Handlers; using Paramore.Brighter.Observability; using Microsoft.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.FeatureSwitch { - [Collection("CommandProcessor")] - public class CommandProcessorWithFeatureSwitchOffDontAckInPipelineTests : IDisposable + [NotInParallel("CommandProcessor")] + public class CommandProcessorWithFeatureSwitchOffDontAckInPipelineTests { private readonly MyCommand _myCommand = new(); private readonly CommandProcessor _commandProcessor; - public CommandProcessorWithFeatureSwitchOffDontAckInPipelineTests() { //Arrange SubscriberRegistry registry = new(); registry.Register(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddTransient>(); container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); - ServiceProviderHandlerFactory handlerFactory = new(container.BuildServiceProvider()); - MyFeatureSwitchedOffDontAckHandler.CommandReceived = false; - - _commandProcessor = CommandProcessorBuilder - .StartNew() - .Handlers(new HandlerConfiguration(registry, handlerFactory)) - .DefaultResilience() - .NoExternalBus() - .ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All) - .RequestContextFactory(new InMemoryRequestContextFactory()) - .RequestSchedulerFactory(new InMemorySchedulerFactory()) - .Build(); + _commandProcessor = CommandProcessorBuilder.StartNew().Handlers(new HandlerConfiguration(registry, handlerFactory)).DefaultResilience().NoExternalBus().ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All).RequestContextFactory(new InMemoryRequestContextFactory()).RequestSchedulerFactory(new InMemorySchedulerFactory()).Build(); } - [Fact] - public void When_Sending_A_Command_To_The_Processor_When_A_Feature_Switch_Is_Off_With_DontAck() + [Test] + public async Task When_Sending_A_Command_To_The_Processor_When_A_Feature_Switch_Is_Off_With_DontAck() { //Act - var exception = Assert.Throws(() => _commandProcessor.Send(_myCommand)); - + var exception = await Assert.That(() => _commandProcessor.Send(_myCommand)).ThrowsExactly(); //Assert - Assert.False(MyFeatureSwitchedOffDontAckHandler.DidReceive()); // Target handler was NOT called - Assert.Contains(nameof(MyFeatureSwitchedOffDontAckHandler), exception.Message); // Message contains the handler type name + await Assert.That(MyFeatureSwitchedOffDontAckHandler.DidReceive()).IsFalse(); // Target handler was NOT called + await Assert.That(exception.Message).Contains(nameof(MyFeatureSwitchedOffDontAckHandler)); // Message contains the handler type name } + [After(Test)] public void Dispose() { CommandProcessor.ClearServiceBus(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Off_With_DontAck_Async.cs b/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Off_With_DontAck_Async.cs index aa4a5b6701..6c386a026d 100644 --- a/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Off_With_DontAck_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_Off_With_DontAck_Async.cs @@ -19,9 +19,7 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Threading.Tasks; using Paramore.Brighter.Actions; @@ -30,56 +28,42 @@ THE SOFTWARE. */ using Paramore.Brighter.FeatureSwitch.Handlers; using Paramore.Brighter.Observability; using Microsoft.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.FeatureSwitch { - [Collection("CommandProcessor")] - public class CommandProcessorWithFeatureSwitchOffDontAckAsyncInPipelineTests : IDisposable + [NotInParallel("CommandProcessor")] + public class CommandProcessorWithFeatureSwitchOffDontAckAsyncInPipelineTests { private readonly MyCommandAsync _myAsyncCommand = new(); private readonly CommandProcessor _commandProcessor; - public CommandProcessorWithFeatureSwitchOffDontAckAsyncInPipelineTests() { //Arrange SubscriberRegistry registry = new(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddTransient>(); container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); - ServiceProviderHandlerFactory handlerFactory = new(container.BuildServiceProvider()); - MyFeatureSwitchedOffDontAckHandlerAsync.CommandReceived = false; - - _commandProcessor = CommandProcessorBuilder - .StartNew() - .Handlers(new HandlerConfiguration(registry, handlerFactory)) - .DefaultResilience() - .NoExternalBus() - .ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All) - .RequestContextFactory(new InMemoryRequestContextFactory()) - .RequestSchedulerFactory(new InMemorySchedulerFactory()) - .Build(); + _commandProcessor = CommandProcessorBuilder.StartNew().Handlers(new HandlerConfiguration(registry, handlerFactory)).DefaultResilience().NoExternalBus().ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All).RequestContextFactory(new InMemoryRequestContextFactory()).RequestSchedulerFactory(new InMemorySchedulerFactory()).Build(); } - [Fact] + [Test] public async Task When_Sending_An_Async_Command_To_The_Processor_When_A_Feature_Switch_Is_Off_With_DontAck() { //Act - var exception = await Assert.ThrowsAsync(() => _commandProcessor.SendAsync(_myAsyncCommand)); - + var exception = await Assert.That(() => _commandProcessor.SendAsync(_myAsyncCommand)).ThrowsExactly(); //Assert - Assert.False(MyFeatureSwitchedOffDontAckHandlerAsync.DidReceive()); // Target handler was NOT called - Assert.Contains(nameof(MyFeatureSwitchedOffDontAckHandlerAsync), exception.Message); // Message contains the handler type name + await Assert.That(MyFeatureSwitchedOffDontAckHandlerAsync.DidReceive()).IsFalse(); // Target handler was NOT called + await Assert.That(exception.Message).Contains(nameof(MyFeatureSwitchedOffDontAckHandlerAsync)); // Message contains the handler type name } + [After(Test)] public void Dispose() { CommandProcessor.ClearServiceBus(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_On.cs b/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_On.cs index 89dc62970f..0a34dc422f 100644 --- a/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_On.cs +++ b/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_A_Handler_Is_Feature_Switch_On.cs @@ -1,10 +1,9 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.FeatureSwitch.TestDoubles; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; using Paramore.Brighter.FeatureSwitch.Handlers; using Paramore.Brighter.Observability; @@ -14,49 +13,34 @@ public class CommandProcessorWithFeatureSwitchOnInPipelineTests { private readonly MyCommand _myCommand = new(); private readonly MyCommandAsync _myAsyncCommand = new(); - private readonly CommandProcessor _commandProcessor; - public CommandProcessorWithFeatureSwitchOnInPipelineTests() { SubscriberRegistry registry = new(); registry.Register(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddSingleton(); container.AddTransient>(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); ServiceProviderHandlerFactory handlerFactory = new(container.BuildServiceProvider()); - - _commandProcessor = CommandProcessorBuilder - .StartNew() - .Handlers(new HandlerConfiguration(registry, handlerFactory)) - .DefaultResilience() - .NoExternalBus() - .ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All) - .RequestContextFactory(new InMemoryRequestContextFactory()) - .RequestSchedulerFactory(new InMemorySchedulerFactory()) - .Build(); + _commandProcessor = CommandProcessorBuilder.StartNew().Handlers(new HandlerConfiguration(registry, handlerFactory)).DefaultResilience().NoExternalBus().ConfigureInstrumentation(new BrighterTracer(TimeProvider.System), InstrumentationOptions.All).RequestContextFactory(new InMemoryRequestContextFactory()).RequestSchedulerFactory(new InMemorySchedulerFactory()).Build(); } - [Fact] - public void When_Sending_A_Command_To_The_Processor_When_A_Feature_Switch_Is_On() + [Test] + public async Task When_Sending_A_Command_To_The_Processor_When_A_Feature_Switch_Is_On() { _commandProcessor.Send(_myCommand); - - Assert.True(MyFeatureSwitchedOnHandler.DidReceive(_myCommand)); + await Assert.That(MyFeatureSwitchedOnHandler.DidReceive(_myCommand)).IsTrue(); } - [Fact] + [Test] public async Task When_Sending_A_Async_Command_To_The_Processor_When_A_Feature_Switch_Is_On() { await _commandProcessor.SendAsync(_myAsyncCommand); - - Assert.True(MyFeatureSwitchedOnHandlerAsync.DidReceive()); + await Assert.That(MyFeatureSwitchedOnHandlerAsync.DidReceive()).IsTrue(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_No_Feature_Switch_Config.cs b/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_No_Feature_Switch_Config.cs index b58abf714a..34e7d2ee84 100644 --- a/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_No_Feature_Switch_Config.cs +++ b/tests/Paramore.Brighter.Core.Tests/FeatureSwitch/When_No_Feature_Switch_Config.cs @@ -1,10 +1,9 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.FeatureSwitch.TestDoubles; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; using Paramore.Brighter.FeatureSwitch.Handlers; using Paramore.Brighter.Observability; @@ -15,50 +14,35 @@ public class CommandProcessorWithNullFeatureSwitchConfig private readonly MyCommand _myCommand = new(); private readonly MyCommandAsync _myAsyncCommand = new(); private readonly ServiceProvider _provider; - private readonly CommandProcessor _commandProcessor; - public CommandProcessorWithNullFeatureSwitchConfig() { SubscriberRegistry registry = new(); registry.Register(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddSingleton(); container.AddSingleton(); container.AddTransient>(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); _provider = container.BuildServiceProvider(); ServiceProviderHandlerFactory handlerFactory = new(_provider); - - _commandProcessor = CommandProcessorBuilder - .StartNew() - .Handlers(new HandlerConfiguration(registry, handlerFactory)) - .DefaultResilience() - .NoExternalBus() - .ConfigureInstrumentation(new BrighterTracer(), InstrumentationOptions.All) - .RequestContextFactory(new InMemoryRequestContextFactory()) - .RequestSchedulerFactory(new InMemorySchedulerFactory()) - .Build(); + _commandProcessor = CommandProcessorBuilder.StartNew().Handlers(new HandlerConfiguration(registry, handlerFactory)).DefaultResilience().NoExternalBus().ConfigureInstrumentation(new BrighterTracer(), InstrumentationOptions.All).RequestContextFactory(new InMemoryRequestContextFactory()).RequestSchedulerFactory(new InMemorySchedulerFactory()).Build(); } - [Fact] - public void When_a_sending_a_command_to_the_processor_when_null_feature_switch_config() + [Test] + public async Task When_a_sending_a_command_to_the_processor_when_null_feature_switch_config() { _commandProcessor.Send(_myCommand); - - Assert.True(_provider.GetService()!.DidReceive()); + await Assert.That(_provider.GetService()!.DidReceive()).IsTrue(); } - [Fact] + [Test] public async Task When_a_sending_a_async_command_to_the_processor_when_null_feature_switch_config() { await _commandProcessor.SendAsync(_myAsyncCommand); - - Assert.True(_provider.GetService()!.DidReceive()); + await Assert.That(_provider.GetService()!.DidReceive()).IsTrue(); } - } -} + } +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/JsonMapper/JsonMessageMapperTests.cs b/tests/Paramore.Brighter.Core.Tests/JsonMapper/JsonMessageMapperTests.cs index 50facc4109..4b241ffe5b 100644 --- a/tests/Paramore.Brighter.Core.Tests/JsonMapper/JsonMessageMapperTests.cs +++ b/tests/Paramore.Brighter.Core.Tests/JsonMapper/JsonMessageMapperTests.cs @@ -1,135 +1,163 @@ -using System; +using System; using System.Net.Mime; using System.Text.Json; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.JsonMapper.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessageMappers; -using Xunit; namespace Paramore.Brighter.Core.Tests.JsonMapper; - public class JsonMessageMapperTests { - [Fact] - public void When_mapping_command_to_message() + [Test] + public async Task When_mapping_command_to_message() { var mapper = new JsonMessageMapper(); - var command = new MyCommand { Value = Guid.NewGuid().ToString() }; - var publication = new Publication { Topic = new RoutingKey(Guid.NewGuid().ToString()) }; - var message = mapper.MapToMessage(command, publication); - - Assert.NotNull(message); - Assert.Equal(new ContentType(MediaTypeNames.Application.Json), message.Header.ContentType); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - Assert.Equal(publication.Topic, message.Header.Topic); - Assert.Equal(message.Id, command.Id); - Assert.NotNull(message.Body); - + var command = new MyCommand + { + Value = Guid.NewGuid().ToString() + }; + var publication = new Publication + { + Topic = new RoutingKey(Guid.NewGuid().ToString()) + }; + var message = await mapper.MapToMessageAsync(command, publication); + await Assert.That(message).IsNotNull(); + await Assert.That(message.Header.ContentType).IsEqualTo(new ContentType(MediaTypeNames.Application.Json)); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(message.Header.Topic).IsEqualTo(publication.Topic); + await Assert.That(command.Id).IsEqualTo(message.Id); + await Assert.That(message.Body).IsNotNull(); var body = JsonSerializer.Deserialize(message.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(body); - Assert.Equal(command.Value, body.Value); + await Assert.That(body).IsNotNull(); + await Assert.That(body.Value).IsEqualTo(command.Value); } - [Fact] + [Test] public async Task When_mapping_command_to_message_async() { var mapper = new JsonMessageMapper(); - var command = new MyCommand { Value = Guid.NewGuid().ToString() }; - var publication = new Publication { Topic = new RoutingKey(Guid.NewGuid().ToString()) }; + var command = new MyCommand + { + Value = Guid.NewGuid().ToString() + }; + var publication = new Publication + { + Topic = new RoutingKey(Guid.NewGuid().ToString()) + }; var message = await mapper.MapToMessageAsync(command, publication); - - Assert.NotNull(message); - Assert.Equal(new ContentType(MediaTypeNames.Application.Json), message.Header.ContentType); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - Assert.Equal(publication.Topic, message.Header.Topic); - Assert.Equal(message.Id, command.Id); - Assert.NotNull(message.Body); - + await Assert.That(message).IsNotNull(); + await Assert.That(message.Header.ContentType).IsEqualTo(new ContentType(MediaTypeNames.Application.Json)); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(message.Header.Topic).IsEqualTo(publication.Topic); + await Assert.That(command.Id).IsEqualTo(message.Id); + await Assert.That(message.Body).IsNotNull(); var body = JsonSerializer.Deserialize(message.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(body); - Assert.Equal(command.Value, body.Value); + await Assert.That(body).IsNotNull(); + await Assert.That(body.Value).IsEqualTo(command.Value); } - [Fact] - public void When_mapping_event_to_message() + [Test] + public async Task When_mapping_event_to_message() { var mapper = new JsonMessageMapper(); - var @event = new MyEvent { Value = Guid.NewGuid().ToString() }; - var publication = new Publication { Topic = new RoutingKey(Guid.NewGuid().ToString()) }; - var message = mapper.MapToMessage(@event, publication); - - Assert.NotNull(message); - Assert.Equal(new ContentType(MediaTypeNames.Application.Json), message.Header.ContentType); - Assert.Equal(MessageType.MT_EVENT, message.Header.MessageType); - Assert.Equal(publication.Topic, message.Header.Topic); - Assert.Equal(message.Id, @event.Id); - Assert.NotNull(message.Body); - + var @event = new MyEvent + { + Value = Guid.NewGuid().ToString() + }; + var publication = new Publication + { + Topic = new RoutingKey(Guid.NewGuid().ToString()) + }; + var message = await mapper.MapToMessageAsync(@event, publication); + await Assert.That(message).IsNotNull(); + await Assert.That(message.Header.ContentType).IsEqualTo(new ContentType(MediaTypeNames.Application.Json)); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_EVENT); + await Assert.That(message.Header.Topic).IsEqualTo(publication.Topic); + await Assert.That(@event.Id).IsEqualTo(message.Id); + await Assert.That(message.Body).IsNotNull(); var body = JsonSerializer.Deserialize(message.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(body); - Assert.Equal(@event.Value, body.Value); + await Assert.That(body).IsNotNull(); + await Assert.That(body.Value).IsEqualTo(@event.Value); } - [Fact] + [Test] public async Task When_mapping_event_to_message_async() { var mapper = new JsonMessageMapper(); - var @event = new MyEvent { Value = Guid.NewGuid().ToString() }; - var publication = new Publication { Topic = new RoutingKey(Guid.NewGuid().ToString()) }; + var @event = new MyEvent + { + Value = Guid.NewGuid().ToString() + }; + var publication = new Publication + { + Topic = new RoutingKey(Guid.NewGuid().ToString()) + }; var message = await mapper.MapToMessageAsync(@event, publication); - - Assert.NotNull(message); - Assert.Equal(new ContentType(MediaTypeNames.Application.Json), message.Header.ContentType); - Assert.Equal(MessageType.MT_EVENT, message.Header.MessageType); - Assert.Equal(publication.Topic, message.Header.Topic); - Assert.Equal(message.Id, @event.Id); - Assert.NotNull(message.Body); - + await Assert.That(message).IsNotNull(); + await Assert.That(message.Header.ContentType).IsEqualTo(new ContentType(MediaTypeNames.Application.Json)); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_EVENT); + await Assert.That(message.Header.Topic).IsEqualTo(publication.Topic); + await Assert.That(@event.Id).IsEqualTo(message.Id); + await Assert.That(message.Body).IsNotNull(); var body = JsonSerializer.Deserialize(message.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(body); - Assert.Equal(@event.Value, body.Value); + await Assert.That(body).IsNotNull(); + await Assert.That(body.Value).IsEqualTo(@event.Value); } - [Fact] - public void When_mapping_request_to_message_should_throw_ArgumentNullException() + [Test] + public async Task When_mapping_request_to_message_should_throw_ArgumentNullException() { var mapper = new JsonMessageMapper(); - var request = new MyRequest { Value = Guid.NewGuid().ToString() }; - var publication = new Publication { Topic = new RoutingKey(Guid.NewGuid().ToString()) }; - - Assert.Throws(() => mapper.MapToMessage(request, publication)); + var request = new MyRequest + { + Value = Guid.NewGuid().ToString() + }; + var publication = new Publication + { + Topic = new RoutingKey(Guid.NewGuid().ToString()) + }; + await Assert.That(() => mapper.MapToMessage(request, publication)).ThrowsExactly(); } - [Fact] + [Test] public async Task When_mapping_request_to_message_should_throw_ArgumentNullException_async() { var mapper = new JsonMessageMapper(); - var request = new MyRequest { Value = Guid.NewGuid().ToString() }; - var publication = new Publication { Topic = new RoutingKey(Guid.NewGuid().ToString()) }; - - await Assert.ThrowsAsync(() => mapper.MapToMessageAsync(request, publication)); + var request = new MyRequest + { + Value = Guid.NewGuid().ToString() + }; + var publication = new Publication + { + Topic = new RoutingKey(Guid.NewGuid().ToString()) + }; + await Assert.That(() => mapper.MapToMessageAsync(request, publication)).ThrowsExactly(); } - [Fact] - public void When_mapping_message_to_command() + [Test] + public async Task When_mapping_message_to_command() { - var command = new MyCommand { Value = Guid.NewGuid().ToString() }; + var command = new MyCommand + { + Value = Guid.NewGuid().ToString() + }; var mapper = new JsonMessageMapper(); - - var request = mapper.MapToRequest(new Message(new MessageHeader(), new MessageBody(JsonSerializer.Serialize(command)))); - Assert.NotNull(request); - Assert.Equal(command.Value, request.Value); + var request = await mapper.MapToRequestAsync(new Message(new MessageHeader(), new MessageBody(JsonSerializer.Serialize(command)))); + await Assert.That(request).IsNotNull(); + await Assert.That(request.Value).IsEqualTo(command.Value); } - - [Fact] - public async Task When_mapping_message_to_command_async () + + [Test] + public async Task When_mapping_message_to_command_async() { - var command = new MyCommand { Value = Guid.NewGuid().ToString() }; + var command = new MyCommand + { + Value = Guid.NewGuid().ToString() + }; var mapper = new JsonMessageMapper(); - var request = await mapper.MapToRequestAsync(new Message(new MessageHeader(), new MessageBody(JsonSerializer.Serialize(command)))); - Assert.NotNull(request); - Assert.Equal(command.Value, request.Value); + await Assert.That(request).IsNotNull(); + await Assert.That(request.Value).IsEqualTo(command.Value); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Locking/When_Lock_Is_Called_It_Can_Only_Be_Obtained_Once.cs b/tests/Paramore.Brighter.Core.Tests/Locking/When_Lock_Is_Called_It_Can_Only_Be_Obtained_Once.cs index a6a9fdbcc6..03ca81ca4c 100644 --- a/tests/Paramore.Brighter.Core.Tests/Locking/When_Lock_Is_Called_It_Can_Only_Be_Obtained_Once.cs +++ b/tests/Paramore.Brighter.Core.Tests/Locking/When_Lock_Is_Called_It_Can_Only_Be_Obtained_Once.cs @@ -1,39 +1,31 @@ using System; using System.Threading; using System.Threading.Tasks; -using Xunit; namespace Paramore.Brighter.Core.Tests.Locking; - public class InMemoryLockingProviderTests { private IDistributedLock _locking = new InMemoryLock(); - - - [Fact] + [Test] public async Task WhenLockIsCalled_ItCanOnlyBeObtainedOnce() { var resourceName = $"TestLock-{Guid.NewGuid()}"; - var firstLock = await _locking.ObtainLockAsync(resourceName, CancellationToken.None); - var secondLock = await _locking.ObtainLockAsync(resourceName, CancellationToken.None); - - Assert.NotNull(firstLock); - Assert.Null(secondLock); + var secondLock = await _locking.ObtainLockAsync(resourceName, CancellationToken.None); + await Assert.That(firstLock).IsNotNull(); + await Assert.That(secondLock).IsNull(); } - - [Fact] + + [Test] public async Task GivenAnInMemoryLockingProvider_WhenReleaseLockIsCalled_ItCanOnlyBeLockedAgain() { var resourceName = $"TestLock-{Guid.NewGuid()}"; - var firstLock = await _locking.ObtainLockAsync(resourceName, CancellationToken.None); await _locking.ReleaseLockAsync(resourceName, firstLock, CancellationToken.None); - var secondLock = await _locking.ObtainLockAsync(resourceName, CancellationToken.None); - var thirdLock = await _locking.ObtainLockAsync(resourceName, CancellationToken.None); - - Assert.NotNull(firstLock); - Assert.NotNull(secondLock); - Assert.Null(thirdLock); + var secondLock = await _locking.ObtainLockAsync(resourceName, CancellationToken.None); + var thirdLock = await _locking.ObtainLockAsync(resourceName, CancellationToken.None); + await Assert.That(firstLock).IsNotNull(); + await Assert.That(secondLock).IsNotNull(); + await Assert.That(thirdLock).IsNull(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Logging/When_A_Request_Logger_Is_In_The_Pipeline.cs b/tests/Paramore.Brighter.Core.Tests/Logging/When_A_Request_Logger_Is_In_The_Pipeline.cs index 4230a6fbc7..521297c673 100644 --- a/tests/Paramore.Brighter.Core.Tests/Logging/When_A_Request_Logger_Is_In_The_Pipeline.cs +++ b/tests/Paramore.Brighter.Core.Tests/Logging/When_A_Request_Logger_Is_In_The_Pipeline.cs @@ -1,5 +1,6 @@ -using System; +using System; using System.Linq; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.Logging.TestDoubles; @@ -8,49 +9,30 @@ using Polly.Registry; using Serilog; using Serilog.Sinks.TestCorrelator; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Core.Tests.Logging { public class CommandProcessorWithLoggingInPipelineTests { - private readonly ITestOutputHelper _output; - - public CommandProcessorWithLoggingInPipelineTests(ITestOutputHelper output) - { - _output = output; - } - //TODO: Because we use a global logger with Serilog, this won't run in parallel - //[Fact] - public void When_A_Request_Logger_Is_In_The_Pipeline() + //[Test] + public async Task When_A_Request_Logger_Is_In_The_Pipeline() { Log.Logger = new LoggerConfiguration().MinimumLevel.Information().WriteTo.TestCorrelator().CreateLogger(); using var context = TestCorrelator.CreateContext(); var myCommand = new MyCommand(); - var registry = new SubscriberRegistry(); registry.Register>(); - var requestLogger = new RequestLoggingHandler(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient(typeof(RequestLoggingHandler), provider => requestLogger); - var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - var commandProcessor = new CommandProcessor(registry, handlerFactory: handlerFactory, - new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory()); - - + var commandProcessor = new CommandProcessor(registry, handlerFactory: handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); commandProcessor.Send(myCommand); - var logEvents = TestCorrelator.GetLogEventsFromContextId(context.Id); - Assert.Contains(logEvents, x => x.MessageTemplate.Text.StartsWith("Logging handler pipeline call")); - Assert.Equal($"\"{typeof(MyCommand)}\"", logEvents.First(x => x.MessageTemplate.Text.StartsWith("Logging handler pipeline call")).Properties["1"].ToString()); + await Assert.That(logEvents).Contains(x => x.MessageTemplate.Text.StartsWith("Logging handler pipeline call")); + await Assert.That(logEvents.First(x => x.MessageTemplate.Text.StartsWith("Logging handler pipeline call")).Properties["1"].ToString()).IsEqualTo($"\"{typeof(MyCommand)}\""); } } } diff --git a/tests/Paramore.Brighter.Core.Tests/Logging/When_A_Request_Logger_Is_In_The_Pipeline_Async.cs b/tests/Paramore.Brighter.Core.Tests/Logging/When_A_Request_Logger_Is_In_The_Pipeline_Async.cs index c0847c061a..05ef66f890 100644 --- a/tests/Paramore.Brighter.Core.Tests/Logging/When_A_Request_Logger_Is_In_The_Pipeline_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Logging/When_A_Request_Logger_Is_In_The_Pipeline_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -9,48 +9,29 @@ using Polly.Registry; using Serilog; using Serilog.Sinks.TestCorrelator; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Core.Tests.Logging { public class CommandProcessorWithLoggingInPipelineAsyncTests { - - private readonly ITestOutputHelper _output; - - public CommandProcessorWithLoggingInPipelineAsyncTests(ITestOutputHelper output) - { - _output = output; - } - //TODO: Because we use a global logger with Serilog, this won't run in parallel - //[Fact] + //[Test] public async Task When_A_Request_Logger_Is_In_The_Pipeline_Async() { Log.Logger = new LoggerConfiguration().MinimumLevel.Information().WriteTo.TestCorrelator().CreateLogger(); using var context = TestCorrelator.CreateContext(); var myCommand = new MyCommand(); - var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient(typeof(RequestLoggingHandlerAsync<>), typeof(RequestLoggingHandlerAsync<>)); - var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - var commandProcessor = new CommandProcessor(registry, handlerFactory, - new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory()); - + var commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); await commandProcessor.SendAsync(myCommand); - - var logEvents = TestCorrelator.GetLogEventsFromContextId(context.Id); - Assert.Contains(logEvents, x => x.MessageTemplate.Text.StartsWith("Logging handler pipeline call")); - Assert.Equal($"\"{typeof(MyCommand)}\"", logEvents.First(x => x.MessageTemplate.Text.StartsWith("Logging handler pipeline call")).Properties["1"].ToString()); + await Assert.That(logEvents).Contains(x => x.MessageTemplate.Text.StartsWith("Logging handler pipeline call")); + await Assert.That(logEvents.First(x => x.MessageTemplate.Text.StartsWith("Logging handler pipeline call")).Properties["1"].ToString()).IsEqualTo($"\"{typeof(MyCommand)}\""); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_channel_failure_exception_is_thrown_for_command_should_retry_until_connection_re_established_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_channel_failure_exception_is_thrown_for_command_should_retry_until_connection_re_established_async.cs index 9cd554bada..3d1f79473f 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_channel_failure_exception_is_thrown_for_command_should_retry_until_connection_re_established_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_channel_failure_exception_is_thrown_for_command_should_retry_until_connection_re_established_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Text.Json; using Microsoft.Extensions.Time.Testing; @@ -7,7 +7,6 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { @@ -19,56 +18,40 @@ public class MessagePumpRetryCommandOnConnectionFailureTestsAsync private readonly FakeTimeProvider _timeProvider = new(); private readonly IAmAMessagePump _messagePump; private readonly SpyCommandProcessor _commandProcessor; - public MessagePumpRetryCommandOnConnectionFailureTestsAsync() { _commandProcessor = new SpyCommandProcessor(); - var channel = new FailingChannelAsync( - new ChannelName(ChannelName), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), - 2) + var channel = new FailingChannelAsync(new ChannelName(ChannelName), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), 2) { NumberOfRetries = 1 }; - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyCommandMessageMapperAsync())); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyCommandMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - _messagePump = new ServiceActivator.Proactor(_commandProcessor, (message) => typeof(MyCommand), - messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), channel) + _messagePump = new ServiceActivator.Proactor(_commandProcessor, (message) => typeof(MyCommand), messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), channel) { - Channel = channel, TimeOut = TimeSpan.FromMilliseconds(500), RequeueCount = -1 + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(500), + RequeueCount = -1 }; - var command = new MyCommand(); - //two command, will be received when subscription restored - var message1 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(command, JsonSerialisationOptions.Options)) - ); - var message2 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(command, JsonSerialisationOptions.Options)) - ); + var message1 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))); + var message2 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))); channel.Enqueue(message1); channel.Enqueue(message2); - //end the pump var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); channel.Enqueue(quitMessage); - } - [Fact] - public void When_A_Channel_Failure_Exception_Is_Thrown_For_Command_Should_Retry_Until_Connection_Re_established() + [Test] + public async Task When_A_Channel_Failure_Exception_Is_Thrown_For_Command_Should_Retry_Until_Connection_Re_established() { _messagePump.Run(); - //Should send the message via the command processor - Assert.Equal(2, _commandProcessor.Commands.Count); - Assert.Equal(CommandType.SendAsync, _commandProcessor.Commands[0]); - Assert.Equal(CommandType.SendAsync, _commandProcessor.Commands[1]); + await Assert.That(_commandProcessor.Commands.Count).IsEqualTo(2); + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.SendAsync); + await Assert.That(_commandProcessor.Commands[1]).IsEqualTo(CommandType.SendAsync); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_channel_failure_exception_is_thrown_for_event_should_retry_until_connection_re_established_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_channel_failure_exception_is_thrown_for_event_should_retry_until_connection_re_established_async.cs index 5908fc22e7..950cbc1f68 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_channel_failure_exception_is_thrown_for_event_should_retry_until_connection_re_established_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_channel_failure_exception_is_thrown_for_event_should_retry_until_connection_re_established_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Text.Json; using Microsoft.Extensions.Time.Testing; @@ -7,7 +7,6 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { @@ -18,60 +17,40 @@ public class MessagePumpRetryEventConnectionFailureTestsAsync private readonly FakeTimeProvider _timeProvider = new(); private readonly IAmAMessagePump _messagePump; private readonly SpyCommandProcessor _commandProcessor; - public MessagePumpRetryEventConnectionFailureTestsAsync() { _commandProcessor = new SpyCommandProcessor(); - var channel = new FailingChannelAsync( - new ChannelName("myChannel"), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), - 2) + var channel = new FailingChannelAsync(new ChannelName("myChannel"), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), 2) { NumberOfRetries = 1 }; - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor(_commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), channel) + _messagePump = new ServiceActivator.Proactor(_commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), channel) { - Channel = channel, TimeOut = TimeSpan.FromMilliseconds(500), RequeueCount = -1 + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(500), + RequeueCount = -1 }; - var @event = new MyEvent(); - //Two events will be received when channel fixed - var message1 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options)) - ); - var message2 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options)) - ); + var message1 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); + var message2 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); channel.Enqueue(message1); channel.Enqueue(message2); - //Quit the message pump var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); channel.Enqueue(quitMessage); - } - [Fact] - public void When_A_Channel_Failure_Exception_Is_Thrown_For_Event_Should_Retry_Until_Connection_Re_established() + [Test] + public async Task When_A_Channel_Failure_Exception_Is_Thrown_For_Event_Should_Retry_Until_Connection_Re_established() { _messagePump.Run(); - //Should publish the message via the command processor - Assert.Equal(2, _commandProcessor.Commands.Count); - Assert.Equal(CommandType.PublishAsync, _commandProcessor.Commands[0]); - Assert.Equal(CommandType.PublishAsync, _commandProcessor.Commands[1]); - + await Assert.That(_commandProcessor.Commands.Count).IsEqualTo(2); + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.PublishAsync); + await Assert.That(_commandProcessor.Commands[1]).IsEqualTo(CommandType.PublishAsync); } - } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_command_handler_throws_a_defer_message_Then_message_is_requeued_until_rejected_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_command_handler_throws_a_defer_message_Then_message_is_requeued_until_rejected_async.cs index fce27512a1..f3b19a6fdd 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_command_handler_throws_a_defer_message_Then_message_is_requeued_until_rejected_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_command_handler_throws_a_defer_message_Then_message_is_requeued_until_rejected_async.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright � 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the �Software�), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED �AS IS�, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -30,7 +28,6 @@ THE SOFTWARE. */ using Paramore.Brighter.Testing; using Paramore.Brighter.Observability; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { @@ -44,45 +41,38 @@ public class MessagePumpCommandProcessingDeferMessageActionTestsAsync private readonly InternalBus _bus = new(); private readonly RoutingKey _routingKey = new(Topic); private readonly FakeTimeProvider _timeProvider = new(); - + private readonly MessageMapperRegistry _messageMapperRegistry; public MessagePumpCommandProcessingDeferMessageActionTestsAsync() { SpyRequeueCommandProcessor commandProcessor = new(); - - _channel = new ChannelAsync(new(ChannelName),_routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyCommandMessageMapperAsync())); - messageMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyCommand), messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) + _channel = new ChannelAsync(new(ChannelName), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + _messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyCommandMessageMapperAsync())); + _messageMapperRegistry.RegisterAsync(); + _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyCommand), _messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) { - Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = _requeueCount + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = _requeueCount }; + } - var msg = new TransformPipelineBuilderAsync(messageMapperRegistry, null, InstrumentationOptions.All) - .BuildWrapPipeline() - .WrapAsync(new MyCommand(), new RequestContext(), new Publication{Topic = _routingKey}) - .Result; + [Before(Test)] + public async Task Setup() + { + var msg = await new TransformPipelineBuilderAsync(_messageMapperRegistry, null, InstrumentationOptions.All).BuildWrapPipeline().WrapAsync(new MyCommand(), new RequestContext(), new Publication { Topic = _routingKey }); _bus.Enqueue(msg); - } - [Fact] + [Test] public async Task When_a_command_handler_throws_a_defer_message_Then_message_is_requeued_until_rejectedAsync() { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); await Task.Delay(1000); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); _channel.Enqueue(quitMessage); - await Task.WhenAll(task); - - Assert.Empty(_bus.Stream(_routingKey)); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_command_handler_throws_a_defer_message_with_delay_Then_message_is_requeued_with_delay.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_command_handler_throws_a_defer_message_with_delay_Then_message_is_requeued_with_delay.cs index fb493fc9d5..a7b956ba38 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_command_handler_throws_a_defer_message_with_delay_Then_message_is_requeued_with_delay.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_command_handler_throws_a_defer_message_with_delay_Then_message_is_requeued_with_delay.cs @@ -19,9 +19,7 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Collections.Generic; using System.Threading; @@ -32,7 +30,6 @@ THE SOFTWARE. */ using Paramore.Brighter.Testing; using Paramore.Brighter.Observability; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { @@ -41,8 +38,7 @@ public class MessagePumpCommandProcessingDeferMessageActionWithDelayTestsAsync private const string Topic = "MyCommand"; private const string ChannelName = "myChannel"; private readonly RoutingKey _routingKey = new(Topic); - - [Fact] + [Test] public async Task When_a_command_handler_throws_a_defer_message_with_delay_Then_message_is_requeued_with_that_delay() { //Arrange @@ -50,59 +46,40 @@ public async Task When_a_command_handler_throws_a_defer_message_with_delay_Then_ var timeProvider = new FakeTimeProvider(); var consumer = new InMemoryMessageConsumer(_routingKey, bus, timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)); var spyChannel = new SpyChannelAsync(new ChannelName(ChannelName), _routingKey, consumer); - var commandProcessor = new SpyRequeueWithDelayCommandProcessor(delayMilliseconds: 5000); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyCommandMessageMapperAsync())); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyCommandMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - var messagePump = new ServiceActivator.Proactor( - commandProcessor, - (message) => typeof(MyCommand), - messageMapperRegistry, - null, - new InMemoryRequestContextFactory(), - spyChannel) + var messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyCommand), messageMapperRegistry, null, new InMemoryRequestContextFactory(), spyChannel) { Channel = spyChannel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = 5, RequeueDelay = TimeSpan.FromMilliseconds(100) // Subscription default — should NOT be used when DeferMessageAction has a delay }; - - var msg = new TransformPipelineBuilderAsync(messageMapperRegistry, null, InstrumentationOptions.All) - .BuildWrapPipeline() - .WrapAsync(new MyCommand(), new RequestContext(), new Publication { Topic = _routingKey }) - .Result; + var msg = await new TransformPipelineBuilderAsync(messageMapperRegistry, null, InstrumentationOptions.All).BuildWrapPipeline().WrapAsync(new MyCommand(), new RequestContext(), new Publication { Topic = _routingKey }); bus.Enqueue(msg); - //Act var task = Task.Factory.StartNew(() => messagePump.Run(), TaskCreationOptions.LongRunning); await Task.Delay(1000); - timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); spyChannel.Enqueue(quitMessage); - await Task.WhenAll(task); - //Assert - Assert.NotEmpty(spyChannel.RequeueDelays); // At least one requeue occurred - Assert.Equal(TimeSpan.FromMilliseconds(5000), spyChannel.RequeueDelays[0]); // Delay from DeferMessageAction, not subscription RequeueDelay (100ms) + await Assert.That(spyChannel.RequeueDelays).IsNotEmpty(); // At least one requeue occurred + await Assert.That(spyChannel.RequeueDelays[0]).IsEqualTo(TimeSpan.FromMilliseconds(5000)); // Delay from DeferMessageAction, not subscription RequeueDelay (100ms) } /// /// Spy channel that captures the delay passed to RequeueAsync for test verification. /// - private class SpyChannelAsync : Brighter.ChannelAsync + private class SpyChannelAsync : Paramore.Brighter.ChannelAsync, Paramore.Brighter.IAmAChannelAsync, Paramore.Brighter.IAmAChannel, System.IDisposable, System.IAsyncDisposable { public List RequeueDelays { get; } = []; - public SpyChannelAsync(ChannelName channelName, RoutingKey routingKey, IAmAMessageConsumerAsync consumer) - : base(channelName, routingKey, consumer) { } + public SpyChannelAsync(ChannelName channelName, RoutingKey routingKey, IAmAMessageConsumerAsync consumer) : base(channelName, routingKey, consumer) + { + } public override Task RequeueAsync(Message message, TimeSpan? timeOut = null, CancellationToken cancellationToken = default) { @@ -112,4 +89,4 @@ public override Task RequeueAsync(Message message, TimeSpan? timeOut = nul } } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_command_handler_throws_unhandled_exception_Then_message_is_acked_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_command_handler_throws_unhandled_exception_Then_message_is_acked_async.cs index fd42cf3c2b..6f91c2bdb1 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_command_handler_throws_unhandled_exception_Then_message_is_acked_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_command_handler_throws_unhandled_exception_Then_message_is_acked_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -9,7 +9,6 @@ using Paramore.Brighter.ServiceActivator; using Serilog.Events; using Serilog.Sinks.TestCorrelator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { @@ -20,57 +19,45 @@ public class MessagePumpCommandProcessingExceptionTestsAsync private readonly int _requeueCount = 5; private readonly RoutingKey _routingKey = new("MyCommand"); private readonly FakeTimeProvider _timeProvider = new(); - + private readonly InternalBus _bus; + private readonly MessageMapperRegistry _messageMapperRegistry; public MessagePumpCommandProcessingExceptionTestsAsync() { SpyExceptionCommandProcessor commandProcessor = new(); - - InternalBus bus = new(); - - _channel = new ChannelAsync(new("myChannel"),_routingKey, new InMemoryMessageConsumer(_routingKey, bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyCommandMessageMapperAsync())); - messageMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyCommand), - messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), _channel - ) + _bus = new InternalBus(); + _channel = new ChannelAsync(new("myChannel"), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + _messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyCommandMessageMapperAsync())); + _messageMapperRegistry.RegisterAsync(); + _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyCommand), _messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), _channel) { - Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = _requeueCount + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = _requeueCount }; + } - var msg = new TransformPipelineBuilderAsync(messageMapperRegistry, null, InstrumentationOptions.All) - .BuildWrapPipeline() - .WrapAsync(new MyCommand(), new RequestContext(), new Publication{Topic = _routingKey}) - .Result; - bus.Enqueue(msg); - + [Before(Test)] + public async Task Setup() + { + var msg = await new TransformPipelineBuilderAsync(_messageMapperRegistry, null, InstrumentationOptions.All).BuildWrapPipeline().WrapAsync(new MyCommand(), new RequestContext(), new Publication { Topic = _routingKey }); + _bus.Enqueue(msg); } - [Fact] + [Test] public async Task When_a_command_handler_throws_unhandled_exception_Then_message_is_acked_async() { using (TestCorrelator.CreateContext()) { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); await Task.Delay(1000); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - - var quitMessage = new Message(new MessageHeader(string.Empty, RoutingKey.Empty, MessageType.MT_QUIT), - new MessageBody("")); + var quitMessage = new Message(new MessageHeader(string.Empty, RoutingKey.Empty, MessageType.MT_QUIT), new MessageBody("")); _channel.Enqueue(quitMessage); - await Task.WhenAll(task); - var logEvents = TestCorrelator.GetLogEventsFromCurrentContext(); - Assert.Contains(logEvents, x => x.Level == LogEventLevel.Error); - Assert.Equal( - "MessagePump: Failed to dispatch message '{Id}' from {ChannelName} with {RoutingKey} on thread # {ManagementThreadId}", - logEvents.First(x => x.Level == LogEventLevel.Error).MessageTemplate.Text); + await Assert.That(logEvents).Contains(x => x.Level == LogEventLevel.Error); + await Assert.That(logEvents.First(x => x.Level == LogEventLevel.Error).MessageTemplate.Text).IsEqualTo("MessagePump: Failed to dispatch message '{Id}' from {ChannelName} with {RoutingKey} on thread # {ManagementThreadId}"); } } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_handler_throws_dont_ack_action_should_nack_the_message_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_handler_throws_dont_ack_action_should_nack_the_message_async.cs index e3a987b36a..c66ae7eadc 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_handler_throws_dont_ack_action_should_nack_the_message_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_handler_throws_dont_ack_action_should_nack_the_message_async.cs @@ -7,7 +7,6 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.Testing; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { @@ -20,28 +19,13 @@ public class MessagePumpCommandDontAckActionNackTestsAsync private readonly IAmAMessagePump _messagePump; private readonly ChannelAsync _channel; private readonly SpyDontAckCommandProcessor _commandProcessor; - public MessagePumpCommandDontAckActionNackTestsAsync() { _commandProcessor = new SpyDontAckCommandProcessor(); - _channel = new ChannelAsync( - new(ChannelName), - _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyCommandMessageMapperAsync())); + _channel = new ChannelAsync(new(ChannelName), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyCommandMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor( - _commandProcessor, - (message) => typeof(MyCommand), - messageMapperRegistry, - new EmptyMessageTransformerFactoryAsync(), - new InMemoryRequestContextFactory(), - _channel) + _messagePump = new ServiceActivator.Proactor(_commandProcessor, (message) => typeof(MyCommand), messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), _channel) { Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), @@ -49,40 +33,30 @@ public MessagePumpCommandDontAckActionNackTestsAsync() UnacceptableMessageLimit = -1, DontAckDelay = TimeSpan.FromMilliseconds(100) }; - // Arrange: enqueue one command message to the bus (not channel) // so InMemoryMessageConsumer.Receive locks it in _lockedMessages, // enabling nack to re-enqueue it back to the bus - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(new MyCommand(), JsonSerialisationOptions.Options)) - ); + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(new MyCommand(), JsonSerialisationOptions.Options))); _bus.Enqueue(message); } - [Fact] + [Test] public async Task When_A_Handler_Throws_DontAck_Action_Should_Nack_The_Message_Async() { // Act: run pump in background var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); - // Wait for handler to process the message (DontAckAction thrown) - var handled = _commandProcessor.WaitForHandle(5000); - Assert.True(handled, "Handler should have been called"); - + var handled = await _commandProcessor.WaitForHandleAsync(5000); + await Assert.That(handled).IsTrue(); // Send quit to stop the pump after DontAckAction processing _channel.Enqueue(MessageFactory.CreateQuitMessage(_routingKey)); - await Task.WhenAll(task); - // Assert: handler was called - Assert.True(_commandProcessor.SendCount >= 1); - + await Assert.That(_commandProcessor.SendCount >= 1).IsTrue(); // Assert: pump continued running and processed the quit message - Assert.Equal(MessagePumpStatus.MP_STOPPED, _messagePump.Status); - + await Assert.That(_messagePump.Status).IsEqualTo(MessagePumpStatus.MP_STOPPED); // Assert: message was nacked (re-enqueued to bus, available for redelivery) - Assert.NotEmpty(_bus.Stream(_routingKey)); + await Assert.That(_bus.Stream(_routingKey)).IsNotEmpty(); } } } diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_handler_throws_dont_ack_action_should_not_acknowledge_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_handler_throws_dont_ack_action_should_not_acknowledge_async.cs index 283b572b76..5f43a6fd11 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_handler_throws_dont_ack_action_should_not_acknowledge_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_handler_throws_dont_ack_action_should_not_acknowledge_async.cs @@ -7,7 +7,6 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.Testing; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { @@ -20,28 +19,13 @@ public class MessagePumpCommandDontAckActionTestsAsync private readonly IAmAMessagePump _messagePump; private readonly SpyDontAckCommandProcessor _commandProcessor; private readonly ChannelAsync _channel; - public MessagePumpCommandDontAckActionTestsAsync() { _commandProcessor = new SpyDontAckCommandProcessor(); - _channel = new ChannelAsync( - new(ChannelName), - _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyCommandMessageMapperAsync())); + _channel = new ChannelAsync(new(ChannelName), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyCommandMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor( - _commandProcessor, - (message) => typeof(MyCommand), - messageMapperRegistry, - new EmptyMessageTransformerFactoryAsync(), - new InMemoryRequestContextFactory(), - _channel) + _messagePump = new ServiceActivator.Proactor(_commandProcessor, (message) => typeof(MyCommand), messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), _channel) { Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), @@ -49,27 +33,21 @@ public MessagePumpCommandDontAckActionTestsAsync() UnacceptableMessageLimit = 0, DontAckDelay = TimeSpan.Zero }; - // Arrange: enqueue the message to the BUS (not the channel's internal queue) // so that InMemoryMessageConsumer.Receive locks it in _lockedMessages. // This is essential for testing ack/no-ack behavior via the ack timeout mechanism. - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(new MyCommand(), JsonSerialisationOptions.Options)) - ); + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(new MyCommand(), JsonSerialisationOptions.Options))); _bus.Enqueue(message); } - [Fact] + [Test] public async Task When_A_Handler_Throws_DontAck_Action_Should_Not_Acknowledge_Async() { // Act: run the pump in the background var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); - // Wait for the handler to be invoked (first delivery) - Assert.True(_commandProcessor.WaitForHandle(), "Handler was not invoked within timeout"); - Assert.Equal(1, _commandProcessor.SendCount); - + await Assert.That(await _commandProcessor.WaitForHandleAsync()).IsTrue(); + await Assert.That(_commandProcessor.SendCount).IsEqualTo(1); // Advance time past the ack timeout to trigger requeue of unacknowledged messages. // The message was received via InMemoryMessageConsumer.Receive which locks it in _lockedMessages. // If the message was NOT acknowledged (DontAckAction handler with continue), @@ -77,18 +55,13 @@ public async Task When_A_Handler_Throws_DontAck_Action_Should_Not_Acknowledge_As // If the message WAS acknowledged (generic Exception handler without continue), // it was removed from _lockedMessages and no requeue occurs. _timeProvider.Advance(TimeSpan.FromSeconds(2)); - // Wait for the handler to be invoked again (re-delivery of unacknowledged message) - Assert.True(_commandProcessor.WaitForHandle(), "Re-delivery did not occur - message may have been acknowledged"); - + await Assert.That(await _commandProcessor.WaitForHandleAsync()).IsTrue(); // Assert: handler was called at least twice (original delivery + re-delivery) // This proves the message was NOT acknowledged by the DontAckAction handler - Assert.True(_commandProcessor.SendCount >= 2, - $"Expected at least 2 sends (original + re-delivery), but got {_commandProcessor.SendCount}"); - + await Assert.That(_commandProcessor.SendCount >= 2).IsTrue(); // Clean up: send quit so pump can exit _channel.Enqueue(MessageFactory.CreateQuitMessage(_routingKey)); - // Let the pump finish await Task.WhenAll(task); } diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_Is_asked_to_connect_a_channel_and_handler_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_Is_asked_to_connect_a_channel_and_handler_async.cs index bbca8eec56..e50a760932 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_Is_asked_to_connect_a_channel_and_handler_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_Is_asked_to_connect_a_channel_and_handler_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -6,12 +6,10 @@ using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { - - public class MessageDispatcherRoutingAsyncTests : IDisposable + public class MessageDispatcherRoutingAsyncTests { private const string ChannelName = "myChannel"; private const string Topic = "myTopic"; @@ -20,65 +18,45 @@ public class MessageDispatcherRoutingAsyncTests : IDisposable private readonly RoutingKey _routingKey = new(Topic); private readonly InternalBus _bus = new(); private readonly FakeTimeProvider _timeProvider = new(); - public MessageDispatcherRoutingAsyncTests() { _commandProcessor = new SpyCommandProcessor(); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync()) - ); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); + var subscription = new Subscription(new SubscriptionName("test"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), channelName: new ChannelName(ChannelName), routingKey: _routingKey, messagePumpType: MessagePumpType.Proactor); + _dispatcher = new Dispatcher(_commandProcessor, new List { subscription }, null, messageMapperRegistry, requestContextFactory: new InMemoryRequestContextFactory()); + } - var subscription = new Subscription( - new SubscriptionName("test"), - noOfPerformers: 1, - timeOut: TimeSpan.FromMilliseconds(1000), - channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), - channelName: new ChannelName(ChannelName), - routingKey: _routingKey, - messagePumpType: MessagePumpType.Proactor - ); - - _dispatcher = new Dispatcher( - _commandProcessor, - new List { subscription }, - null, - messageMapperRegistry, - requestContextFactory: new InMemoryRequestContextFactory() - ); - - var @event = new MyEvent {Data = 4}; - var message = new MyEventMessageMapperAsync().MapToMessageAsync(@event, new() { Topic = _routingKey }).Result; - + [Before(Test)] + public async Task Setup() + { + var @event = new MyEvent + { + Data = 4 + }; + var message = await new MyEventMessageMapperAsync().MapToMessageAsync(@event, new() { Topic = _routingKey }); _bus.Enqueue(message); - - Assert.Equal(DispatcherState.DS_AWAITING, _dispatcher.State); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_AWAITING); _dispatcher.Receive(); - } -#pragma warning disable xUnit1031 - - [Fact] + + [Test] public async Task When_a_message_dispatcher_is_asked_to_connect_a_channel_and_handler_async() { await Task.Delay(5000); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - await _dispatcher.End(); - - Assert.Equal(DispatcherState.DS_STOPPED, _dispatcher.State); - Assert.NotNull(_commandProcessor.Observe()); - Assert.Contains(CommandType.PublishAsync, _commandProcessor.Commands); - Assert.Empty(_bus.Stream(_routingKey)); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_STOPPED); + await Assert.That(_commandProcessor.Observe()).IsNotNull(); + await Assert.That(_commandProcessor.Commands).Contains(CommandType.PublishAsync); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); } - - public void Dispose() + + [After(Test)] + public async Task Dispose() { if (_dispatcher?.State == DispatcherState.DS_RUNNING) - _dispatcher.End().Wait(); + await _dispatcher.End(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_has_a_new_connection_added_while_running_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_has_a_new_connection_added_while_running_async.cs index cc50026ec2..36e3207272 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_has_a_new_connection_added_while_running_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_has_a_new_connection_added_while_running_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -6,75 +6,56 @@ using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { - public class DispatcherAddNewConnectionTestsAsync : IDisposable + public class DispatcherAddNewConnectionTestsAsync { private readonly Dispatcher _dispatcher; private readonly Subscription _newSubscription; private readonly InternalBus _bus; private readonly RoutingKey _routingKey = new("MyEvent"); private readonly RoutingKey _routingKeyTwo = new("OtherEvent"); - public DispatcherAddNewConnectionTestsAsync() { _bus = new InternalBus(); - IAmACommandProcessor commandProcessor = new SpyCommandProcessor(); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - Subscription subscription = new Subscription( - new SubscriptionName("test"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), - channelFactory: new InMemoryChannelFactory(_bus, TimeProvider.System), channelName: new ChannelName("fakeChannel"), - messagePumpType: MessagePumpType.Proactor, routingKey: _routingKey - ); - - _newSubscription = new Subscription( - new SubscriptionName("newTest"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), - channelFactory: new InMemoryChannelFactory(_bus, TimeProvider.System), - channelName: new ChannelName("fakeChannelTwo"), messagePumpType: MessagePumpType.Proactor, routingKey: _routingKeyTwo); + Subscription subscription = new Subscription(new SubscriptionName("test"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), channelFactory: new InMemoryChannelFactory(_bus, TimeProvider.System), channelName: new ChannelName("fakeChannel"), messagePumpType: MessagePumpType.Proactor, routingKey: _routingKey); + _newSubscription = new Subscription(new SubscriptionName("newTest"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), channelFactory: new InMemoryChannelFactory(_bus, TimeProvider.System), channelName: new ChannelName("fakeChannelTwo"), messagePumpType: MessagePumpType.Proactor, routingKey: _routingKeyTwo); _dispatcher = new Dispatcher(commandProcessor, new List { subscription }, messageMapperRegistryAsync: messageMapperRegistry); + } + [Before(Test)] + public async Task Setup() + { var @event = new MyEvent(); - var message = new MyEventMessageMapperAsync() - .MapToMessageAsync(@event, new Publication{Topic = _routingKey}) - .GetAwaiter() - .GetResult(); + var message = await new MyEventMessageMapperAsync().MapToMessageAsync(@event, new Publication { Topic = _routingKey }); _bus.Enqueue(message); - - Assert.Equal(DispatcherState.DS_AWAITING, _dispatcher.State); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_AWAITING); _dispatcher.Receive(); - } - [Fact] + [Test] public async Task When_A_Message_Dispatcher_Has_A_New_Connection_Added_While_Running() { _dispatcher.Open(_newSubscription); - var @event = new MyEvent(); - var message = await new MyEventMessageMapperAsync().MapToMessageAsync(@event, new Publication{Topic = _routingKeyTwo}); + var message = await new MyEventMessageMapperAsync().MapToMessageAsync(@event, new Publication { Topic = _routingKeyTwo }); _bus.Enqueue(message); - await Task.Delay(1000); - - - Assert.Empty(_bus.Stream(_routingKey)); - Assert.Equal(DispatcherState.DS_RUNNING, _dispatcher.State); - Assert.Equal(2, _dispatcher.Consumers.Count()); - Assert.Equal(2, _dispatcher.Subscriptions.Count()); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_RUNNING); + await Assert.That(_dispatcher.Consumers.Count()).IsEqualTo(2); + await Assert.That(_dispatcher.Subscriptions.Count()).IsEqualTo(2); } - public void Dispose() + [After(Test)] + public async Task Dispose() { if (_dispatcher?.State == DispatcherState.DS_RUNNING) - _dispatcher.End().Wait(); + await _dispatcher.End(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_restarts_a_connection.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_restarts_a_connection.cs index d8d7e958e2..0fc8d861ed 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_restarts_a_connection.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_restarts_a_connection.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -6,11 +6,10 @@ using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { - public class MessageDispatcherResetConnectionAsync : IDisposable + public class MessageDispatcherResetConnectionAsync { private readonly Dispatcher _dispatcher; private readonly Subscription _subscription; @@ -18,70 +17,51 @@ public class MessageDispatcherResetConnectionAsync : IDisposable private readonly InternalBus _bus = new(); private readonly RoutingKey _routingKey = new("myTopic"); private readonly FakeTimeProvider _timeProvider = new(); - public MessageDispatcherResetConnectionAsync() { IAmACommandProcessor commandProcessor = new SpyCommandProcessor(); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); + _subscription = new Subscription(new SubscriptionName("test"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), channelName: new ChannelName("myChannel"), messagePumpType: MessagePumpType.Proactor, routingKey: _routingKey); + _publication = new Publication + { + Topic = _subscription.RoutingKey, + RequestType = typeof(MyEvent) + }; + _dispatcher = new Dispatcher(commandProcessor, new List { _subscription }, messageMapperRegistryAsync: messageMapperRegistry); + } - _subscription = new Subscription( - new SubscriptionName("test"), - noOfPerformers: 1, - timeOut: TimeSpan.FromMilliseconds(1000), - channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), - channelName: new ChannelName("myChannel"), - messagePumpType: MessagePumpType.Proactor, - routingKey: _routingKey - ); - - _publication = new Publication{Topic = _subscription.RoutingKey, RequestType = typeof(MyEvent)}; - - _dispatcher = new Dispatcher(commandProcessor, new List { _subscription }, messageMapperRegistryAsync:messageMapperRegistry); - + [Before(Test)] + public async Task Setup() + { var @event = new MyEvent(); - var message = new MyEventMessageMapperAsync() - .MapToMessageAsync(@event, _publication) - .GetAwaiter() - .GetResult(); - + var message = await new MyEventMessageMapperAsync().MapToMessageAsync(@event, _publication); _bus.Enqueue(message); - - Assert.Equal(DispatcherState.DS_AWAITING, _dispatcher.State); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_AWAITING); _dispatcher.Receive(); - Task.Delay(1000).Wait(); + await Task.Delay(1000); _dispatcher.Shut(_subscription); - } - -#pragma warning disable xUnit1031 - [Fact] + + [Test] public async Task When_A_Message_Dispatcher_Restarts_A_Connection() { _dispatcher.Open(_subscription); - var @event = new MyEvent(); var message = await new MyEventMessageMapperAsync().MapToMessageAsync(@event, _publication); _bus.Enqueue(message); - await Task.Delay(1000); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - await _dispatcher.End(); - - Assert.Empty(_bus.Stream(_routingKey)); - Assert.Equal(DispatcherState.DS_STOPPED, _dispatcher.State); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_STOPPED); } -#pragma warning restore xUnit1031 - - public void Dispose() + + [After(Test)] + public async Task Dispose() { if (_dispatcher?.State == DispatcherState.DS_RUNNING) - _dispatcher.End().Wait(); + await _dispatcher.End(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_restarts_a_connection_after_all_connections_have_stopped_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_restarts_a_connection_after_all_connections_have_stopped_async.cs index f4d05a3ee4..dd7e0a45f9 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_restarts_a_connection_after_all_connections_have_stopped_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_restarts_a_connection_after_all_connections_have_stopped_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -7,11 +7,10 @@ using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { - public class DispatcherRestartConnectionTestsAsync : IDisposable + public class DispatcherRestartConnectionTestsAsync { private const string ChannelName = "fakeChannel"; private readonly Dispatcher _dispatcher; @@ -20,83 +19,57 @@ public class DispatcherRestartConnectionTestsAsync : IDisposable private readonly ChannelName _channelName = new(ChannelName); private readonly InternalBus _bus = new(); private readonly FakeTimeProvider _timeProvider = new(); - + private readonly Subscription _subscription; + private readonly Subscription _newSubscription; public DispatcherRestartConnectionTestsAsync() { IAmACommandProcessor commandProcessor = new SpyCommandProcessor(); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); + messageMapperRegistry.RegisterAsync(); + _subscription = new Subscription(new SubscriptionName("test"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(100), channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), channelName: _channelName, messagePumpType: MessagePumpType.Proactor, routingKey: _routingKey); + _newSubscription = new Subscription(new SubscriptionName("newTest"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(100), channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), channelName: _channelName, messagePumpType: MessagePumpType.Proactor, routingKey: _routingKey); + _publication = new Publication + { + Topic = _subscription.RoutingKey + }; + _dispatcher = new Dispatcher(commandProcessor, new List { _subscription, _newSubscription }, messageMapperRegistryAsync: messageMapperRegistry); + } - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); - messageMapperRegistry.RegisterAsync (); - - Subscription subscription = new Subscription( - new SubscriptionName("test"), - noOfPerformers: 1, - timeOut: TimeSpan.FromMilliseconds(100), - channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), - channelName: _channelName, - messagePumpType: MessagePumpType.Proactor, - routingKey: _routingKey - ); - - Subscription newSubscription = new Subscription( - new SubscriptionName("newTest"), - noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(100), - channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), - channelName: _channelName, - messagePumpType: MessagePumpType.Proactor, - routingKey: _routingKey - ); - - _publication = new Publication{Topic = subscription.RoutingKey}; - - _dispatcher = new Dispatcher( - commandProcessor, - new List { subscription, newSubscription }, - messageMapperRegistryAsync: messageMapperRegistry) - ; - + [Before(Test)] + public async Task Setup() + { var @event = new MyEvent(); - var message = new MyEventMessageMapperAsync() - .MapToMessageAsync(@event, _publication ) - .GetAwaiter() - .GetResult(); - + var message = await new MyEventMessageMapperAsync().MapToMessageAsync(@event, _publication); _bus.Enqueue(message); - - - Assert.Equal(DispatcherState.DS_AWAITING, _dispatcher.State); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_AWAITING); _dispatcher.Receive(); - Task.Delay(250).Wait(); - _dispatcher.Shut(subscription.Name); - _dispatcher.Shut(newSubscription.Name); - Task.Delay(1000).Wait(); - Assert.Empty(_dispatcher.Consumers); - + await Task.Delay(250); + _dispatcher.Shut(_subscription.Name); + _dispatcher.Shut(_newSubscription.Name); + await Task.Delay(1000); + await Assert.That(_dispatcher.Consumers).IsEmpty(); } - [Fact] + [Test] public async Task When_A_Message_Dispatcher_Restarts_A_Connection_After_All_Connections_Have_Stopped() { _dispatcher.Open(new SubscriptionName("newTest")); var @event = new MyEvent(); var message = await new MyEventMessageMapperAsync().MapToMessageAsync(@event, _publication); _bus.Enqueue(message); - await Task.Delay(1000); _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - - Assert.Empty(_bus.Stream(_routingKey)); - Assert.Equal(DispatcherState.DS_RUNNING, _dispatcher.State); - Assert.Single(_dispatcher.Consumers); - Assert.Equal(2, _dispatcher.Subscriptions.Count()); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_RUNNING); + await Assert.That(_dispatcher.Consumers).HasSingleItem(); + await Assert.That(_dispatcher.Subscriptions.Count()).IsEqualTo(2); } - public void Dispose() + [After(Test)] + public async Task Dispose() { if (_dispatcher?.State == DispatcherState.DS_RUNNING) - _dispatcher.End().Wait(); + await _dispatcher.End(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_shuts_a_connection_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_shuts_a_connection_async.cs index 55c3ffae9e..00775790c3 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_shuts_a_connection_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_shuts_a_connection_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -6,11 +6,10 @@ using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { - public class MessageDispatcherShutConnectionTests : IDisposable + public class MessageDispatcherShutConnectionTests { private const string Topic = "fakekey"; private const string ChannelName = "fakeChannel"; @@ -18,57 +17,44 @@ public class MessageDispatcherShutConnectionTests : IDisposable private readonly Subscription _subscription; private readonly RoutingKey _routingKey = new(Topic); private readonly FakeTimeProvider _timeProvider = new(); - + private readonly InternalBus _bus; public MessageDispatcherShutConnectionTests() { - InternalBus bus = new(); - + _bus = new InternalBus(); IAmACommandProcessor commandProcessor = new SpyCommandProcessor(); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - _subscription = new Subscription( - new SubscriptionName("test"), - noOfPerformers: 3, - timeOut: TimeSpan.FromMilliseconds(1000), - channelFactory: new InMemoryChannelFactory(bus, _timeProvider), - channelName: new ChannelName(ChannelName), - messagePumpType: MessagePumpType.Proactor, - routingKey: _routingKey - ); + _subscription = new Subscription(new SubscriptionName("test"), noOfPerformers: 3, timeOut: TimeSpan.FromMilliseconds(1000), channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), channelName: new ChannelName(ChannelName), messagePumpType: MessagePumpType.Proactor, routingKey: _routingKey); _dispatcher = new Dispatcher(commandProcessor, new List { _subscription }, messageMapperRegistryAsync: messageMapperRegistry); + } + [Before(Test)] + public async Task Setup() + { var @event = new MyEvent(); - var message = new MyEventMessageMapperAsync().MapToMessageAsync(@event, new Publication{ Topic = _subscription.RoutingKey}) - .GetAwaiter() - .GetResult(); - + var message = await new MyEventMessageMapperAsync().MapToMessageAsync(@event, new Publication { Topic = _subscription.RoutingKey }); for (var i = 0; i < 6; i++) - bus.Enqueue(message); - - Assert.Equal(DispatcherState.DS_AWAITING, _dispatcher.State); + _bus.Enqueue(message); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_AWAITING); _dispatcher.Receive(); } - [Fact] + [Test] public async Task When_A_Message_Dispatcher_Shuts_A_Connection() { await Task.Delay(1000); _dispatcher.Shut(_subscription); await _dispatcher.End(); - - Assert.DoesNotContain(_dispatcher.Consumers, consumer => consumer.Name == _subscription.Name && consumer.State == ConsumerState.Open); - Assert.Equal(DispatcherState.DS_STOPPED, _dispatcher.State); - Assert.Empty(_dispatcher.Consumers); + await Assert.That(_dispatcher.Consumers).DoesNotContain(consumer => consumer.Name == _subscription.Name && consumer.State == ConsumerState.Open); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_STOPPED); + await Assert.That(_dispatcher.Consumers).IsEmpty(); } - - public void Dispose() + + [After(Test)] + public async Task Dispose() { if (_dispatcher?.State == DispatcherState.DS_RUNNING) - _dispatcher.End().Wait(); + await _dispatcher.End(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_starts_different_types_of_performers.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_starts_different_types_of_performers.cs index dc7fa0d90e..7bec319008 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_starts_different_types_of_performers.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_starts_different_types_of_performers.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -9,11 +9,10 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { - public class MessageDispatcherMultipleConnectionTestsAsync : IDisposable + public class MessageDispatcherMultipleConnectionTestsAsync { private readonly Dispatcher _dispatcher; private int _numberOfConsumers; @@ -21,85 +20,52 @@ public class MessageDispatcherMultipleConnectionTestsAsync : IDisposable private readonly FakeTimeProvider _timeProvider = new(); private readonly RoutingKey _commandRoutingKey = new("myCommand"); private readonly RoutingKey _eventRoutingKey = new("myEvent"); - public MessageDispatcherMultipleConnectionTestsAsync() { var commandProcessor = new SpyCommandProcessor(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient(); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new ServiceProviderMapperFactoryAsync(container.BuildServiceProvider()) - ); + var messageMapperRegistry = new MessageMapperRegistry(null, new ServiceProviderMapperFactoryAsync(container.BuildServiceProvider())); messageMapperRegistry.RegisterAsync(); messageMapperRegistry.RegisterAsync(); - - var myEventConnection = new Subscription( - new SubscriptionName("test"), - noOfPerformers: 1, - timeOut: TimeSpan.FromMilliseconds(1000), - channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), - messagePumpType: MessagePumpType.Proactor, - channelName: new ChannelName("fakeEventChannel"), - routingKey: _eventRoutingKey - ); - var myCommandConnection = new Subscription( - new SubscriptionName("anothertest"), - noOfPerformers: 1, - timeOut: TimeSpan.FromMilliseconds(1000), - channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), - channelName: new ChannelName("fakeCommandChannel"), - messagePumpType: MessagePumpType.Proactor, - routingKey: _commandRoutingKey - ); + var myEventConnection = new Subscription(new SubscriptionName("test"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), messagePumpType: MessagePumpType.Proactor, channelName: new ChannelName("fakeEventChannel"), routingKey: _eventRoutingKey); + var myCommandConnection = new Subscription(new SubscriptionName("anothertest"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), channelName: new ChannelName("fakeCommandChannel"), messagePumpType: MessagePumpType.Proactor, routingKey: _commandRoutingKey); _dispatcher = new Dispatcher(commandProcessor, new List { myEventConnection, myCommandConnection }, messageMapperRegistryAsync: messageMapperRegistry); + } + [Before(Test)] + public async Task Setup() + { var @event = new MyEvent(); - var eventMessage = new MyEventMessageMapperAsync().MapToMessageAsync(@event, new Publication{Topic = _eventRoutingKey}) - .GetAwaiter() - .GetResult(); - + var eventMessage = await new MyEventMessageMapperAsync().MapToMessageAsync(@event, new Publication { Topic = _eventRoutingKey }); _bus.Enqueue(eventMessage); - var command = new MyCommand(); - var commandMessage = new MyCommandMessageMapperAsync().MapToMessageAsync(command, new Publication{Topic = _commandRoutingKey}) - .GetAwaiter() - .GetResult(); - + var commandMessage = await new MyCommandMessageMapperAsync().MapToMessageAsync(command, new Publication { Topic = _commandRoutingKey }); _bus.Enqueue(commandMessage); - - Assert.Equal(DispatcherState.DS_AWAITING, _dispatcher.State); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_AWAITING); _dispatcher.Receive(); } - - [Fact] + [Test] public async Task When_A_Message_Dispatcher_Starts_Different_Types_Of_Performers() { await Task.Delay(1000); - _numberOfConsumers = _dispatcher.Consumers.Count(); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - await _dispatcher.End(); - - Assert.Empty(_bus.Stream(_eventRoutingKey)); - Assert.Empty(_bus.Stream(_commandRoutingKey)); - Assert.Equal(DispatcherState.DS_STOPPED, _dispatcher.State); - Assert.Empty(_dispatcher.Consumers); - Assert.Equal(2, _numberOfConsumers); + await Assert.That(_bus.Stream(_eventRoutingKey)).IsEmpty(); + await Assert.That(_bus.Stream(_commandRoutingKey)).IsEmpty(); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_STOPPED); + await Assert.That(_dispatcher.Consumers).IsEmpty(); + await Assert.That(_numberOfConsumers).IsEqualTo(2); } - - public void Dispose() + + [After(Test)] + public async Task Dispose() { if (_dispatcher?.State == DispatcherState.DS_RUNNING) - _dispatcher.End().Wait(); + await _dispatcher.End(); } - } - -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_starts_multiple_performers_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_starts_multiple_performers_async.cs index e11a0e0cff..a704786a0d 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_starts_multiple_performers_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_dispatcher_starts_multiple_performers_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -6,65 +6,49 @@ using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { - public class MessageDispatcherMultiplePerformerTestsAsync { private const string Topic = "myTopic"; private const string ChannelName = "myChannel"; private readonly Dispatcher _dispatcher; private readonly InternalBus _bus; - + private readonly Subscription _connection; + private readonly IAmAChannelSync _channel; public MessageDispatcherMultiplePerformerTestsAsync() { var routingKey = new RoutingKey(Topic); _bus = new InternalBus(); var consumer = new InMemoryMessageConsumer(routingKey, _bus, TimeProvider.System, ackTimeout: TimeSpan.FromMilliseconds(1000)); - - IAmAChannelSync channel = new Channel(new (ChannelName), new(Topic), consumer, 6); + _channel = new Channel(new(ChannelName), new(Topic), consumer, 6); IAmACommandProcessor commandProcessor = new SpyCommandProcessor(); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); + _connection = new Subscription(new SubscriptionName("test"), noOfPerformers: 3, timeOut: TimeSpan.FromMilliseconds(100), channelFactory: new InMemoryChannelFactory(_bus, TimeProvider.System), channelName: new ChannelName("fakeChannel"), messagePumpType: MessagePumpType.Proactor, routingKey: routingKey); + _dispatcher = new Dispatcher(commandProcessor, new List { _connection }, messageMapperRegistryAsync: messageMapperRegistry); + } - var connection = new Subscription( - new SubscriptionName("test"), - noOfPerformers: 3, - timeOut: TimeSpan.FromMilliseconds(100), - channelFactory: new InMemoryChannelFactory(_bus, TimeProvider.System), - channelName: new ChannelName("fakeChannel"), - messagePumpType: MessagePumpType.Proactor, - routingKey: routingKey - ); - _dispatcher = new Dispatcher(commandProcessor, new List { connection }, messageMapperRegistryAsync: messageMapperRegistry); - + [Before(Test)] + public async Task Setup() + { var @event = new MyEvent(); - var message = new MyEventMessageMapperAsync().MapToMessageAsync(@event, new Publication{Topic = connection.RoutingKey}) - .GetAwaiter() - .GetResult(); - + var message = await new MyEventMessageMapperAsync().MapToMessageAsync(@event, new Publication { Topic = _connection.RoutingKey }); for (var i = 0; i < 6; i++) - channel.Enqueue(message); - - Assert.Equal(DispatcherState.DS_AWAITING, _dispatcher.State); + _channel.Enqueue(message); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_AWAITING); _dispatcher.Receive(); } - [Fact] + [Test] public async Task WhenAMessageDispatcherStartsMultiplePerformers() { - Assert.Equal(DispatcherState.DS_RUNNING, _dispatcher.State); - Assert.Equal(3, _dispatcher.Consumers.Count()); - - await _dispatcher.End(); - - Assert.Empty(_bus.Stream(new RoutingKey(Topic))); - Assert.Equal(DispatcherState.DS_STOPPED, _dispatcher.State); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_RUNNING); + await Assert.That(_dispatcher.Consumers.Count()).IsEqualTo(3); + await _dispatcher.End(); + await Assert.That(_bus.Stream(new RoutingKey(Topic))).IsEmpty(); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_STOPPED); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_fails_to_be_mapped_to_a_request_and_the_unacceptable_message_limit_is_reached_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_fails_to_be_mapped_to_a_request_and_the_unacceptable_message_limit_is_reached_async.cs index 6201bb5af9..5f8813b060 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_fails_to_be_mapped_to_a_request_and_the_unacceptable_message_limit_is_reached_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_fails_to_be_mapped_to_a_request_and_the_unacceptable_message_limit_is_reached_async.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,23 +12,20 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { @@ -39,50 +36,34 @@ public class MessagePumpUnacceptableMessageLimitTestsAsync private readonly InternalBus _bus = new(); private readonly IAmAMessagePump _messagePump; private readonly FakeTimeProvider _timeProvider = new(); - public MessagePumpUnacceptableMessageLimitTestsAsync() { SpyRequeueCommandProcessor commandProcessor = new(); - var channel = new ChannelAsync( - new (Channel), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), - 2 - ); - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new FailingEventMessageMapperAsync())); + var channel = new ChannelAsync(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), 2); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new FailingEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyFailingMapperEvent), - messageMapperRegistry, null, new InMemoryRequestContextFactory(), channel) + _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyFailingMapperEvent), messageMapperRegistry, null, new InMemoryRequestContextFactory(), channel) { - Channel = channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = 3, UnacceptableMessageLimit = 3 + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = 3, + UnacceptableMessageLimit = 3 }; - - var unmappableMessage = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody("{ \"Id\" : \"48213ADB-A085-4AFF-A42C-CF8209350CF7\" }") - ); - + var unmappableMessage = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody("{ \"Id\" : \"48213ADB-A085-4AFF-A42C-CF8209350CF7\" }")); channel.Enqueue(unmappableMessage); channel.Enqueue(unmappableMessage); channel.Enqueue(unmappableMessage); - } - [Fact] + [Test] public async Task When_A_Message_Fails_To_Be_Mapped_To_A_Request_And_The_Unacceptable_Message_Limit_Is_Reached() { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); await Task.Delay(1000); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - await Task.WhenAll(new[] { task }); - - Assert.Empty(_bus.Stream(_routingKey)); - - //TODO: How do we assert channel closure? Observability? + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + //TODO: How do we assert channel closure? Observability? } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_fails_to_be_mapped_to_a_request_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_fails_to_be_mapped_to_a_request_async.cs index 3ab241b46a..35c180363e 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_fails_to_be_mapped_to_a_request_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_fails_to_be_mapped_to_a_request_async.cs @@ -1,14 +1,12 @@ -using System; +using System; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { - public class MessagePumpFailingMessageTranslationTestsAsync { private const string ChannelName = "myChannel"; @@ -17,43 +15,31 @@ public class MessagePumpFailingMessageTranslationTestsAsync private readonly FakeTimeProvider _timeProvider = new(); private readonly IAmAMessagePump _messagePump; private readonly ChannelAsync _channel; - public MessagePumpFailingMessageTranslationTestsAsync() { SpyRequeueCommandProcessor commandProcessor = new(); - _channel = new ChannelAsync( - new(ChannelName), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new FailingEventMessageMapperAsync())); + _channel = new ChannelAsync(new(ChannelName), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new FailingEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyFailingMapperEvent), - messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) + _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyFailingMapperEvent), messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) { - Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = 3, UnacceptableMessageLimit = 3 + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = 3, + UnacceptableMessageLimit = 3 }; - var unmappableMessage = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody("{ \"Id\" : \"48213ADB-A085-4AFF-A42C-CF8209350CF7\" }")); - _channel.Enqueue(unmappableMessage); - } - [Fact] + [Test] public async Task When_A_Message_Fails_To_Be_Mapped_To_A_Request_Should_Ack() { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - _channel.Stop(_routingKey); - await Task.WhenAll(task); - - Assert.Empty(_bus.Stream(_routingKey)); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_is_dispatched_it_should_reach_a_handler_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_is_dispatched_it_should_reach_a_handler_async.cs index e9a3779251..5c0fba8f4c 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_is_dispatched_it_should_reach_a_handler_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_is_dispatched_it_should_reach_a_handler_async.cs @@ -1,14 +1,13 @@ -using System; +using System; using System.Text.Json; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { - public class MessagePumpDispatchAsyncTests + public class MessagePumpDispatchAsyncTests { private const string ChannelName = "myChannel"; private readonly RoutingKey _routingKey = new("MyTopic"); @@ -16,51 +15,35 @@ public class MessagePumpDispatchAsyncTests private readonly FakeTimeProvider _timeProvider = new(); private readonly IAmAMessagePump _messagePump; private readonly MyEvent _myEvent = new MyEvent(); - public MessagePumpDispatchAsyncTests() { var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.RegisterAsync(); - var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyEventHandlerAsyncWithContinuation()); - var commandProcessor = new CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory() - ); - - PipelineBuilder.ClearPipelineCache(); - + var commandProcessor = new CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); var channel = new ChannelAsync(new(ChannelName), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), channel) - { Channel = channel, TimeOut = TimeSpan.FromMilliseconds(5000) }; - + _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), channel) + { + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(5000) + }; var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(_myEvent))); channel.Enqueue(message); var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); channel.Enqueue(quitMessage); - } - [Fact] - public void When_a_message_is_dispatched_it_should_reach_a_handler_async() + [Test] + public async Task When_a_message_is_dispatched_it_should_reach_a_handler_async() { _messagePump.Run(); - - Assert.True(MyEventHandlerAsyncWithContinuation.ShouldReceive(_myEvent)); - Assert.Equal(2, MyEventHandlerAsyncWithContinuation.MonitorValue); + await Assert.That(MyEventHandlerAsyncWithContinuation.ShouldReceive(_myEvent)).IsTrue(); + await Assert.That(MyEventHandlerAsyncWithContinuation.MonitorValue).IsEqualTo(2); //NOTE: We may want to run the continuation on the captured context, so as not to create a new thread, which means this test would //change once we fix the pump to exhibit that behavior\ - Assert.NotEqual(MyEventHandlerAsyncWithContinuation.WorkThreadId, MyEventHandlerAsyncWithContinuation.ContinuationThreadId); - + await Assert.That(MyEventHandlerAsyncWithContinuation.ContinuationThreadId).IsNotEqualTo(MyEventHandlerAsyncWithContinuation.WorkThreadId); } } - } +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_mapper_throws_invalid_message_action_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_mapper_throws_invalid_message_action_async.cs index 054c5adeab..cbf6556a08 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_mapper_throws_invalid_message_action_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_message_mapper_throws_invalid_message_action_async.cs @@ -8,10 +8,8 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor; - public class MessageDispatchInvalidMessageActionAsyncTests { private readonly RoutingKey _routingKey = new("myTopic"); @@ -19,63 +17,30 @@ public class MessageDispatchInvalidMessageActionAsyncTests private readonly InternalBus _bus = new(); private readonly FakeTimeProvider _timeProvider = new(); private Dispatcher _dispatcher; - public MessageDispatchInvalidMessageActionAsyncTests() { // Arrange: Set up a message mapper that throws InvalidMessageAction on deserialization failure var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.Register(); - - var handlerFactory = new SimpleHandlerFactory( - (type) => new MyRejectedEventHandler(), - (type) => throw new ConfigurationException() - ); - + var handlerFactory = new SimpleHandlerFactory((type) => new MyRejectedEventHandler(), (type) => throw new ConfigurationException()); // Use a mapper that throws InvalidMessageAction to simulate deserialization failure var mapperFactory = new SimpleMessageMapperFactoryAsync((r) => new MyInvalidMessageMapper()); var messageMapperRegistry = new MessageMapperRegistry(null, mapperFactory, null, null); messageMapperRegistry.RegisterAsync(); - var resiliencePipelineRegistry = new ResiliencePipelineRegistry(); resiliencePipelineRegistry.AddBrighterDefault(); - - var commandProcessor = new CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - resiliencePipelineRegistry, - new InMemorySchedulerFactory() - ); - - var subscription = new InMemorySubscription( - new SubscriptionName("test"), - noOfPerformers: 1, - timeOut: TimeSpan.FromMilliseconds(1000), - channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), - channelName: new ChannelName("myChannel"), - messagePumpType: MessagePumpType.Proactor, - routingKey: _routingKey - ); - + var commandProcessor = new CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), resiliencePipelineRegistry, new InMemorySchedulerFactory()); + var subscription = new InMemorySubscription(new SubscriptionName("test"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), channelName: new ChannelName("myChannel"), messagePumpType: MessagePumpType.Proactor, routingKey: _routingKey); subscription.InvalidMessageRoutingKey = _invalidMessageRoutingKey; - - _dispatcher = new Dispatcher( - commandProcessor, - new List { subscription }, - messageMapperRegistryAsync: messageMapperRegistry, - requestContextFactory: new InMemoryRequestContextFactory() - ); - + _dispatcher = new Dispatcher(commandProcessor, new List { subscription }, messageMapperRegistryAsync: messageMapperRegistry, requestContextFactory: new InMemoryRequestContextFactory()); // Act: Send a message that will fail deserialization var @event = new MyRejectedEvent(Id.Random()); - var message = new MyRejectedEventHandlerMessageMapper().MapToMessage(@event, new Publication{Topic = _routingKey}); + var message = new MyRejectedEventHandlerMessageMapper().MapToMessage(@event, new Publication { Topic = _routingKey }); _bus.Enqueue(message); - _dispatcher.Receive(); } - [Fact] + [Test] public async Task When_a_message_mapper_throws_invalid_message_action() { // Wait for the message to be processed (moved to invalid message topic) before stopping @@ -87,16 +52,13 @@ public async Task When_a_message_mapper_throws_invalid_message_action() } await _dispatcher.End(); - // Assert: The message should be removed from the source queue - Assert.Empty(_bus.Stream(_routingKey)); - + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); // Assert: The message should appear in the invalid message channel - Assert.NotEmpty(_bus.Stream(_invalidMessageRoutingKey)); + await Assert.That(_bus.Stream(_invalidMessageRoutingKey)).IsNotEmpty(); var message = _bus.Dequeue(_invalidMessageRoutingKey); - // Assert: The message should include rejection metadata var rejectionReason = $"Message rejected reason: {RejectionReason.Unacceptable} Description: Failed to deserialize message"; - Assert.Equal(rejectionReason, message.Header.Bag[Message.RejectionReasonHeaderName]); + await Assert.That(message.Header.Bag[Message.RejectionReasonHeaderName]).IsEqualTo(rejectionReason); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_requeue_count_threshold_for_commands_has_been_reached.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_requeue_count_threshold_for_commands_has_been_reached.cs index 357fe70418..ce910ea494 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_requeue_count_threshold_for_commands_has_been_reached.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_requeue_count_threshold_for_commands_has_been_reached.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text.Json; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -7,7 +7,6 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { @@ -20,51 +19,37 @@ public class MessagePumpCommandRequeueCountThresholdTestsAsync private readonly IAmAMessagePump _messagePump; private readonly ChannelAsync _channel; private readonly SpyRequeueCommandProcessor _commandProcessor; - public MessagePumpCommandRequeueCountThresholdTestsAsync() { _commandProcessor = new SpyRequeueCommandProcessor(); - _channel = new ChannelAsync(new(Channel) ,_routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyCommandMessageMapperAsync())); + _channel = new ChannelAsync(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyCommandMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor(_commandProcessor, (message) => typeof(MyCommand), - messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), _channel) - { Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = 3 }; - - var message1 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize((MyCommand)new(), JsonSerialisationOptions.Options)) - ); - var message2 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize((MyCommand)new(), JsonSerialisationOptions.Options)) - ); + _messagePump = new ServiceActivator.Proactor(_commandProcessor, (message) => typeof(MyCommand), messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), _channel) + { + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = 3 + }; + var message1 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize((MyCommand)new(), JsonSerialisationOptions.Options))); + var message2 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize((MyCommand)new(), JsonSerialisationOptions.Options))); _bus.Enqueue(message1); _bus.Enqueue(message2); - } - [Fact] + [Test] public async Task When_A_Requeue_Count_Threshold_For_Commands_Has_Been_Reached() { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); await Task.Delay(1000); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - var quitMessage = MessageFactory.CreateQuitMessage(new RoutingKey("MyTopic")); _channel.Enqueue(quitMessage); - await Task.WhenAll(task); - - Assert.Equal(CommandType.SendAsync, _commandProcessor.Commands[0]); - Assert.Equal(6, _commandProcessor.SendCount); - - Assert.Empty(_bus.Stream(_routingKey)); - - //TODO: How can we observe that the channel has been closed? Observability? + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.SendAsync); + await Assert.That(_commandProcessor.SendCount).IsEqualTo(6); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + //TODO: How can we observe that the channel has been closed? Observability? } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_requeue_count_threshold_for_events_has_been_reached.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_requeue_count_threshold_for_events_has_been_reached.cs index 3015f431c5..0e86c76588 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_requeue_count_threshold_for_events_has_been_reached.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_requeue_count_threshold_for_events_has_been_reached.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text.Json; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -7,7 +7,6 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { @@ -20,53 +19,37 @@ public class MessagePumpEventRequeueCountThresholdTestsAsync private readonly IAmAMessagePump _messagePump; private readonly ChannelAsync _channel; private readonly SpyRequeueCommandProcessor _commandProcessor; - public MessagePumpEventRequeueCountThresholdTestsAsync() { _commandProcessor = new SpyRequeueCommandProcessor(); _channel = new ChannelAsync(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor(_commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), _channel) - { Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = 3 }; - - var message1 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize((MyEvent)new(), JsonSerialisationOptions.Options)) - ); - var message2 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize((MyEvent)new(), JsonSerialisationOptions.Options)) - ); + _messagePump = new ServiceActivator.Proactor(_commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), _channel) + { + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = 3 + }; + var message1 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize((MyEvent)new(), JsonSerialisationOptions.Options))); + var message2 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize((MyEvent)new(), JsonSerialisationOptions.Options))); _bus.Enqueue(message1); _bus.Enqueue(message2); - } - [Fact] + [Test] public async Task When_A_Requeue_Count_Threshold_For_Events_Has_Been_Reached() { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); await Task.Delay(1000); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); _channel.Enqueue(quitMessage); - await Task.WhenAll(task); - - Assert.Equal(CommandType.PublishAsync, _commandProcessor.Commands[0]); - Assert.Equal(6, _commandProcessor.PublishCount); - - Assert.Empty(_bus.Stream(_routingKey)); - - //TODO: How do we assert that the channel was closed? Observability? + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.PublishAsync); + await Assert.That(_commandProcessor.PublishCount).IsEqualTo(6); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + //TODO: How do we assert that the channel was closed? Observability? } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_requeue_of_command_exception_is_thrown.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_requeue_of_command_exception_is_thrown.cs index 2ef20b3731..5af85bbe24 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_requeue_of_command_exception_is_thrown.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_requeue_of_command_exception_is_thrown.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Text.Json; using Microsoft.Extensions.Time.Testing; @@ -7,7 +7,6 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { @@ -20,48 +19,32 @@ public class MessagePumpCommandRequeueTestsAsync private readonly IAmAMessagePump _messagePump; private readonly SpyCommandProcessor _commandProcessor; private readonly MyCommand _command = new(); - public MessagePumpCommandRequeueTestsAsync() { _commandProcessor = new SpyRequeueCommandProcessor(); ChannelAsync channel = new(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), 2); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyCommandMessageMapperAsync())); - messageMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor(_commandProcessor, (message) => typeof(MyCommand), - messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), channel) - { Channel = channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = -1 }; - - var message1 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_command, JsonSerialisationOptions.Options)) - ); - - var message2 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_command, JsonSerialisationOptions.Options)) - ); - + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyCommandMessageMapperAsync())); + messageMapperRegistry.RegisterAsync(); + _messagePump = new ServiceActivator.Proactor(_commandProcessor, (message) => typeof(MyCommand), messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), channel) + { + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = -1 + }; + var message1 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_command, JsonSerialisationOptions.Options))); + var message2 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_command, JsonSerialisationOptions.Options))); channel.Enqueue(message1); channel.Enqueue(message2); - var quitMessage = new Message( - new MessageHeader(string.Empty, RoutingKey.Empty, MessageType.MT_QUIT), - new MessageBody("") - ); + var quitMessage = new Message(new MessageHeader(string.Empty, RoutingKey.Empty, MessageType.MT_QUIT), new MessageBody("")); channel.Enqueue(quitMessage); - } - [Fact] - public void When_A_Requeue_Of_Command_Exception_Is_Thrown() + [Test] + public async Task When_A_Requeue_Of_Command_Exception_Is_Thrown() { _messagePump.Run(); - - Assert.Equal(CommandType.SendAsync, _commandProcessor.Commands[0]); - Assert.Equal(2, _bus.Stream(_routingKey).Count()); + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.SendAsync); + await Assert.That(_bus.Stream(_routingKey).Count()).IsEqualTo(2); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_requeue_of_event_exception_is_thrown.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_requeue_of_event_exception_is_thrown.cs index 738398df2a..8beaa2d876 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_requeue_of_event_exception_is_thrown.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_a_requeue_of_event_exception_is_thrown.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Text.Json; using Microsoft.Extensions.Time.Testing; @@ -7,7 +7,6 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { @@ -19,56 +18,36 @@ public class MessagePumpEventRequeueTestsAsync private readonly FakeTimeProvider _timeProvider = new(); private readonly IAmAMessagePump _messagePump; private readonly SpyCommandProcessor _commandProcessor; - public MessagePumpEventRequeueTestsAsync() { _commandProcessor = new SpyRequeueCommandProcessor(); - ChannelAsync channel = new( - new(Channel), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), - 2 - ); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); + ChannelAsync channel = new(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), 2); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor(_commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), channel) - { Channel = channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = -1 }; - - var message1 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize((MyEvent)new(), JsonSerialisationOptions.Options)) - ); - var message2 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize((MyEvent)new(), JsonSerialisationOptions.Options)) - ); - + _messagePump = new ServiceActivator.Proactor(_commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), channel) + { + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = -1 + }; + var message1 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize((MyEvent)new(), JsonSerialisationOptions.Options))); + var message2 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize((MyEvent)new(), JsonSerialisationOptions.Options))); channel.Enqueue(message1); channel.Enqueue(message2); var quitMessage = MessageFactory.CreateQuitMessage(new RoutingKey("MyTopic")); channel.Enqueue(quitMessage); - } - [Fact] - public void When_A_Requeue_Of_Event_Exception_Is_Thrown() + [Test] + public async Task When_A_Requeue_Of_Event_Exception_Is_Thrown() { _messagePump.Run(); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - //_should_publish_the_message_via_the_command_processor - Assert.Equal(CommandType.PublishAsync, _commandProcessor.Commands[0]); - + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.PublishAsync); //_should_requeue_the_messages - Assert.Equal(2, _bus.Stream(_routingKey).Count()); - - - //TODO: How do we know that the channel has been disposed? Observability + await Assert.That(_bus.Stream(_routingKey).Count()).IsEqualTo(2); + //TODO: How do we know that the channel has been disposed? Observability } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_aggregate_exception_containing_dont_ack_action_should_not_acknowledge_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_aggregate_exception_containing_dont_ack_action_should_not_acknowledge_async.cs index b65ee3cff0..e1890a0f84 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_aggregate_exception_containing_dont_ack_action_should_not_acknowledge_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_aggregate_exception_containing_dont_ack_action_should_not_acknowledge_async.cs @@ -7,7 +7,6 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.Testing; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { @@ -19,28 +18,13 @@ public class MessagePumpEventDontAckAggregateExceptionTestsAsync private readonly FakeTimeProvider _timeProvider = new(); private readonly IAmAMessagePump _messagePump; private readonly SpyDontAckCommandProcessor _commandProcessor; - public MessagePumpEventDontAckAggregateExceptionTestsAsync() { _commandProcessor = new SpyDontAckCommandProcessor(); - var channel = new ChannelAsync( - new(ChannelName), - _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); + var channel = new ChannelAsync(new(ChannelName), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor( - _commandProcessor, - (message) => typeof(MyEvent), - messageMapperRegistry, - new EmptyMessageTransformerFactoryAsync(), - new InMemoryRequestContextFactory(), - channel) + _messagePump = new ServiceActivator.Proactor(_commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), channel) { Channel = channel, TimeOut = TimeSpan.FromMilliseconds(5000), @@ -48,38 +32,30 @@ public MessagePumpEventDontAckAggregateExceptionTestsAsync() UnacceptableMessageLimit = 2, DontAckDelay = TimeSpan.Zero }; - // Arrange: enqueue two event messages (both will trigger AggregateException wrapping DontAckAction via PublishAsync) for (int i = 0; i < 2; i++) { - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize(new MyEvent(), JsonSerialisationOptions.Options)) - ); + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(new MyEvent(), JsonSerialisationOptions.Options))); channel.Enqueue(message); } } - [Fact] - public void When_Aggregate_Exception_Containing_DontAck_Action_Should_Not_Acknowledge_Async() + [Test] + public async Task When_Aggregate_Exception_Containing_DontAck_Action_Should_Not_Acknowledge_Async() { // Act _messagePump.Run(); - // Assert: handler was called for both messages via PublishAsync (event path) - Assert.Equal(CommandType.PublishAsync, _commandProcessor.Commands[0]); - Assert.Equal(2, _commandProcessor.PublishCount); - + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.PublishAsync); + await Assert.That(_commandProcessor.PublishCount).IsEqualTo(2); // Assert: pump continued running after the first AggregateException containing DontAckAction // (it processed the second event, proving it didn't crash or stop on the first) - // Assert: unacceptable message count was incremented // The pump exited because the count reached the limit of 2, // which only happens if IncrementUnacceptableMessageCount was called for each DontAckAction - Assert.Equal(MessagePumpStatus.MP_LIMIT_EXCEEDED, _messagePump.Status); - + await Assert.That(_messagePump.Status).IsEqualTo(MessagePumpStatus.MP_LIMIT_EXCEEDED); // Assert: messages were nacked (re-enqueued to bus, available for redelivery) - Assert.NotEmpty(_bus.Stream(_routingKey)); + await Assert.That(_bus.Stream(_routingKey)).IsNotEmpty(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_event_handler_throw_a_reject_message_exception_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_event_handler_throw_a_reject_message_exception_async.cs index a697077f10..cf8930c621 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_event_handler_throw_a_reject_message_exception_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_event_handler_throw_a_reject_message_exception_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -7,10 +7,8 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor; - public class MessageDispatchRejectMessageExceptionTestsAsync { private readonly RoutingKey _routingKey = new("myTopic"); @@ -18,77 +16,41 @@ public class MessageDispatchRejectMessageExceptionTestsAsync private readonly InternalBus _bus = new(); private readonly FakeTimeProvider _timeProvider = new(); private Dispatcher _dispatcher; - public MessageDispatchRejectMessageExceptionTestsAsync() { var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.RegisterAsync(); - - var handlerFactory = new SimpleHandlerFactory( - (type) => throw new ConfigurationException(), - (type) => new MyRejectedEventHandlerAsync() - ); - + var handlerFactory = new SimpleHandlerFactory((type) => throw new ConfigurationException(), (type) => new MyRejectedEventHandlerAsync()); var mapperFactory = new SimpleMessageMapperFactoryAsync((r) => new MyRejectedEventHandlerMessageMapperAsync()); var messageMapperRegistryAsync = new MessageMapperRegistry(null, mapperFactory); messageMapperRegistryAsync.RegisterAsync(); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry(); resiliencePipelineRegistry.AddBrighterDefault(); - - var commandProcessor = new CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - resiliencePipelineRegistry, - new InMemorySchedulerFactory() - ); - - var subscription = new InMemorySubscription( - new SubscriptionName("test"), - noOfPerformers: 1, - timeOut: TimeSpan.FromMilliseconds(1000), - channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), - channelName: new ChannelName("myChannel"), - messagePumpType: MessagePumpType.Proactor, - routingKey: _routingKey - ); - + var commandProcessor = new CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), resiliencePipelineRegistry, new InMemorySchedulerFactory()); + var subscription = new InMemorySubscription(new SubscriptionName("test"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), channelName: new ChannelName("myChannel"), messagePumpType: MessagePumpType.Proactor, routingKey: _routingKey); subscription.DeadLetterRoutingKey = _deadLetterRoutingKey; - - _dispatcher = new Dispatcher( - commandProcessor, - new List { subscription }, - null, - messageMapperRegistryAsync, - requestContextFactory: new InMemoryRequestContextFactory() - ); - + _dispatcher = new Dispatcher(commandProcessor, new List { subscription }, null, messageMapperRegistryAsync, requestContextFactory: new InMemoryRequestContextFactory()); + } + + [Before(Test)] + public async Task Setup() + { var @event = new MyRejectedEvent(Id.Random()); - var message = new MyRejectedEventHandlerMessageMapperAsync() - .MapToMessageAsync(@event, new Publication{Topic = _routingKey}) - .Result; + var message = await new MyRejectedEventHandlerMessageMapperAsync().MapToMessageAsync(@event, new Publication { Topic = _routingKey }); _bus.Enqueue(message); - - _dispatcher.Receive(); + _dispatcher.Receive(); } - [Fact] + [Test] public async Task When_an_event_handler_throw_a_reject_message_exception() { // Allow time for async message processing to complete before stopping await Task.Delay(1000); // slopwatch:suppress SW004 - message pump runs on background thread with no sync point - await _dispatcher.End(); - - Assert.Empty(_bus.Stream(_routingKey)); - Assert.NotEmpty(_bus.Stream(_deadLetterRoutingKey)); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + await Assert.That(_bus.Stream(_deadLetterRoutingKey)).IsNotEmpty(); var message = _bus.Dequeue(_deadLetterRoutingKey); var rejectionReason = $"Message rejected reason: {RejectionReason.DeliveryError} Description: {MyRejectedEventHandlerAsync.TestOfRejectionFlow}"; - Assert.Equal(rejectionReason, message.Header.Bag[Message.RejectionReasonHeaderName]); + await Assert.That(message.Header.Bag[Message.RejectionReasonHeaderName]).IsEqualTo(rejectionReason); } - - -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_event_handler_throws_a_defer_message_Then_message_is_requeued_until_rejectedAsync.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_event_handler_throws_a_defer_message_Then_message_is_requeued_until_rejectedAsync.cs index db6d3397f1..f03708ee86 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_event_handler_throws_a_defer_message_Then_message_is_requeued_until_rejectedAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_event_handler_throws_a_defer_message_Then_message_is_requeued_until_rejectedAsync.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright � 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the �Software�), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED �AS IS�, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -30,7 +28,6 @@ THE SOFTWARE. */ using Paramore.Brighter.Testing; using Paramore.Brighter.Observability; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { @@ -44,46 +41,39 @@ public class MessagePumpEventProcessingDeferMessageActionTestsAsync private readonly FakeTimeProvider _timeProvider = new(); private readonly InternalBus _bus; private readonly ChannelAsync _channel; - + private readonly MessageMapperRegistry _messageMapperRegistry; public MessagePumpEventProcessingDeferMessageActionTestsAsync() { SpyRequeueCommandProcessor commandProcessor = new(); - _bus = new InternalBus(); - _channel = new ChannelAsync(new (Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); - messageMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), _channel) - { Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = _requeueCount }; + _channel = new ChannelAsync(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + _messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); + _messageMapperRegistry.RegisterAsync(); + _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyEvent), _messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), _channel) + { + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = _requeueCount + }; + } - var msg = new TransformPipelineBuilderAsync(messageMapperRegistry, null, InstrumentationOptions.All) - .BuildWrapPipeline() - .WrapAsync(new MyEvent(), new RequestContext(), new Publication{Topic = _routingKey}) - .Result; + [Before(Test)] + public async Task Setup() + { + var msg = await new TransformPipelineBuilderAsync(_messageMapperRegistry, null, InstrumentationOptions.All).BuildWrapPipeline().WrapAsync(new MyEvent(), new RequestContext(), new Publication { Topic = _routingKey }); _channel.Enqueue(msg); - } - - [Fact] + [Test] public async Task When_an_event_handler_throws_a_defer_message_the_message_is_requeued_until_rejectedAsync() { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); await Task.Delay(1000); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - var quitMessage = MessageFactory.CreateQuitMessage(new RoutingKey(Topic)); _channel.Enqueue(quitMessage); - await Task.WhenAll(task); - Assert.Empty(_bus.Stream(_routingKey)); - + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_event_handler_throws_unhandled_exception_Then_message_is_acked_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_event_handler_throws_unhandled_exception_Then_message_is_acked_async.cs index a5a59d9a9b..d667875d1b 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_event_handler_throws_unhandled_exception_Then_message_is_acked_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_event_handler_throws_unhandled_exception_Then_message_is_acked_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -9,7 +9,6 @@ using Paramore.Brighter.ServiceActivator; using Serilog.Events; using Serilog.Sinks.TestCorrelator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { @@ -22,57 +21,45 @@ public class MessagePumpEventProcessingExceptionTestsAsync private readonly int _requeueCount = 5; private readonly RoutingKey _routingKey = new(Topic); private readonly FakeTimeProvider _timeProvider = new(); - + private readonly InternalBus _bus; + private readonly MessageMapperRegistry _messageMapperRegistry; public MessagePumpEventProcessingExceptionTestsAsync() { SpyExceptionCommandProcessor commandProcessor = new(); - - var bus = new InternalBus(); - - _channel = new ChannelAsync(new (Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); - messageMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) + _bus = new InternalBus(); + _channel = new ChannelAsync(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + _messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); + _messageMapperRegistry.RegisterAsync(); + _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyEvent), _messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) { - Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = _requeueCount + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = _requeueCount }; + } - var msg = new TransformPipelineBuilderAsync(messageMapperRegistry, null, InstrumentationOptions.All) - .BuildWrapPipeline() - .WrapAsync(new MyEvent(), new RequestContext(), new Publication{Topic = _routingKey}) - .Result; - bus.Enqueue(msg); - + [Before(Test)] + public async Task Setup() + { + var msg = await new TransformPipelineBuilderAsync(_messageMapperRegistry, null, InstrumentationOptions.All).BuildWrapPipeline().WrapAsync(new MyEvent(), new RequestContext(), new Publication { Topic = _routingKey }); + _bus.Enqueue(msg); } - [Fact] + [Test] public async Task When_an_event_handler_throws_unhandled_exception_Then_message_is_acked_async() { using (TestCorrelator.CreateContext()) { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); await Task.Delay(1000); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - - var quitMessage = new Message(new MessageHeader(string.Empty, RoutingKey.Empty, MessageType.MT_QUIT), - new MessageBody("")); + var quitMessage = new Message(new MessageHeader(string.Empty, RoutingKey.Empty, MessageType.MT_QUIT), new MessageBody("")); _channel.Enqueue(quitMessage); - await Task.WhenAll(task); - - var logEvents = TestCorrelator.GetLogEventsFromCurrentContext(); - Assert.Contains(logEvents, x => x.Level == LogEventLevel.Error); - Assert.Equal( - "MessagePump: Failed to dispatch message {Id} from {ChannelName} with {RoutingKey} on thread # {ManagementThreadId}", - logEvents.First(x => x.Level == LogEventLevel.Error).MessageTemplate.Text); + await Assert.That(logEvents).Contains(x => x.Level == LogEventLevel.Error); + await Assert.That(logEvents.First(x => x.Level == LogEventLevel.Error).MessageTemplate.Text).IsEqualTo("MessagePump: Failed to dispatch message {Id} from {ChannelName} with {RoutingKey} on thread # {ManagementThreadId}"); } } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_unacceptable_message_is_recieved_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_unacceptable_message_is_recieved_async.cs index 0822a4c486..eb3394bf1e 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_unacceptable_message_is_recieved_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_unacceptable_message_is_recieved_async.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Text.Json; using System.Threading.Tasks; @@ -30,10 +28,8 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor; - public class AsyncMessagePumpUnacceptableMessageTests { private const string Channel = "MyChannel"; @@ -42,53 +38,34 @@ public class AsyncMessagePumpUnacceptableMessageTests private readonly InternalBus _bus; private readonly RoutingKey _routingKey = new("MyTopic"); private readonly FakeTimeProvider _timeProvider = new FakeTimeProvider(); - public AsyncMessagePumpUnacceptableMessageTests() { SpyRequeueCommandProcessor commandProcessor = new(); - _bus = new InternalBus(); - - _channel = new ChannelAsync( - new(Channel), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); + _channel = new ChannelAsync(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) + _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) { - Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = 3 + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = 3 }; - var myMessage = JsonSerializer.Serialize(new MyEvent()); var unacceptableMessage = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody(myMessage)); - _bus.Enqueue(unacceptableMessage); - } - [Fact] + [Test] public async Task When_An_Unacceptable_Message_Is_Recieved() { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); await Task.Delay(1000); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - - var quitMessage = new Message( - new MessageHeader(string.Empty, RoutingKey.Empty, MessageType.MT_QUIT), - new MessageBody("") - ); + var quitMessage = new Message(new MessageHeader(string.Empty, RoutingKey.Empty, MessageType.MT_QUIT), new MessageBody("")); _channel.Enqueue(quitMessage); - await Task.WhenAll(new[] { task }); - //should_acknowledge_the_message - Assert.Empty(_bus.Stream(_routingKey)); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); } } \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_unacceptable_message_is_recieved_async_and_there_is_a_dlq.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_unacceptable_message_is_recieved_async_and_there_is_a_dlq.cs index b66e43c336..b22d9406a8 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_unacceptable_message_is_recieved_async_and_there_is_a_dlq.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_unacceptable_message_is_recieved_async_and_there_is_a_dlq.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Text.Json; using System.Threading.Tasks; @@ -30,70 +28,48 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { public class AsyncMessagePumpUnacceptableMessageDeadLetterChannelTests { - private const string Channel = "MyChannel"; - private readonly IAmAMessagePump _messagePump; - private readonly ChannelAsync _channel; - private readonly InternalBus _bus; - private readonly RoutingKey _routingKey = new("MyTopic"); - private readonly RoutingKey _deadLetterKey = new("MyDeadLetterTopic"); - private readonly FakeTimeProvider _timeProvider = new FakeTimeProvider(); - - public AsyncMessagePumpUnacceptableMessageDeadLetterChannelTests() - { - SpyRequeueCommandProcessor commandProcessor = new(); - - _bus = new InternalBus(); - - _channel = new ChannelAsync( - new(Channel), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, deadLetterTopic: _deadLetterKey, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); - messageMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) + private const string Channel = "MyChannel"; + private readonly IAmAMessagePump _messagePump; + private readonly ChannelAsync _channel; + private readonly InternalBus _bus; + private readonly RoutingKey _routingKey = new("MyTopic"); + private readonly RoutingKey _deadLetterKey = new("MyDeadLetterTopic"); + private readonly FakeTimeProvider _timeProvider = new FakeTimeProvider(); + public AsyncMessagePumpUnacceptableMessageDeadLetterChannelTests() { - Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = 3 - }; - - var myMessage = JsonSerializer.Serialize(new MyEvent()); - var unacceptableMessage = - new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody(myMessage)); - - _bus.Enqueue(unacceptableMessage); - - } - - [Fact] - public async Task When_An_Unacceptable_Message_Is_Recieved() - { - var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); - await Task.Delay(1000); // slopwatch:suppress SW004 - message pump runs on background thread with no sync point - - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - - var quitMessage = new Message( - new MessageHeader(string.Empty, RoutingKey.Empty, MessageType.MT_QUIT), - new MessageBody("") - ); - _channel.Enqueue(quitMessage); - - await Task.WhenAll(new[] { task }); - - //should_acknowledge_the_message - Assert.Empty(_bus.Stream(_routingKey)); - Assert.NotEmpty(_bus.Stream(_deadLetterKey)); - } + SpyRequeueCommandProcessor commandProcessor = new(); + _bus = new InternalBus(); + _channel = new ChannelAsync(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, deadLetterTopic: _deadLetterKey, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); + messageMapperRegistry.RegisterAsync(); + _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) + { + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = 3 + }; + var myMessage = JsonSerializer.Serialize(new MyEvent()); + var unacceptableMessage = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody(myMessage)); + _bus.Enqueue(unacceptableMessage); + } + + [Test] + public async Task When_An_Unacceptable_Message_Is_Recieved() + { + var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); + await Task.Delay(1000); // slopwatch:suppress SW004 - message pump runs on background thread with no sync point + _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages + var quitMessage = new Message(new MessageHeader(string.Empty, RoutingKey.Empty, MessageType.MT_QUIT), new MessageBody("")); + _channel.Enqueue(quitMessage); + await Task.WhenAll(new[] { task }); + //should_acknowledge_the_message + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + await Assert.That(_bus.Stream(_deadLetterKey)).IsNotEmpty(); + } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_unacceptable_message_is_recieved_async_and_there_is_an_imc.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_unacceptable_message_is_recieved_async_and_there_is_an_imc.cs index 3d81a5c4f0..d2acaf19d3 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_unacceptable_message_is_recieved_async_and_there_is_an_imc.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_unacceptable_message_is_recieved_async_and_there_is_an_imc.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Text.Json; using System.Threading.Tasks; @@ -30,10 +28,8 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor; - public class AsyncMessagePumpUnacceptableMessageInvalidMessageChannelTests { private const string Channel = "MyChannel"; @@ -43,56 +39,35 @@ public class AsyncMessagePumpUnacceptableMessageInvalidMessageChannelTests private readonly RoutingKey _routingKey = new("MyTopic"); private readonly RoutingKey _invalidMessageKey = new("MyDeadLetterTopic"); private readonly FakeTimeProvider _timeProvider = new FakeTimeProvider(); - public AsyncMessagePumpUnacceptableMessageInvalidMessageChannelTests() { SpyRequeueCommandProcessor commandProcessor = new(); - _bus = new InternalBus(); - - _channel = new ChannelAsync( - new(Channel), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, invalidMessageTopic: _invalidMessageKey, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); + _channel = new ChannelAsync(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, invalidMessageTopic: _invalidMessageKey, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) + _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) { - Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = 3 + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = 3 }; - var myMessage = JsonSerializer.Serialize(new MyEvent()); - var unacceptableMessage = - new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody(myMessage)); - + var unacceptableMessage = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody(myMessage)); _bus.Enqueue(unacceptableMessage); - } - [Fact] + [Test] public async Task When_An_Unacceptable_Message_Is_Recieved() { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); await Task.Delay(1000); // slopwatch:suppress SW004 - message pump runs on background thread with no sync point - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - - var quitMessage = new Message( - new MessageHeader(string.Empty, RoutingKey.Empty, MessageType.MT_QUIT), - new MessageBody("") - ); + var quitMessage = new Message(new MessageHeader(string.Empty, RoutingKey.Empty, MessageType.MT_QUIT), new MessageBody("")); _channel.Enqueue(quitMessage); - await Task.WhenAll(new[] { task }); - //should_acknowledge_the_message - Assert.Empty(_bus.Stream(_routingKey)); - Assert.NotEmpty(_bus.Stream(_invalidMessageKey)); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + await Assert.That(_bus.Stream(_invalidMessageKey)).IsNotEmpty(); } } \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_unacceptable_message_limit_is_reached_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_unacceptable_message_limit_is_reached_async.cs index 10aed5578a..30d7d0eb6a 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_unacceptable_message_limit_is_reached_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_unacceptable_message_limit_is_reached_async.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -29,71 +27,45 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor; - public class MessagePumpUnacceptableMessageLimitBreachedAsyncTests { private readonly IAmAMessagePump _messagePump; private readonly InternalBus _bus = new(); private readonly RoutingKey _routingKey = new("MyTopic"); private readonly FakeTimeProvider _timeProvider = new(); - public MessagePumpUnacceptableMessageLimitBreachedAsyncTests() { SpyRequeueCommandProcessor commandProcessor = new(); - var channel = new ChannelAsync(new("MyChannel"), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), 3); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, null, new InMemoryRequestContextFactory(), channel, - timeProvider:_timeProvider) + _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, null, new InMemoryRequestContextFactory(), channel, timeProvider: _timeProvider) { - Channel = channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = 3, UnacceptableMessageLimit = 3, - UnacceptableMessageLimitWindow = TimeSpan.FromMinutes(1) + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = 3, + UnacceptableMessageLimit = 3, + UnacceptableMessageLimitWindow = TimeSpan.FromMinutes(1) }; - - var unacceptableMessage1 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody("") - ); - var unacceptableMessage2 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody("") - ); - var unacceptableMessage3 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody("") - ); - var unacceptableMessage4 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody("") - ); - + var unacceptableMessage1 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody("")); + var unacceptableMessage2 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody("")); + var unacceptableMessage3 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody("")); + var unacceptableMessage4 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody("")); channel.Enqueue(unacceptableMessage1); channel.Enqueue(unacceptableMessage2); channel.Enqueue(unacceptableMessage3); channel.Enqueue(unacceptableMessage4); - } - [Fact] + [Test] public async Task When_An_Unacceptable_Message_Limit_Is_Reached() { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - await Task.WhenAll(task); - - Assert.Empty(_bus.Stream(_routingKey)); - - Assert.Equal(MessagePumpStatus.MP_LIMIT_EXCEEDED, _messagePump.Status); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + await Assert.That(_messagePump.Status).IsEqualTo(MessagePumpStatus.MP_LIMIT_EXCEEDED); } } \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_unacceptable_message_limit_is_reset_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_unacceptable_message_limit_is_reset_async.cs index c4263f7d2b..37c2262904 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_unacceptable_message_limit_is_reset_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_an_unacceptable_message_limit_is_reset_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; @@ -6,7 +6,6 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { @@ -23,103 +22,48 @@ public class MessagePumpUnacceptableMessageLimitResetTestsAsync private readonly Message _unacceptableMessage3; private readonly Message _unacceptableMessage4; private readonly Message _timeAdvanceMessage; - public MessagePumpUnacceptableMessageLimitResetTestsAsync() { _bus = new InternalBus(); - - _channel = new ChannelAsync( - new(Channel), - _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), - 10 - ); - + _channel = new ChannelAsync(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), 10); var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.RegisterAsync(); - - var handlerFactory = new SimpleHandlerFactory( - (type) => throw new NotImplementedException(), - (type) => new MyAdvanceTimerEventHandlerAsync(_timeProvider) - ); - + var handlerFactory = new SimpleHandlerFactory((type) => throw new NotImplementedException(), (type) => new MyAdvanceTimerEventHandlerAsync(_timeProvider)); var resiliencePipelineRegistry = new ResiliencePipelineRegistry(); - resiliencePipelineRegistry.AddBrighterDefault(); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => throw new NotImplementedException() ), - new SimpleMessageMapperFactoryAsync(_ => new MyAdvanceTimerEventMessageMapperAsync())); + resiliencePipelineRegistry.AddBrighterDefault(); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => throw new NotImplementedException()), new SimpleMessageMapperFactoryAsync(_ => new MyAdvanceTimerEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - var commandProcessor = new CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - resiliencePipelineRegistry, - new InMemorySchedulerFactory() - ); - - _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyAdvanceTimerEvent), - messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), _channel, - timeProvider:_timeProvider) + var commandProcessor = new CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), resiliencePipelineRegistry, new InMemorySchedulerFactory()); + _messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyAdvanceTimerEvent), messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), _channel, timeProvider: _timeProvider) { - Channel = _channel, - TimeOut = TimeSpan.FromMilliseconds(5000), - RequeueCount = 3, - UnacceptableMessageLimit = 3, + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = 3, + UnacceptableMessageLimit = 3, UnacceptableMessageLimitWindow = TimeSpan.FromMinutes(1) }; - - _unacceptableMessage1 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody("") - ); - _unacceptableMessage2 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody("") - ); - _unacceptableMessage3 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody("") - ); - _unacceptableMessage4 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody("") - ); - - _timeAdvanceMessage = new MyAdvanceTimerEventMessageMapper().MapToMessage( - new MyAdvanceTimerEvent(2), - new Publication - { - Topic = _routingKey - }); - + _unacceptableMessage1 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody("")); + _unacceptableMessage2 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody("")); + _unacceptableMessage3 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody("")); + _unacceptableMessage4 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody("")); + _timeAdvanceMessage = new MyAdvanceTimerEventMessageMapper().MapToMessage(new MyAdvanceTimerEvent(2), new Publication { Topic = _routingKey }); } - [Fact] + [Test] public async Task When_An_Unacceptable_Message_Limit_Is_Reached() { _channel.Enqueue(_unacceptableMessage1); _channel.Enqueue(_unacceptableMessage2); - //force the time forward, whilst in the message loop _channel.Enqueue(_timeAdvanceMessage); - //will trigger reset of unacceptable message count as window has passed _channel.Enqueue(_unacceptableMessage3); _channel.Enqueue(_unacceptableMessage4); - var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); - _channel.Stop(_routingKey); - await Task.WhenAll(task); - - Assert.Empty(_bus.Stream(_routingKey)); - - Assert.Equal(MessagePumpStatus.MP_STOPPED, _messagePump.Status); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + await Assert.That(_messagePump.Status).IsEqualTo(MessagePumpStatus.MP_STOPPED); } } -} - +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_channel_async_dispose_async_should_await_consumer_dispose.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_channel_async_dispose_async_should_await_consumer_dispose.cs index 1f40437a72..08e78ed2d0 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_channel_async_dispose_async_should_await_consumer_dispose.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_channel_async_dispose_async_should_await_consumer_dispose.cs @@ -1,41 +1,33 @@ using System; using System.Threading; using System.Threading.Tasks; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor; - public class AsyncChannelDisposalTests { - [Fact] + [Test] public async Task When_ChannelAsync_Is_Disposed_Async_Then_Consumer_Is_Disposed() { // Arrange var consumer = new SpyMessageConsumer(); - var channel = new ChannelAsync( - new ChannelName("test-channel"), - new RoutingKey("test.topic"), - consumer - ); - + var channel = new ChannelAsync(new ChannelName("test-channel"), new RoutingKey("test.topic"), consumer); // Act await ((IAsyncDisposable)channel).DisposeAsync(); - // Assert — consumer's DisposeAsync was actually called - Assert.True(consumer.DisposeAsyncCalled, "ChannelAsync.DisposeAsync should call DisposeAsync on the consumer"); - + await Assert.That(consumer.DisposeAsyncCalled).IsTrue(); // Assert — idempotent: second dispose does not throw - var exception = await Record.ExceptionAsync(async () => - await ((IAsyncDisposable)channel).DisposeAsync() - ); - Assert.Null(exception); + Exception? exception = null; + try { await ((IAsyncDisposable)channel).DisposeAsync(); } + catch (Exception e) { exception = e; } + + await Assert.That(exception).IsNull(); } } /// /// Minimal spy consumer that tracks whether DisposeAsync was called. /// -internal sealed class SpyMessageConsumer : IAmAMessageConsumerAsync +internal sealed class SpyMessageConsumer : Paramore.Brighter.IAmAMessageConsumerAsync, System.IAsyncDisposable { public bool DisposeAsyncCalled { get; private set; } @@ -45,21 +37,10 @@ public ValueTask DisposeAsync() return ValueTask.CompletedTask; } - public Task ReceiveAsync(TimeSpan? timeOut = null, CancellationToken cancellationToken = default) - => Task.FromResult(Array.Empty()); - - public Task AcknowledgeAsync(Message message, CancellationToken cancellationToken = default) - => Task.CompletedTask; - - public Task RejectAsync(Message message, MessageRejectionReason? reason = null, CancellationToken cancellationToken = default) - => Task.FromResult(true); - - public Task NackAsync(Message message, CancellationToken cancellationToken = default) - => Task.CompletedTask; - - public Task PurgeAsync(CancellationToken cancellationToken = default) - => Task.CompletedTask; - - public Task RequeueAsync(Message message, TimeSpan? delay = null, CancellationToken cancellationToken = default) - => Task.FromResult(true); -} + public Task ReceiveAsync(TimeSpan? timeOut = null, CancellationToken cancellationToken = default) => Task.FromResult(Array.Empty()); + public Task AcknowledgeAsync(Message message, CancellationToken cancellationToken = default) => Task.CompletedTask; + public Task RejectAsync(Message message, MessageRejectionReason? reason = null, CancellationToken cancellationToken = default) => Task.FromResult(true); + public Task NackAsync(Message message, CancellationToken cancellationToken = default) => Task.CompletedTask; + public Task PurgeAsync(CancellationToken cancellationToken = default) => Task.CompletedTask; + public Task RequeueAsync(Message message, TimeSpan? delay = null, CancellationToken cancellationToken = default) => Task.FromResult(true); +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_proactor_receives_quit_should_dispose_channel_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_proactor_receives_quit_should_dispose_channel_async.cs index e07cb43746..e2fa26001a 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_proactor_receives_quit_should_dispose_channel_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_proactor_receives_quit_should_dispose_channel_async.cs @@ -7,10 +7,8 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor; - public class ProactorQuitAsyncDisposalTests { private readonly RoutingKey _routingKey = new("test.topic"); @@ -18,59 +16,36 @@ public class ProactorQuitAsyncDisposalTests private readonly FakeTimeProvider _timeProvider = new(); private readonly Task _performerTask; private readonly TrackingChannelAsync _trackingChannel; - public ProactorQuitAsyncDisposalTests() { // Arrange var commandProcessor = new SpyCommandProcessor(); var consumer = new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)); - _trackingChannel = new TrackingChannelAsync( - new ChannelName("test-channel"), - _routingKey, - consumer - ); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); + _trackingChannel = new TrackingChannelAsync(new ChannelName("test-channel"), _routingKey, consumer); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - var messagePump = new Brighter.ServiceActivator.Proactor( - commandProcessor, - message => typeof(MyEvent), - messageMapperRegistry, - new EmptyMessageTransformerFactoryAsync(), - new InMemoryRequestContextFactory(), - _trackingChannel - ); + var messagePump = new Brighter.ServiceActivator.Proactor(commandProcessor, message => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), _trackingChannel); messagePump.TimeOut = TimeSpan.FromMilliseconds(5000); - // Enqueue a message followed by a quit var @event = new MyEvent(); - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options)) - ); + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); _trackingChannel.Enqueue(message); - // Act — start the performer and stop it (enqueues MT_QUIT) var performer = new Performer(_trackingChannel, messagePump); _performerTask = performer.Run(); performer.Stop(_routingKey); } - [Fact] + [Test] public async Task When_Proactor_Receives_Quit_Should_Dispose_Channel_Async() { // Assert — the performer task should complete cleanly await _performerTask.WaitAsync(TimeSpan.FromSeconds(10)); - - Assert.True(_performerTask.IsCompleted); - Assert.False(_performerTask.IsFaulted); - Assert.False(_performerTask.IsCanceled); - + await Assert.That(_performerTask.IsCompleted).IsTrue(); + await Assert.That(_performerTask.IsFaulted).IsFalse(); + await Assert.That(_performerTask.IsCanceled).IsFalse(); // Assert — the Proactor should have called DisposeAsync, not Dispose - Assert.True(_trackingChannel.DisposeAsyncCalled, "Proactor should call DisposeAsync on MT_QUIT, not Dispose"); + await Assert.That(_trackingChannel.DisposeAsyncCalled).IsTrue(); } } @@ -78,8 +53,7 @@ public async Task When_Proactor_Receives_Quit_Should_Dispose_Channel_Async() /// A ChannelAsync subclass that tracks whether DisposeAsync or Dispose was called. /// Used to verify the Proactor uses the async dispose path. /// -internal sealed class TrackingChannelAsync(ChannelName channelName, RoutingKey routingKey, IAmAMessageConsumerAsync messageConsumer) - : ChannelAsync(channelName, routingKey, messageConsumer) +internal sealed class TrackingChannelAsync(ChannelName channelName, RoutingKey routingKey, IAmAMessageConsumerAsync messageConsumer) : Paramore.Brighter.ChannelAsync(channelName, routingKey, messageConsumer), Paramore.Brighter.IAmAChannelAsync, Paramore.Brighter.IAmAChannel, System.IDisposable, System.IAsyncDisposable { public bool DisposeAsyncCalled { get; private set; } @@ -88,4 +62,4 @@ public override async ValueTask DisposeAsync() DisposeAsyncCalled = true; await base.DisposeAsync(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_proactor_shutdown_inside_async_context_should_not_deadlock.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_proactor_shutdown_inside_async_context_should_not_deadlock.cs index f986d7e88f..5e8d44d260 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_proactor_shutdown_inside_async_context_should_not_deadlock.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_proactor_shutdown_inside_async_context_should_not_deadlock.cs @@ -8,10 +8,8 @@ using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.Tasks; using Paramore.Brighter.Testing; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor; - /// /// Regression test for the deadlock scenario described in issue #3684. /// A Proactor running inside BrighterAsyncContext.Run() must be able to @@ -21,48 +19,26 @@ namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor; /// public class ProactorShutdownInsideAsyncContextTests { - [Fact] - public void When_Proactor_Shuts_Down_Inside_BrighterAsyncContext_Should_Not_Deadlock() + [Test] + public async Task When_Proactor_Shuts_Down_Inside_BrighterAsyncContext_Should_Not_Deadlock() { // Arrange var routingKey = new RoutingKey("test.deadlock.topic"); var bus = new InternalBus(); var timeProvider = new FakeTimeProvider(); - var commandProcessor = new SpyCommandProcessor(); var consumer = new InMemoryMessageConsumer(routingKey, bus, timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)); - // Use a channel whose DisposeAsync does real async work (Task.Yield) // to force continuations back onto the scheduler - var channel = new AsyncContinuationChannelAsync( - new ChannelName("test-deadlock-channel"), - routingKey, - consumer - ); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); + var channel = new AsyncContinuationChannelAsync(new ChannelName("test-deadlock-channel"), routingKey, consumer); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - var messagePump = new Brighter.ServiceActivator.Proactor( - commandProcessor, - message => typeof(MyEvent), - messageMapperRegistry, - new EmptyMessageTransformerFactoryAsync(), - new InMemoryRequestContextFactory(), - channel - ); + var messagePump = new Brighter.ServiceActivator.Proactor(commandProcessor, message => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), channel); messagePump.TimeOut = TimeSpan.FromMilliseconds(5000); - // Enqueue a message followed by a quit var @event = new MyEvent(); - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options)) - ); + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); channel.Enqueue(message); - // Act — run the entire Proactor lifecycle inside BrighterAsyncContext.Run(). // If the async dispose path uses sync-over-async (.Wait() / .GetResult()), // this will deadlock because continuations cannot be scheduled back onto the @@ -77,12 +53,10 @@ public void When_Proactor_Shuts_Down_Inside_BrighterAsyncContext_Should_Not_Dead await task; }); }); - // Assert — the performer must complete within a reasonable timeout. // A deadlock would cause this to hang indefinitely. - bool finishedInTime = completed.Wait(TimeSpan.FromSeconds(30)); - Assert.True(finishedInTime, "Proactor shutdown deadlocked inside BrighterAsyncContext.Run()"); - Assert.True(channel.DisposeAsyncCalled, "Proactor should call DisposeAsync, not Dispose"); + await completed.WaitAsync(TimeSpan.FromSeconds(30)); + await Assert.That(channel.DisposeAsyncCalled).IsTrue(); } } @@ -91,23 +65,17 @@ public void When_Proactor_Shuts_Down_Inside_BrighterAsyncContext_Should_Not_Dead /// to ensure continuations are posted back to the scheduler. This is the /// scenario that triggers a deadlock if the dispose path uses sync-over-async. /// -internal sealed class AsyncContinuationChannelAsync( - ChannelName channelName, - RoutingKey routingKey, - IAmAMessageConsumerAsync messageConsumer) - : ChannelAsync(channelName, routingKey, messageConsumer) +internal sealed class AsyncContinuationChannelAsync(ChannelName channelName, RoutingKey routingKey, IAmAMessageConsumerAsync messageConsumer) : Paramore.Brighter.ChannelAsync(channelName, routingKey, messageConsumer), Paramore.Brighter.IAmAChannelAsync, Paramore.Brighter.IAmAChannel, System.IDisposable, System.IAsyncDisposable { public bool DisposeAsyncCalled { get; private set; } public override async ValueTask DisposeAsync() { DisposeAsyncCalled = true; - // Force an async continuation — this is the key part. // If the caller is blocking synchronously on a single-threaded context, // this yield will deadlock because the continuation can't be scheduled. await Task.Yield(); - await base.DisposeAsync(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_reading_a__dynamic_message_from_a_channel_pump_out_to_command_processor.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_reading_a__dynamic_message_from_a_channel_pump_out_to_command_processor.cs index 8996501a9b..8a4a743131 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_reading_a__dynamic_message_from_a_channel_pump_out_to_command_processor.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_reading_a__dynamic_message_from_a_channel_pump_out_to_command_processor.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text.Json; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; @@ -6,7 +6,6 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -14,93 +13,68 @@ public class MessagePumpToCommandProcessorDynamicMappingTestsAsync { private const string Channel = "MyChannel"; private readonly RoutingKey _routingKey = new("MyTopic"); - private readonly InternalBus _bus = new (); + private readonly InternalBus _bus = new(); private readonly FakeTimeProvider _timeProvider = new(); private readonly IAmAMessagePump _messagePump; private readonly SpyCommandProcessor _commandProcessor; private readonly ChannelAsync _channel; - public MessagePumpToCommandProcessorDynamicMappingTestsAsync() { _commandProcessor = new SpyCommandProcessor(); - _channel = new( - new(Channel), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - - var messagerMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(type => - type switch - { - var t when t == typeof(MyEventMessageMapperAsync) => new MyEventMessageMapperAsync(), - var t when t == typeof(MyOtherEventMessageMapperAsync) => new MyOtherEventMessageMapperAsync(), - _ => throw new ArgumentException($"No mapper registered for type {type.FullName}", nameof(type)) - })); + _channel = new(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messagerMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(type => type switch + { + var t when t == typeof(MyEventMessageMapperAsync) => new MyEventMessageMapperAsync(), + var t when t == typeof(MyOtherEventMessageMapperAsync) => new MyOtherEventMessageMapperAsync(), + _ => throw new ArgumentException($"No mapper registered for type {type.FullName}", nameof(type))})); messagerMapperRegistry.RegisterAsync(); messagerMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor(_commandProcessor, (message) => - message switch - { - var m when m.Header.Type == new CloudEventsType("io.brighter.paramore.myevent") => typeof(MyEvent), - var m when m.Header.Type == new CloudEventsType("io.brighter.paramore.myotherevent") => typeof(MyOtherEvent), - _ => throw new ArgumentException($"No type mapping found for message with type {message.Header.Type}", nameof(message)), - }, - messagerMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), _channel) - { Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000) }; + _messagePump = new ServiceActivator.Proactor(_commandProcessor, (message) => message switch + { + var m when m.Header.Type == new CloudEventsType("io.brighter.paramore.myevent") => typeof(MyEvent), + var m when m.Header.Type == new CloudEventsType("io.brighter.paramore.myotherevent") => typeof(MyOtherEvent), + _ => throw new ArgumentException($"No type mapping found for message with type {message.Header.Type}", nameof(message)), + }, messagerMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), _channel) + { + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000) + }; } - [Fact] - public void When_Reading_A_MyOtherEvent_Message_From_A_Channel_Pump_Out_To_Command_Processor() + [Test] + public async Task When_Reading_A_MyOtherEvent_Message_From_A_Channel_Pump_Out_To_Command_Processor() { //arrange var @event = new MyEvent(); //although we send a MyEvent, we will map it dynamically to a MyOtherEvent - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT, type: new CloudEventsType("io.brighter.paramore.myotherevent") ), - new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options)) - ); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT, type: new CloudEventsType("io.brighter.paramore.myotherevent")), new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); _channel.Enqueue(message); var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); _channel.Enqueue(quitMessage); - //act _messagePump.Run(); - //assert - - Assert.Equal(CommandType.PublishAsync, _commandProcessor.Commands[0]); + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.PublishAsync); var myOtherEvent = _commandProcessor.Observe(); - Assert.Equal(@event.Id, myOtherEvent.Id); - Assert.Equal(@event.Data, myOtherEvent.Data); + await Assert.That(myOtherEvent.Id).IsEqualTo(@event.Id); + await Assert.That(myOtherEvent.Data).IsEqualTo(@event.Data); } - - [Fact] - public void When_Reading_A_MyEvent_Message_From_A_Channel_Pump_Out_To_Command_Processor() + + [Test] + public async Task When_Reading_A_MyEvent_Message_From_A_Channel_Pump_Out_To_Command_Processor() { //arrange var @event = new MyEvent(); //we send a MyEvent, we will map it dynamically to a MyEvent - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT, type: new CloudEventsType("io.brighter.paramore.myevent") ), - new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options)) - ); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT, type: new CloudEventsType("io.brighter.paramore.myevent")), new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); _channel.Enqueue(message); var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); _channel.Enqueue(quitMessage); - //act _messagePump.Run(); - //assert - - Assert.Equal(CommandType.PublishAsync, _commandProcessor.Commands[0]); + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.PublishAsync); var myEvent = _commandProcessor.Observe(); - Assert.Equal(@event.Id, myEvent.Id); - Assert.Equal(@event.Data, myEvent.Data); + await Assert.That(myEvent.Id).IsEqualTo(@event.Id); + await Assert.That(myEvent.Data).IsEqualTo(@event.Data); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_reading_a_message_from_a_channel_pump_out_to_command_processor_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_reading_a_message_from_a_channel_pump_out_to_command_processor_async.cs index c0a604e8b8..552cd4fec8 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_reading_a_message_from_a_channel_pump_out_to_command_processor_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_reading_a_message_from_a_channel_pump_out_to_command_processor_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text.Json; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; @@ -6,7 +6,6 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { @@ -19,45 +18,33 @@ public class MessagePumpToCommandProcessorTestsAsync private readonly IAmAMessagePump _messagePump; private readonly SpyCommandProcessor _commandProcessor; private readonly MyEvent _event; - public MessagePumpToCommandProcessorTestsAsync() { _commandProcessor = new SpyCommandProcessor(); - ChannelAsync channel = new( - new(Channel), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - var messagerMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); + ChannelAsync channel = new(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messagerMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); messagerMapperRegistry.RegisterAsync(); - - _messagePump = new ServiceActivator.Proactor(_commandProcessor, (message) => typeof(MyEvent), - messagerMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), channel) - { Channel = channel, TimeOut = TimeSpan.FromMilliseconds(5000) }; - + _messagePump = new ServiceActivator.Proactor(_commandProcessor, (message) => typeof(MyEvent), messagerMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), channel) + { + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(5000) + }; _event = new MyEvent(); - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize(_event, JsonSerialisationOptions.Options)) - ); + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(_event, JsonSerialisationOptions.Options))); channel.Enqueue(message); var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); channel.Enqueue(quitMessage); - } - [Fact] - public void When_Reading_A_Message_From_A_Channel_Pump_Out_To_Command_Processor() + [Test] + public async Task When_Reading_A_Message_From_A_Channel_Pump_Out_To_Command_Processor() { //although run does not return a Task, it will process handler and mapper asynchronously, using our //synchronization context. Messages should retain ordering of callbacks, so our test message should be processed //before we quit _messagePump.Run(); - - Assert.Equal(CommandType.PublishAsync, _commandProcessor.Commands[0]); - Assert.Equal(_event, _commandProcessor.Observe()); + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.PublishAsync); + await Assert.That(_commandProcessor.Observe()).IsEqualTo(_event); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_running_a_message_pump_on_a_thread_should_be_able_to_stop_async.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_running_a_message_pump_on_a_thread_should_be_able_to_stop_async.cs index 199a86010f..9ee8fad1bd 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_running_a_message_pump_on_a_thread_should_be_able_to_stop_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Proactor/When_running_a_message_pump_on_a_thread_should_be_able_to_stop_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text.Json; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -7,7 +7,6 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Proactor { @@ -18,48 +17,31 @@ public class PerformerCanStopTestsAsync private readonly InternalBus _bus = new(); private readonly FakeTimeProvider _timeProvider = new(); private readonly Task _performerTask; - public PerformerCanStopTestsAsync() { SpyCommandProcessor commandProcessor = new(); - ChannelAsync channel = new( - new(Channel), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); + ChannelAsync channel = new(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - - var messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, - new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), channel); + var messagePump = new ServiceActivator.Proactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactoryAsync(), new InMemoryRequestContextFactory(), channel); messagePump.Channel = channel; messagePump.TimeOut = TimeSpan.FromMilliseconds(5000); - var @event = new MyEvent(); - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options)) - ); + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); channel.Enqueue(message); - Performer performer = new(channel, messagePump); _performerTask = performer.Run(); performer.Stop(_routingKey); } - -#pragma warning disable xUnit1031 - [Fact] - public void When_Running_A_Message_Pump_On_A_Thread_Should_Be_Able_To_Stop() - { - _performerTask.Wait(); - Assert.True(_performerTask.IsCompleted); - Assert.False(_performerTask.IsFaulted); - Assert.False(_performerTask.IsCanceled); - Assert.Empty(_bus.Stream(_routingKey)); + [Test] + public async Task When_Running_A_Message_Pump_On_A_Thread_Should_Be_Able_To_Stop() + { + await _performerTask; + await Assert.That(_performerTask.IsCompleted).IsTrue(); + await Assert.That(_performerTask.IsFaulted).IsFalse(); + await Assert.That(_performerTask.IsCanceled).IsFalse(); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); } -#pragma warning restore xUnit1031 } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_channel_failure_exception_is_thrown_for_command_should_retry_until_connection_re_established.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_channel_failure_exception_is_thrown_for_command_should_retry_until_connection_re_established.cs index 76919e1971..7469f90cf8 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_channel_failure_exception_is_thrown_for_command_should_retry_until_connection_re_established.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_channel_failure_exception_is_thrown_for_command_should_retry_until_connection_re_established.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Text.Json; using Microsoft.Extensions.Time.Testing; @@ -7,7 +7,6 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -19,56 +18,40 @@ public class MessagePumpRetryCommandOnConnectionFailureTests private readonly FakeTimeProvider _timeProvider = new(); private readonly IAmAMessagePump _messagePump; private readonly SpyCommandProcessor _commandProcessor; - public MessagePumpRetryCommandOnConnectionFailureTests() { _commandProcessor = new SpyCommandProcessor(); - var channel = new FailingChannel( - new ChannelName(ChannelName), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), - 2) + var channel = new FailingChannel(new ChannelName(ChannelName), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), 2) { NumberOfRetries = 1 }; - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), - null); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - _messagePump = new ServiceActivator.Reactor(_commandProcessor, (message) => typeof(MyCommand), - messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel) + _messagePump = new ServiceActivator.Reactor(_commandProcessor, (message) => typeof(MyCommand), messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel) { - Channel = channel, TimeOut = TimeSpan.FromMilliseconds(500), RequeueCount = -1 + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(500), + RequeueCount = -1 }; - var command = new MyCommand(); - //two command, will be received when subscription restored - var message1 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(command, JsonSerialisationOptions.Options)) - ); - var message2 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(command, JsonSerialisationOptions.Options)) - ); + var message1 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))); + var message2 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))); channel.Enqueue(message1); channel.Enqueue(message2); - //end the pump var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); channel.Enqueue(quitMessage); - } - [Fact] - public void When_A_Channel_Failure_Exception_Is_Thrown_For_Command_Should_Retry_Until_Connection_Re_established() + [Test] + public async Task When_A_Channel_Failure_Exception_Is_Thrown_For_Command_Should_Retry_Until_Connection_Re_established() { _messagePump.Run(); - //Should send the message via the command processor - Assert.Equal(2, _commandProcessor.Commands.Count); - Assert.Equal(CommandType.Send, _commandProcessor.Commands[0]); - Assert.Equal(CommandType.Send, _commandProcessor.Commands[1]); + await Assert.That(_commandProcessor.Commands.Count).IsEqualTo(2); + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.Send); + await Assert.That(_commandProcessor.Commands[1]).IsEqualTo(CommandType.Send); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_channel_failure_exception_is_thrown_for_event_should_retry_until_connection_re_established.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_channel_failure_exception_is_thrown_for_event_should_retry_until_connection_re_established.cs index a94dea1d0c..e523fbab94 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_channel_failure_exception_is_thrown_for_event_should_retry_until_connection_re_established.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_channel_failure_exception_is_thrown_for_event_should_retry_until_connection_re_established.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Text.Json; using Microsoft.Extensions.Time.Testing; @@ -7,7 +7,6 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -18,59 +17,40 @@ public class MessagePumpRetryEventConnectionFailureTests private readonly FakeTimeProvider _timeProvider = new(); private readonly IAmAMessagePump _messagePump; private readonly SpyCommandProcessor _commandProcessor; - public MessagePumpRetryEventConnectionFailureTests() { _commandProcessor = new SpyCommandProcessor(); - var channel = new FailingChannel( - new ChannelName("myChannel"), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), - 2) + var channel = new FailingChannel(new ChannelName("myChannel"), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), 2) { NumberOfRetries = 1 }; - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), - null); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - - _messagePump = new ServiceActivator.Reactor(_commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel) + _messagePump = new ServiceActivator.Reactor(_commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel) { - Channel = channel, TimeOut = TimeSpan.FromMilliseconds(500), RequeueCount = -1 + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(500), + RequeueCount = -1 }; - var @event = new MyEvent(); - //Two events will be received when channel fixed - var message1 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options)) - ); - var message2 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options)) - ); + var message1 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); + var message2 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); channel.Enqueue(message1); channel.Enqueue(message2); - //Quit the message pump var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); channel.Enqueue(quitMessage); - } - [Fact] - public void When_A_Channel_Failure_Exception_Is_Thrown_For_Event_Should_Retry_Until_Connection_Re_established() + [Test] + public async Task When_A_Channel_Failure_Exception_Is_Thrown_For_Event_Should_Retry_Until_Connection_Re_established() { _messagePump.Run(); - //_should_publish_the_message_via_the_command_processor - Assert.Equal(2, _commandProcessor.Commands.Count); - Assert.Equal(CommandType.Publish, _commandProcessor.Commands[0]); - Assert.Equal(CommandType.Publish, _commandProcessor.Commands[1]); + await Assert.That(_commandProcessor.Commands.Count).IsEqualTo(2); + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.Publish); + await Assert.That(_commandProcessor.Commands[1]).IsEqualTo(CommandType.Publish); } - } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_command_handler_throws_a_defer_message_Then_message_is_requeued_until_rejected.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_command_handler_throws_a_defer_message_Then_message_is_requeued_until_rejected.cs index 604787ffb5..5200c6b17b 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_command_handler_throws_a_defer_message_Then_message_is_requeued_until_rejected.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_command_handler_throws_a_defer_message_Then_message_is_requeued_until_rejected.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -29,7 +27,6 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -41,47 +38,32 @@ public class MessagePumpCommandProcessingDeferMessageActionTests private readonly InternalBus _bus = new(); private readonly RoutingKey _routingKey = new("MyCommand"); private readonly FakeTimeProvider _timeProvider = new(); - public MessagePumpCommandProcessingDeferMessageActionTests() { SpyRequeueCommandProcessor commandProcessor = new(); - _channel = new Channel(new("myChannel"), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), - null); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - - _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyCommand), - messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) + _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyCommand), messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) { - Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = _requeueCount + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = _requeueCount }; - - var msg = new TransformPipelineBuilder(messageMapperRegistry, null) - .BuildWrapPipeline() - .Wrap(new MyCommand(), new RequestContext(), new Publication{Topic = _routingKey}); - + var msg = new TransformPipelineBuilder(messageMapperRegistry, null).BuildWrapPipeline().Wrap(new MyCommand(), new RequestContext(), new Publication { Topic = _routingKey }); _bus.Enqueue(msg); - } - [Fact] + [Test] public async Task When_a_command_handler_throws_a_defer_message_Then_message_is_requeued_until_rejected() { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); await Task.Delay(1000); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); _channel.Enqueue(quitMessage); - await Task.WhenAll(task); - - Assert.Empty(_bus.Stream(_routingKey)); - + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_command_handler_throws_unhandled_exception_Then_message_is_acked.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_command_handler_throws_unhandled_exception_Then_message_is_acked.cs index 59d978136c..e2c5fda726 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_command_handler_throws_unhandled_exception_Then_message_is_acked.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_command_handler_throws_unhandled_exception_Then_message_is_acked.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; @@ -7,7 +7,6 @@ using Paramore.Brighter.ServiceActivator; using Serilog.Events; using Serilog.Sinks.TestCorrelator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -18,53 +17,37 @@ public class MessagePumpCommandProcessingExceptionTests private readonly int _requeueCount = 5; private readonly RoutingKey _routingKey = new("MyCommand"); private readonly FakeTimeProvider _timeProvider = new(); - public MessagePumpCommandProcessingExceptionTests() { SpyExceptionCommandProcessor commandProcessor = new(); - - InternalBus bus = new(); - _channel = new Channel(new("myChannel"),_routingKey, new InMemoryMessageConsumer(_routingKey, bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), - null); + InternalBus bus = new(); + _channel = new Channel(new("myChannel"), _routingKey, new InMemoryMessageConsumer(_routingKey, bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - - _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyCommand), - messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), _channel) + _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyCommand), messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), _channel) { - Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = _requeueCount + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = _requeueCount }; - - var msg = new TransformPipelineBuilder(messageMapperRegistry, null) - .BuildWrapPipeline() - .Wrap(new MyCommand(), new RequestContext(), new Publication{Topic = _routingKey}); - + var msg = new TransformPipelineBuilder(messageMapperRegistry, null).BuildWrapPipeline().Wrap(new MyCommand(), new RequestContext(), new Publication { Topic = _routingKey }); bus.Enqueue(msg); - } - [Fact] + [Test] public async Task When_a_command_handler_throws_unhandled_exception_Then_message_is_acked() { using (TestCorrelator.CreateContext()) { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); await Task.Delay(1000); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - - var quitMessage = new Message(new MessageHeader(string.Empty, RoutingKey.Empty, MessageType.MT_QUIT), - new MessageBody("")); + var quitMessage = new Message(new MessageHeader(string.Empty, RoutingKey.Empty, MessageType.MT_QUIT), new MessageBody("")); _channel.Enqueue(quitMessage); - await Task.WhenAll(task); - var logEvents = TestCorrelator.GetLogEventsFromCurrentContext(); - Assert.Contains(logEvents, x => x.Level == LogEventLevel.Error && x.MessageTemplate.Text == - "MessagePump: Failed to dispatch message '{Id}' from {ChannelName} with {RoutingKey} on thread # {ManagementThreadId}"); + await Assert.That(logEvents).Contains(x => x.Level == LogEventLevel.Error && x.MessageTemplate.Text == "MessagePump: Failed to dispatch message '{Id}' from {ChannelName} with {RoutingKey} on thread # {ManagementThreadId}"); } } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_handler_throws_dont_ack_action_should_nack_the_message.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_handler_throws_dont_ack_action_should_nack_the_message.cs index a6174f4a58..a3cd1f5c05 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_handler_throws_dont_ack_action_should_nack_the_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_handler_throws_dont_ack_action_should_nack_the_message.cs @@ -8,7 +8,6 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.Testing; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -21,28 +20,13 @@ public class MessagePumpCommandDontAckActionNackTests private readonly IAmAMessagePump _messagePump; private readonly Channel _channel; private readonly SpyDontAckCommandProcessor _commandProcessor; - public MessagePumpCommandDontAckActionNackTests() { _commandProcessor = new SpyDontAckCommandProcessor(); - _channel = new Channel( - new(ChannelName), - _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), - null); + _channel = new Channel(new(ChannelName), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - - _messagePump = new ServiceActivator.Reactor( - _commandProcessor, - (message) => typeof(MyCommand), - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new InMemoryRequestContextFactory(), - _channel) + _messagePump = new ServiceActivator.Reactor(_commandProcessor, (message) => typeof(MyCommand), messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), _channel) { Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), @@ -50,40 +34,30 @@ public MessagePumpCommandDontAckActionNackTests() UnacceptableMessageLimit = -1, DontAckDelay = TimeSpan.FromMilliseconds(100) }; - // Arrange: enqueue one command message to the bus (not channel) // so InMemoryMessageConsumer.Receive locks it in _lockedMessages, // enabling nack to re-enqueue it back to the bus - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(new MyCommand(), JsonSerialisationOptions.Options)) - ); + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(new MyCommand(), JsonSerialisationOptions.Options))); _bus.Enqueue(message); } - [Fact] + [Test] public async Task When_A_Handler_Throws_DontAck_Action_Should_Nack_The_Message() { // Act: run pump in background var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); - // Wait for handler to process the message (DontAckAction thrown) - var handled = _commandProcessor.WaitForHandle(5000); - Assert.True(handled, "Handler should have been called"); - + var handled = await _commandProcessor.WaitForHandleAsync(5000); + await Assert.That(handled).IsTrue(); // Send quit to stop the pump after DontAckAction processing _channel.Enqueue(MessageFactory.CreateQuitMessage(_routingKey)); - await Task.WhenAll(task); - // Assert: handler was called - Assert.True(_commandProcessor.SendCount >= 1); - + await Assert.That(_commandProcessor.SendCount >= 1).IsTrue(); // Assert: pump continued running and processed the quit message - Assert.Equal(MessagePumpStatus.MP_STOPPED, _messagePump.Status); - + await Assert.That(_messagePump.Status).IsEqualTo(MessagePumpStatus.MP_STOPPED); // Assert: message was nacked (re-enqueued to bus, available for redelivery) - Assert.NotEmpty(_bus.Stream(_routingKey)); + await Assert.That(_bus.Stream(_routingKey)).IsNotEmpty(); } } } diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_handler_throws_dont_ack_action_should_not_acknowledge.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_handler_throws_dont_ack_action_should_not_acknowledge.cs index 872a3a932a..0332067788 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_handler_throws_dont_ack_action_should_not_acknowledge.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_handler_throws_dont_ack_action_should_not_acknowledge.cs @@ -7,7 +7,6 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.Testing; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -19,28 +18,13 @@ public class MessagePumpCommandDontAckActionTests private readonly FakeTimeProvider _timeProvider = new(); private readonly IAmAMessagePump _messagePump; private readonly SpyDontAckCommandProcessor _commandProcessor; - public MessagePumpCommandDontAckActionTests() { _commandProcessor = new SpyDontAckCommandProcessor(); - var channel = new Channel( - new(ChannelName), - _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), - null); + var channel = new Channel(new(ChannelName), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - - _messagePump = new ServiceActivator.Reactor( - _commandProcessor, - (message) => typeof(MyCommand), - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new InMemoryRequestContextFactory(), - channel) + _messagePump = new ServiceActivator.Reactor(_commandProcessor, (message) => typeof(MyCommand), messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel) { Channel = channel, TimeOut = TimeSpan.FromMilliseconds(5000), @@ -48,39 +32,31 @@ public MessagePumpCommandDontAckActionTests() UnacceptableMessageLimit = 2, DontAckDelay = TimeSpan.Zero }; - // Arrange: enqueue two command messages (both will trigger DontAckAction) // No quit message — the pump will exit via the unacceptable message limit for (int i = 0; i < 2; i++) { - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(new MyCommand(), JsonSerialisationOptions.Options)) - ); + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(new MyCommand(), JsonSerialisationOptions.Options))); channel.Enqueue(message); } } - [Fact] - public void When_A_Handler_Throws_DontAck_Action_Should_Not_Acknowledge() + [Test] + public async Task When_A_Handler_Throws_DontAck_Action_Should_Not_Acknowledge() { // Act _messagePump.Run(); - // Assert: handler was called for both messages - Assert.Equal(CommandType.Send, _commandProcessor.Commands[0]); - Assert.Equal(2, _commandProcessor.SendCount); - + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.Send); + await Assert.That(_commandProcessor.SendCount).IsEqualTo(2); // Assert: pump continued running after the first DontAckAction // (it processed the second command, proving it didn't crash or stop on the first) - // Assert: unacceptable message count was incremented // The pump exited because the count reached the limit of 2, // which only happens if IncrementUnacceptableMessageCount was called for each DontAckAction - Assert.Equal(MessagePumpStatus.MP_LIMIT_EXCEEDED, _messagePump.Status); - + await Assert.That(_messagePump.Status).IsEqualTo(MessagePumpStatus.MP_LIMIT_EXCEEDED); // Assert: messages were nacked to the bus (available for redelivery) - Assert.NotEmpty(_bus.Stream(_routingKey)); + await Assert.That(_bus.Stream(_routingKey)).IsNotEmpty(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_has_a_new_connection_added_while_running.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_has_a_new_connection_added_while_running.cs index feed2a4c16..ca7c7ed0f2 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_has_a_new_connection_added_while_running.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_has_a_new_connection_added_while_running.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -6,71 +6,56 @@ using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { - public class DispatcherAddNewConnectionTests : IDisposable + public class DispatcherAddNewConnectionTests { private readonly Dispatcher _dispatcher; private readonly Subscription _newSubscription; private readonly InternalBus _bus; private readonly RoutingKey _routingKey = new("MyEvent"); private readonly RoutingKey _routingKeyTwo = new("OtherEvent"); - public DispatcherAddNewConnectionTests() { _bus = new InternalBus(); - IAmACommandProcessor commandProcessor = new SpyCommandProcessor(); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), - null); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - - Subscription subscription = new Subscription( - new SubscriptionName("test"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), - channelFactory: new InMemoryChannelFactory(_bus, TimeProvider.System), channelName: new ChannelName("fakeChannel"), - messagePumpType: MessagePumpType.Reactor, routingKey: _routingKey - ); - - _newSubscription = new Subscription( - new SubscriptionName("newTest"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), - channelFactory: new InMemoryChannelFactory(_bus, TimeProvider.System), - channelName: new ChannelName("fakeChannelTwo"), messagePumpType: MessagePumpType.Reactor, routingKey: _routingKeyTwo); + Subscription subscription = new Subscription(new SubscriptionName("test"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), channelFactory: new InMemoryChannelFactory(_bus, TimeProvider.System), channelName: new ChannelName("fakeChannel"), messagePumpType: MessagePumpType.Reactor, routingKey: _routingKey); + _newSubscription = new Subscription(new SubscriptionName("newTest"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), channelFactory: new InMemoryChannelFactory(_bus, TimeProvider.System), channelName: new ChannelName("fakeChannelTwo"), messagePumpType: MessagePumpType.Reactor, routingKey: _routingKeyTwo); _dispatcher = new Dispatcher(commandProcessor, new List { subscription }, messageMapperRegistry); - var @event = new MyEvent(); - var message = new MyEventMessageMapper().MapToMessage(@event, new Publication{Topic = _routingKey}); + var message = new MyEventMessageMapper().MapToMessage(@event, new Publication { Topic = _routingKey }); _bus.Enqueue(message); + } - Assert.Equal(DispatcherState.DS_AWAITING, _dispatcher.State); + [Before(Test)] + public async Task Setup() + { + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_AWAITING); _dispatcher.Receive(); - } - [Fact] + [Test] public async Task When_A_Message_Dispatcher_Has_A_New_Connection_Added_While_Running() { _dispatcher.Open(_newSubscription); - var @event = new MyEvent(); - var message = new MyEventMessageMapper().MapToMessage(@event, new Publication{Topic = _routingKeyTwo}); + var message = new MyEventMessageMapper().MapToMessage(@event, new Publication { Topic = _routingKeyTwo }); _bus.Enqueue(message); - await Task.Delay(1000); - - Assert.Empty(_bus.Stream(_routingKey)); - Assert.Equal(DispatcherState.DS_RUNNING, _dispatcher.State); - Assert.Equal(2, _dispatcher.Consumers.Count()); - Assert.Equal(2, _dispatcher.Subscriptions.Count()); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_RUNNING); + await Assert.That(_dispatcher.Consumers.Count()).IsEqualTo(2); + await Assert.That(_dispatcher.Subscriptions.Count()).IsEqualTo(2); } - public void Dispose() + [After(Test)] + public async Task Dispose() { if (_dispatcher?.State == DispatcherState.DS_RUNNING) - _dispatcher.End().Wait(); + await _dispatcher.End(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_is_asked_to_connect_a_channel_and_handler.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_is_asked_to_connect_a_channel_and_handler.cs index b56fc3807c..1583e1da94 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_is_asked_to_connect_a_channel_and_handler.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_is_asked_to_connect_a_channel_and_handler.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -6,73 +6,52 @@ using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { - public class MessageDispatcherRoutingTests : IDisposable + public class MessageDispatcherRoutingTests { private readonly Dispatcher _dispatcher; private readonly SpyCommandProcessor _commandProcessor; private readonly RoutingKey _routingKey = new("myTopic"); private readonly InternalBus _bus = new(); private readonly FakeTimeProvider _timeProvider = new(); - public MessageDispatcherRoutingTests() { _commandProcessor = new SpyCommandProcessor(); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), - null); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - - var subscription = new Subscription( - new SubscriptionName("test"), - noOfPerformers: 1, - timeOut: TimeSpan.FromMilliseconds(1000), - channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), - channelName: new ChannelName("myChannel"), - messagePumpType: MessagePumpType.Reactor, - routingKey: _routingKey - ); - - _dispatcher = new Dispatcher( - _commandProcessor, - new List { subscription }, - messageMapperRegistry, - requestContextFactory: new InMemoryRequestContextFactory() - ); - + var subscription = new Subscription(new SubscriptionName("test"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), channelName: new ChannelName("myChannel"), messagePumpType: MessagePumpType.Reactor, routingKey: _routingKey); + _dispatcher = new Dispatcher(_commandProcessor, new List { subscription }, messageMapperRegistry, requestContextFactory: new InMemoryRequestContextFactory()); var @event = new MyEvent(); - var message = new MyEventMessageMapper().MapToMessage(@event, new Publication{Topic = _routingKey}); + var message = new MyEventMessageMapper().MapToMessage(@event, new Publication { Topic = _routingKey }); _bus.Enqueue(message); + } - Assert.Equal(DispatcherState.DS_AWAITING, _dispatcher.State); + [Before(Test)] + public async Task Setup() + { + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_AWAITING); _dispatcher.Receive(); - } -#pragma warning disable xUnit1031 - [Fact] - public void When_A_Message_Dispatcher_Is_Asked_To_Connect_A_Channel_And_Handler() + [Test] + public async Task When_A_Message_Dispatcher_Is_Asked_To_Connect_A_Channel_And_Handler() { - Task.Delay(1000).Wait(); + await Task.Delay(1000); _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - - _dispatcher.End().Wait(); - - Assert.Empty(_bus.Stream(_routingKey)); - Assert.Equal(DispatcherState.DS_STOPPED, _dispatcher.State); - Assert.NotNull(_commandProcessor.Observe()); - Assert.Contains(_commandProcessor.Commands, ctype => ctype == CommandType.Publish); + await _dispatcher.End(); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_STOPPED); + await Assert.That(_commandProcessor.Observe()).IsNotNull(); + await Assert.That(_commandProcessor.Commands).Contains(ctype => ctype == CommandType.Publish); } -#pragma warning restore xUnit1031 - - public void Dispose() + + [After(Test)] + public async Task Dispose() { if (_dispatcher?.State == DispatcherState.DS_RUNNING) - _dispatcher.End().Wait(); + await _dispatcher.End(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_restarts_a_connection.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_restarts_a_connection.cs index 97d0817069..c5aa027863 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_restarts_a_connection.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_restarts_a_connection.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -6,11 +6,10 @@ using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { - public class MessageDispatcherResetConnection : IDisposable + public class MessageDispatcherResetConnection { private readonly Dispatcher _dispatcher; private readonly Subscription _subscription; @@ -18,66 +17,51 @@ public class MessageDispatcherResetConnection : IDisposable private readonly InternalBus _bus = new(); private readonly RoutingKey _routingKey = new("myTopic"); private readonly FakeTimeProvider _timeProvider = new(); - public MessageDispatcherResetConnection() { IAmACommandProcessor commandProcessor = new SpyCommandProcessor(); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), - null); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - - _subscription = new Subscription( - new SubscriptionName("test"), - noOfPerformers: 1, - timeOut: TimeSpan.FromMilliseconds(1000), - channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), - channelName: new ChannelName("myChannel"), - messagePumpType: MessagePumpType.Reactor, - routingKey: _routingKey - ); - - _publication = new Publication{Topic = _subscription.RoutingKey, RequestType = typeof(MyEvent)}; - + _subscription = new Subscription(new SubscriptionName("test"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), channelName: new ChannelName("myChannel"), messagePumpType: MessagePumpType.Reactor, routingKey: _routingKey); + _publication = new Publication + { + Topic = _subscription.RoutingKey, + RequestType = typeof(MyEvent) + }; _dispatcher = new Dispatcher(commandProcessor, new List { _subscription }, messageMapperRegistry); - var @event = new MyEvent(); var message = new MyEventMessageMapper().MapToMessage(@event, _publication); _bus.Enqueue(message); + } - Assert.Equal(DispatcherState.DS_AWAITING, _dispatcher.State); + [Before(Test)] + public async Task Setup() + { + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_AWAITING); _dispatcher.Receive(); - Task.Delay(1000).Wait(); + await Task.Delay(1000); _dispatcher.Shut(_subscription); - } - -#pragma warning disable xUnit1031 - [Fact] - public void When_A_Message_Dispatcher_Restarts_A_Connection() + + [Test] + public async Task When_A_Message_Dispatcher_Restarts_A_Connection() { _dispatcher.Open(_subscription); - var @event = new MyEvent(); var message = new MyEventMessageMapper().MapToMessage(@event, _publication); _bus.Enqueue(message); - - Task.Delay(1000).Wait(); - + await Task.Delay(1000); _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - - _dispatcher.End().Wait(); - - Assert.Empty(_bus.Stream(_routingKey)); - Assert.Equal(DispatcherState.DS_STOPPED, _dispatcher.State); + await _dispatcher.End(); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_STOPPED); } -#pragma warning restore xUnit1031 - - public void Dispose() + + [After(Test)] + public async Task Dispose() { if (_dispatcher?.State == DispatcherState.DS_RUNNING) - _dispatcher.End().Wait(); + await _dispatcher.End(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_restarts_a_connection_after_all_connections_have_stopped.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_restarts_a_connection_after_all_connections_have_stopped.cs index 5a4d16df7c..30b7754621 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_restarts_a_connection_after_all_connections_have_stopped.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_restarts_a_connection_after_all_connections_have_stopped.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -7,11 +7,10 @@ using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { - public class DispatcherRestartConnectionTests : IDisposable + public class DispatcherRestartConnectionTests { private const string ChannelName = "fakeChannel"; private readonly Dispatcher _dispatcher; @@ -20,61 +19,38 @@ public class DispatcherRestartConnectionTests : IDisposable private readonly ChannelName _channelName = new(ChannelName); private readonly InternalBus _bus = new(); private readonly FakeTimeProvider _timeProvider = new(); - + private readonly Subscription _subscription; + private readonly Subscription _newSubscription; public DispatcherRestartConnectionTests() { IAmACommandProcessor commandProcessor = new SpyCommandProcessor(); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), - null); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - - Subscription subscription = new Subscription( - new SubscriptionName("test"), - noOfPerformers: 1, - timeOut: TimeSpan.FromMilliseconds(100), - channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), - channelName: _channelName, - messagePumpType: MessagePumpType.Reactor, - routingKey: _routingKey - ); - - Subscription newSubscription = new Subscription( - new SubscriptionName("newTest"), - noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(100), - channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), - channelName: _channelName, - messagePumpType: MessagePumpType.Reactor, - routingKey: _routingKey - ); - - _publication = new Publication{Topic = subscription.RoutingKey}; - - _dispatcher = new Dispatcher( - commandProcessor, - new List { subscription, newSubscription }, - messageMapperRegistry) - ; - + _subscription = new Subscription(new SubscriptionName("test"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(100), channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), channelName: _channelName, messagePumpType: MessagePumpType.Reactor, routingKey: _routingKey); + _newSubscription = new Subscription(new SubscriptionName("newTest"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(100), channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), channelName: _channelName, messagePumpType: MessagePumpType.Reactor, routingKey: _routingKey); + _publication = new Publication + { + Topic = _subscription.RoutingKey + }; + _dispatcher = new Dispatcher(commandProcessor, new List { _subscription, _newSubscription }, messageMapperRegistry); var @event = new MyEvent(); - var message = new MyEventMessageMapper().MapToMessage(@event, _publication ); - + var message = new MyEventMessageMapper().MapToMessage(@event, _publication); _bus.Enqueue(message); + } - Assert.Equal(DispatcherState.DS_AWAITING, _dispatcher.State); - + [Before(Test)] + public async Task Setup() + { + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_AWAITING); _dispatcher.Receive(); - Task.Delay(250).Wait(); - _dispatcher.Shut(subscription.Name); - _dispatcher.Shut(newSubscription.Name); - Task.Delay(1000).Wait(); - - Assert.Empty(_dispatcher.Consumers); - + await Task.Delay(250); + _dispatcher.Shut(_subscription.Name); + _dispatcher.Shut(_newSubscription.Name); + await Task.Delay(1000); + await Assert.That(_dispatcher.Consumers).IsEmpty(); } - [Fact] + [Test] public async Task When_A_Message_Dispatcher_Restarts_A_Connection_After_All_Connections_Have_Stopped() { _dispatcher.Open(new SubscriptionName("newTest")); @@ -82,19 +58,18 @@ public async Task When_A_Message_Dispatcher_Restarts_A_Connection_After_All_Conn var message = new MyEventMessageMapper().MapToMessage(@event, _publication); _bus.Enqueue(message); await Task.Delay(500); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - - Assert.Empty(_bus.Stream(_routingKey)); - Assert.Equal(DispatcherState.DS_RUNNING, _dispatcher.State); - Assert.Single(_dispatcher.Consumers); - Assert.Equal(2, _dispatcher.Subscriptions.Count()); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_RUNNING); + await Assert.That(_dispatcher.Consumers).HasSingleItem(); + await Assert.That(_dispatcher.Subscriptions.Count()).IsEqualTo(2); } - public void Dispose() + [After(Test)] + public async Task Dispose() { if (_dispatcher?.State == DispatcherState.DS_RUNNING) - _dispatcher.End().Wait(); + await _dispatcher.End(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_shuts_a_connection.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_shuts_a_connection.cs index d69c9d1bbb..730d115dbc 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_shuts_a_connection.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_shuts_a_connection.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -6,11 +6,10 @@ using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { - public class MessageDispatcherShutConnectionTests : IDisposable + public class MessageDispatcherShutConnectionTests { private const string Topic = "fakekey"; private const string ChannelName = "fakeChannel"; @@ -18,55 +17,43 @@ public class MessageDispatcherShutConnectionTests : IDisposable private readonly Subscription _subscription; private readonly RoutingKey _routingKey = new(Topic); private readonly FakeTimeProvider _timeProvider = new(); - public MessageDispatcherShutConnectionTests() { InternalBus bus = new(); - IAmACommandProcessor commandProcessor = new SpyCommandProcessor(); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), - null); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - - _subscription = new Subscription( - new SubscriptionName("test"), - noOfPerformers: 3, - timeOut: TimeSpan.FromMilliseconds(1000), - channelFactory: new InMemoryChannelFactory(bus, _timeProvider), - channelName: new ChannelName(ChannelName), - messagePumpType: MessagePumpType.Reactor, - routingKey: _routingKey - ); + _subscription = new Subscription(new SubscriptionName("test"), noOfPerformers: 3, timeOut: TimeSpan.FromMilliseconds(1000), channelFactory: new InMemoryChannelFactory(bus, _timeProvider), channelName: new ChannelName(ChannelName), messagePumpType: MessagePumpType.Reactor, routingKey: _routingKey); _dispatcher = new Dispatcher(commandProcessor, new List { _subscription }, messageMapperRegistry); - var @event = new MyEvent(); - var message = new MyEventMessageMapper().MapToMessage(@event, new Publication{ Topic = _subscription.RoutingKey}); + var message = new MyEventMessageMapper().MapToMessage(@event, new Publication { Topic = _subscription.RoutingKey }); for (var i = 0; i < 6; i++) bus.Enqueue(message); + } - Assert.Equal(DispatcherState.DS_AWAITING, _dispatcher.State); + [Before(Test)] + public async Task Setup() + { + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_AWAITING); _dispatcher.Receive(); - } - [Fact] + [Test] public async Task When_A_Message_Dispatcher_Shuts_A_Connection() { await Task.Delay(1000); _dispatcher.Shut(_subscription); await _dispatcher.End(); - - Assert.DoesNotContain(_dispatcher.Consumers, consumer => consumer.Name == _subscription.Name && consumer.State == ConsumerState.Open); - Assert.Equal(DispatcherState.DS_STOPPED, _dispatcher.State); - Assert.Empty(_dispatcher.Consumers); + await Assert.That(_dispatcher.Consumers).DoesNotContain(consumer => consumer.Name == _subscription.Name && consumer.State == ConsumerState.Open); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_STOPPED); + await Assert.That(_dispatcher.Consumers).IsEmpty(); } - - public void Dispose() + + [After(Test)] + public async Task Dispose() { if (_dispatcher?.State == DispatcherState.DS_RUNNING) - _dispatcher.End().Wait(); + await _dispatcher.End(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_starts_different_types_of_performers.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_starts_different_types_of_performers.cs index 9bbd7701f4..96b89c2e17 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_starts_different_types_of_performers.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_starts_different_types_of_performers.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -9,11 +9,10 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { - public class MessageDispatcherMultipleConnectionTests : IDisposable + public class MessageDispatcherMultipleConnectionTests { private readonly Dispatcher _dispatcher; private int _numberOfConsumers; @@ -21,72 +20,52 @@ public class MessageDispatcherMultipleConnectionTests : IDisposable private readonly FakeTimeProvider _timeProvider = new(); private readonly RoutingKey _commandRoutingKey = new("myCommand"); private readonly RoutingKey _eventRoutingKey = new("myEvent"); - public MessageDispatcherMultipleConnectionTests() { var commandProcessor = new SpyCommandProcessor(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient(); - - var messageMapperRegistry = new MessageMapperRegistry( - new ServiceProviderMapperFactory(container.BuildServiceProvider()), - null); + var messageMapperRegistry = new MessageMapperRegistry(new ServiceProviderMapperFactory(container.BuildServiceProvider()), null); messageMapperRegistry.Register(); messageMapperRegistry.Register(); - - var myEventConnection = new Subscription( - new SubscriptionName("test"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), channelFactory: - new InMemoryChannelFactory(_bus, _timeProvider), messagePumpType: MessagePumpType.Reactor, channelName: new ChannelName("fakeEventChannel"), - routingKey: _eventRoutingKey - ); - var myCommandConnection = new Subscription( - new SubscriptionName("anothertest"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), - channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), - channelName: new ChannelName("fakeCommandChannel"), messagePumpType: MessagePumpType.Reactor, routingKey: _commandRoutingKey - ); + var myEventConnection = new Subscription(new SubscriptionName("test"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), messagePumpType: MessagePumpType.Reactor, channelName: new ChannelName("fakeEventChannel"), routingKey: _eventRoutingKey); + var myCommandConnection = new Subscription(new SubscriptionName("anothertest"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), channelName: new ChannelName("fakeCommandChannel"), messagePumpType: MessagePumpType.Reactor, routingKey: _commandRoutingKey); _dispatcher = new Dispatcher(commandProcessor, new List { myEventConnection, myCommandConnection }, messageMapperRegistry); - var @event = new MyEvent(); - var eventMessage = new MyEventMessageMapper().MapToMessage(@event, new Publication{Topic = _eventRoutingKey}); + var eventMessage = new MyEventMessageMapper().MapToMessage(@event, new Publication { Topic = _eventRoutingKey }); _bus.Enqueue(eventMessage); - var command = new MyCommand(); - var commandMessage = new MyCommandMessageMapper().MapToMessage(command, new Publication{Topic = _commandRoutingKey}); + var commandMessage = new MyCommandMessageMapper().MapToMessage(command, new Publication { Topic = _commandRoutingKey }); _bus.Enqueue(commandMessage); - - Assert.Equal(DispatcherState.DS_AWAITING, _dispatcher.State); - _dispatcher.Receive(); } + [Before(Test)] + public async Task Setup() + { + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_AWAITING); + _dispatcher.Receive(); + } -#pragma warning disable xUnit1031 - [Fact] - public void When_A_Message_Dispatcher_Starts_Different_Types_Of_Performers() + [Test] + public async Task When_A_Message_Dispatcher_Starts_Different_Types_Of_Performers() { - Task.Delay(1000).Wait(); + await Task.Delay(1000); _numberOfConsumers = _dispatcher.Consumers.Count(); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - - _dispatcher.End().Wait(); - - - Assert.Empty(_bus.Stream(_eventRoutingKey)); - Assert.Empty(_bus.Stream(_commandRoutingKey)); - Assert.Equal(DispatcherState.DS_STOPPED, _dispatcher.State); - Assert.Empty(_dispatcher.Consumers); - Assert.Equal(2, _numberOfConsumers); + await _dispatcher.End(); + await Assert.That(_bus.Stream(_eventRoutingKey)).IsEmpty(); + await Assert.That(_bus.Stream(_commandRoutingKey)).IsEmpty(); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_STOPPED); + await Assert.That(_dispatcher.Consumers).IsEmpty(); + await Assert.That(_numberOfConsumers).IsEqualTo(2); } -#pragma warning restore xUnit1031 - - public void Dispose() + + [After(Test)] + public async Task Dispose() { if (_dispatcher?.State == DispatcherState.DS_RUNNING) - _dispatcher.End().Wait(); + await _dispatcher.End(); } - } - -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_starts_multiple_performers.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_starts_multiple_performers.cs index 562c67c129..39ab33d606 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_starts_multiple_performers.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_dispatcher_starts_multiple_performers.cs @@ -1,70 +1,54 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { - public class MessageDispatcherMultiplePerformerTests { private const string Topic = "myTopic"; private const string ChannelName = "myChannel"; private readonly Dispatcher _dispatcher; private readonly InternalBus _bus; - public MessageDispatcherMultiplePerformerTests() { var routingKey = new RoutingKey(Topic); _bus = new InternalBus(); var consumer = new InMemoryMessageConsumer(routingKey, _bus, TimeProvider.System, ackTimeout: TimeSpan.FromMilliseconds(1000)); - - IAmAChannelSync channel = new Channel(new (ChannelName), new(Topic), consumer, 6); + IAmAChannelSync channel = new Channel(new(ChannelName), new(Topic), consumer, 6); IAmACommandProcessor commandProcessor = new SpyCommandProcessor(); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), - null); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - - var connection = new Subscription( - new SubscriptionName("test"), - noOfPerformers: 3, - timeOut: TimeSpan.FromMilliseconds(100), - channelFactory: new InMemoryChannelFactory(_bus, TimeProvider.System), - channelName: new ChannelName("fakeChannel"), - messagePumpType: MessagePumpType.Reactor, - routingKey: routingKey - ); + var connection = new Subscription(new SubscriptionName("test"), noOfPerformers: 3, timeOut: TimeSpan.FromMilliseconds(100), channelFactory: new InMemoryChannelFactory(_bus, TimeProvider.System), channelName: new ChannelName("fakeChannel"), messagePumpType: MessagePumpType.Reactor, routingKey: routingKey); _dispatcher = new Dispatcher(commandProcessor, new List { connection }, messageMapperRegistry); - var @event = new MyEvent(); - var message = new MyEventMessageMapper().MapToMessage(@event, new Publication{Topic = connection.RoutingKey}); + var message = new MyEventMessageMapper().MapToMessage(@event, new Publication { Topic = connection.RoutingKey }); for (var i = 0; i < 6; i++) channel.Enqueue(message); - - Assert.Equal(DispatcherState.DS_AWAITING, _dispatcher.State); + } + + [Before(Test)] + public async Task Setup() + { + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_AWAITING); _dispatcher.Receive(); } -#pragma warning disable xUnit1031 - [Fact] - public void WhenAMessageDispatcherStartsMultiplePerformers() + [Test] + public async Task WhenAMessageDispatcherStartsMultiplePerformers() { { - Assert.Equal(DispatcherState.DS_RUNNING, _dispatcher.State); - Assert.Equal(3, _dispatcher.Consumers.Count()); - - _dispatcher.End().Wait(); - - Assert.Empty(_bus.Stream(new RoutingKey(Topic))); - Assert.Equal(DispatcherState.DS_STOPPED, _dispatcher.State); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_RUNNING); + await Assert.That(_dispatcher.Consumers.Count()).IsEqualTo(3); + await _dispatcher.End(); + await Assert.That(_bus.Stream(new RoutingKey(Topic))).IsEmpty(); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_STOPPED); } } -#pragma warning restore xUnit1031 } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_fails_to_be_mapped_to_a_request.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_fails_to_be_mapped_to_a_request.cs index de0ad599b9..4de70f4109 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_fails_to_be_mapped_to_a_request.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_fails_to_be_mapped_to_a_request.cs @@ -1,14 +1,12 @@ -using System; +using System; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { - public class MessagePumpFailingMessageTranslationTests { private const string Channel = "MyChannel"; @@ -17,46 +15,33 @@ public class MessagePumpFailingMessageTranslationTests private readonly IAmAMessagePump _messagePump; private readonly Channel _channel; private readonly InternalBus _bus = new(); - public MessagePumpFailingMessageTranslationTests() { SpyRequeueCommandProcessor commandProcessor = new(); _channel = new Channel(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new FailingEventMessageMapper()), - null); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new FailingEventMessageMapper()), null); messageMapperRegistry.Register(); var messageTransformerFactory = new SimpleMessageTransformerFactory(_ => throw new NotImplementedException()); - - _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyFailingMapperEvent), - messageMapperRegistry, messageTransformerFactory, new InMemoryRequestContextFactory(), _channel) + _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyFailingMapperEvent), messageMapperRegistry, messageTransformerFactory, new InMemoryRequestContextFactory(), _channel) { - Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = 3, UnacceptableMessageLimit = 3 + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = 3, + UnacceptableMessageLimit = 3 }; - - var unmappableMessage = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody("{ \"Id\" : \"48213ADB-A085-4AFF-A42C-CF8209350CF7\" }") - ); - + var unmappableMessage = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody("{ \"Id\" : \"48213ADB-A085-4AFF-A42C-CF8209350CF7\" }")); _bus.Enqueue(unmappableMessage); - } - [Fact] - public async Task When_A_Message_Fails_To_Be_Mapped_To_A_Request () + [Test] + public async Task When_A_Message_Fails_To_Be_Mapped_To_A_Request() { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); - await Task.Delay(2000); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - _channel.Stop(_routingKey); - await Task.WhenAll(task); - - Assert.Empty(_bus.Stream(_routingKey)); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_fails_to_be_mapped_to_a_request_and_the_unacceptable_message_limit_is_reached.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_fails_to_be_mapped_to_a_request_and_the_unacceptable_message_limit_is_reached.cs index e382eb3ac7..fa7fc88db0 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_fails_to_be_mapped_to_a_request_and_the_unacceptable_message_limit_is_reached.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_fails_to_be_mapped_to_a_request_and_the_unacceptable_message_limit_is_reached.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,23 +12,20 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -39,47 +36,35 @@ public class MessagePumpUnacceptableMessageLimitTests private readonly InternalBus _bus = new(); private readonly IAmAMessagePump _messagePump; private readonly FakeTimeProvider _timeProvider; - public MessagePumpUnacceptableMessageLimitTests() { SpyRequeueCommandProcessor commandProcessor = new(); _timeProvider = new FakeTimeProvider(); - Channel channel = new(new (Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new FailingEventMessageMapper()), - null); + Channel channel = new(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new FailingEventMessageMapper()), null); messageMapperRegistry.Register(); - - _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyFailingMapperEvent), - messageMapperRegistry, null, new InMemoryRequestContextFactory(), channel) + _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyFailingMapperEvent), messageMapperRegistry, null, new InMemoryRequestContextFactory(), channel) { - Channel = channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = 3, UnacceptableMessageLimit = 3 + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = 3, + UnacceptableMessageLimit = 3 }; - - var unmappableMessage = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody("{ \"Id\" : \"48213ADB-A085-4AFF-A42C-CF8209350CF7\" }") - ); - + var unmappableMessage = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody("{ \"Id\" : \"48213ADB-A085-4AFF-A42C-CF8209350CF7\" }")); _bus.Enqueue(unmappableMessage); _bus.Enqueue(unmappableMessage); _bus.Enqueue(unmappableMessage); - } - [Fact] + [Test] public async Task When_A_Message_Fails_To_Be_Mapped_To_A_Request_And_The_Unacceptable_Message_Limit_Is_Reached() { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); await Task.Delay(1000); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - await Task.WhenAll(new[] { task }); - - Assert.Empty(_bus.Stream(_routingKey)); - - //TODO: Assert the channe shutdown somehow. Observability? + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + //TODO: Assert the channe shutdown somehow. Observability? } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_is_dispatched_it_should_reach_a_handler.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_is_dispatched_it_should_reach_a_handler.cs index 664540d258..5fd2ed9742 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_is_dispatched_it_should_reach_a_handler.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_is_dispatched_it_should_reach_a_handler.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Text.Json; using Microsoft.Extensions.Time.Testing; @@ -6,7 +6,6 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -18,58 +17,32 @@ public class MessagePumpDispatchTests private readonly IAmAMessagePump _messagePump; private readonly MyEvent _myEvent = new(); private readonly IDictionary _receivedMessages = new Dictionary(); - public MessagePumpDispatchTests() { var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.Register(); - var handlerFactory = new SimpleHandlerFactorySync(_ => new MyEventHandler(_receivedMessages)); - - var commandProcessor = new CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory()); - - PipelineBuilder.ClearPipelineCache(); - - var channel = new Channel( - new("myChannel"), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory( - _ => new MyEventMessageMapper()), - null); + var commandProcessor = new CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); + var channel = new Channel(new("myChannel"), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - - _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, null, new InMemoryRequestContextFactory(), channel) + _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, null, new InMemoryRequestContextFactory(), channel) { - Channel = channel, TimeOut = TimeSpan.FromMilliseconds(5000) + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(5000) }; - - var message = new Message( - new MessageHeader(_myEvent.Id, _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize(_myEvent, JsonSerialisationOptions.Options)) - ); - + var message = new Message(new MessageHeader(_myEvent.Id, _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(_myEvent, JsonSerialisationOptions.Options))); channel.Enqueue(message); var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); channel.Enqueue(quitMessage); - } - [Fact] - public void When_A_Message_Is_Dispatched_It_Should_Reach_A_Handler() + [Test] + public async Task When_A_Message_Is_Dispatched_It_Should_Reach_A_Handler() { _messagePump.Run(); - - Assert.Contains(nameof(MyEventHandler), _receivedMessages); - Assert.Equal(_myEvent.Id, _receivedMessages[nameof(MyEventHandler)]); + await Assert.That(_receivedMessages.Keys).Contains(nameof(MyEventHandler)); + await Assert.That(_receivedMessages[nameof(MyEventHandler)]).IsEqualTo(_myEvent.Id); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_mapper_throws_invalid_message_action.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_mapper_throws_invalid_message_action.cs index e3f5abee5e..114d4d0b97 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_mapper_throws_invalid_message_action.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_message_mapper_throws_invalid_message_action.cs @@ -8,10 +8,8 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor; - public class MessageDispatchInvalidMessageActionTests { private readonly RoutingKey _routingKey = new("myTopic"); @@ -19,63 +17,30 @@ public class MessageDispatchInvalidMessageActionTests private readonly InternalBus _bus = new(); private readonly FakeTimeProvider _timeProvider = new(); private Dispatcher _dispatcher; - public MessageDispatchInvalidMessageActionTests() { // Arrange: Set up a message mapper that throws InvalidMessageAction on deserialization failure var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.Register(); - - var handlerFactory = new SimpleHandlerFactory( - (type) => new MyRejectedEventHandler(), - (type) => throw new ConfigurationException() - ); - + var handlerFactory = new SimpleHandlerFactory((type) => new MyRejectedEventHandler(), (type) => throw new ConfigurationException()); // Use a mapper that throws InvalidMessageAction to simulate deserialization failure var mapperFactory = new SimpleMessageMapperFactory((r) => new MyInvalidMessageMapper()); var messageMapperRegistry = new MessageMapperRegistry(mapperFactory, null, null, null); messageMapperRegistry.Register(); - var resiliencePipelineRegistry = new ResiliencePipelineRegistry(); resiliencePipelineRegistry.AddBrighterDefault(); - - var commandProcessor = new CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - resiliencePipelineRegistry, - new InMemorySchedulerFactory() - ); - - var subscription = new InMemorySubscription( - new SubscriptionName("test"), - noOfPerformers: 1, - timeOut: TimeSpan.FromMilliseconds(1000), - channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), - channelName: new ChannelName("myChannel"), - messagePumpType: MessagePumpType.Reactor, - routingKey: _routingKey - ); - + var commandProcessor = new CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), resiliencePipelineRegistry, new InMemorySchedulerFactory()); + var subscription = new InMemorySubscription(new SubscriptionName("test"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), channelName: new ChannelName("myChannel"), messagePumpType: MessagePumpType.Reactor, routingKey: _routingKey); subscription.InvalidMessageRoutingKey = _invalidMessageRoutingKey; - - _dispatcher = new Dispatcher( - commandProcessor, - new List { subscription }, - messageMapperRegistry, - requestContextFactory: new InMemoryRequestContextFactory() - ); - + _dispatcher = new Dispatcher(commandProcessor, new List { subscription }, messageMapperRegistry, requestContextFactory: new InMemoryRequestContextFactory()); // Act: Send a message that will fail deserialization var @event = new MyRejectedEvent(Id.Random()); - var message = new MyRejectedEventHandlerMessageMapper().MapToMessage(@event, new Publication{Topic = _routingKey}); + var message = new MyRejectedEventHandlerMessageMapper().MapToMessage(@event, new Publication { Topic = _routingKey }); _bus.Enqueue(message); - _dispatcher.Receive(); } - [Fact] + [Test] public async Task When_a_message_mapper_throws_invalid_message_action() { // Wait for the message to be processed (moved to invalid message topic) before stopping @@ -87,15 +52,12 @@ public async Task When_a_message_mapper_throws_invalid_message_action() } await _dispatcher.End(); - - Assert.Empty(_bus.Stream(_routingKey)); - + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); // Assert: The message should appear in the invalid message channel - Assert.NotEmpty(_bus.Stream(_invalidMessageRoutingKey)); + await Assert.That(_bus.Stream(_invalidMessageRoutingKey)).IsNotEmpty(); var message = _bus.Dequeue(_invalidMessageRoutingKey); - // Assert: The message should include rejection metadata var rejectionReason = $"Message rejected reason: {RejectionReason.Unacceptable} Description: Failed to deserialize message"; - Assert.Equal(rejectionReason, message.Header.Bag[Message.RejectionReasonHeaderName]); + await Assert.That(message.Header.Bag[Message.RejectionReasonHeaderName]).IsEqualTo(rejectionReason); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_requeue_count_threshold_for_commands_has_been_reached.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_requeue_count_threshold_for_commands_has_been_reached.cs index 5f72e509b3..0847707f5e 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_requeue_count_threshold_for_commands_has_been_reached.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_requeue_count_threshold_for_commands_has_been_reached.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text.Json; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -7,7 +7,6 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -20,49 +19,37 @@ public class MessagePumpCommandRequeueCountThresholdTests private readonly IAmAMessagePump _messagePump; private readonly Channel _channel; private readonly SpyRequeueCommandProcessor _commandProcessor; - public MessagePumpCommandRequeueCountThresholdTests() { _commandProcessor = new SpyRequeueCommandProcessor(); - _channel = new Channel(new(Channel) ,_routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), - null); + _channel = new Channel(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), null); messageMapperRegistry.Register(); - _messagePump = new ServiceActivator.Reactor(_commandProcessor, (message) => typeof(MyCommand), - messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), _channel) - { Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = 3 }; - - var message1 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize((MyCommand)new(), JsonSerialisationOptions.Options)) - ); - var message2 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize((MyCommand)new(), JsonSerialisationOptions.Options)) - ); + _messagePump = new ServiceActivator.Reactor(_commandProcessor, (message) => typeof(MyCommand), messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), _channel) + { + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = 3 + }; + var message1 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize((MyCommand)new(), JsonSerialisationOptions.Options))); + var message2 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize((MyCommand)new(), JsonSerialisationOptions.Options))); _bus.Enqueue(message1); _bus.Enqueue(message2); - } - [Fact] + [Test] public async Task When_A_Requeue_Count_Threshold_For_Commands_Has_Been_Reached() { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); await Task.Delay(1000); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - var quitMessage = MessageFactory.CreateQuitMessage(new RoutingKey("MyTopic")); _channel.Enqueue(quitMessage); - await Task.WhenAll(task); - - Assert.Equal(CommandType.Send, _commandProcessor.Commands[0]); - Assert.Equal(6, _commandProcessor.SendCount); - - Assert.Empty(_bus.Stream(_routingKey)); - - //TODO: How can we observe that the channel has been closed? Observability? + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.Send); + await Assert.That(_commandProcessor.SendCount).IsEqualTo(6); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + //TODO: How can we observe that the channel has been closed? Observability? } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_requeue_count_threshold_for_events_has_been_reached.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_requeue_count_threshold_for_events_has_been_reached.cs index a75c39770f..2d074ae8fa 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_requeue_count_threshold_for_events_has_been_reached.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_requeue_count_threshold_for_events_has_been_reached.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text.Json; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -7,7 +7,6 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -20,51 +19,37 @@ public class MessagePumpEventRequeueCountThresholdTests private readonly IAmAMessagePump _messagePump; private readonly Channel _channel; private readonly SpyRequeueCommandProcessor _commandProcessor; - public MessagePumpEventRequeueCountThresholdTests() { _commandProcessor = new SpyRequeueCommandProcessor(); _channel = new Channel(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), - null); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - - _messagePump = new ServiceActivator.Reactor(_commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), _channel) - { Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = 3 }; - - var message1 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize((MyEvent)new(), JsonSerialisationOptions.Options)) - ); - var message2 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize((MyEvent)new(), JsonSerialisationOptions.Options)) - ); + _messagePump = new ServiceActivator.Reactor(_commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), _channel) + { + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = 3 + }; + var message1 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize((MyEvent)new(), JsonSerialisationOptions.Options))); + var message2 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize((MyEvent)new(), JsonSerialisationOptions.Options))); _bus.Enqueue(message1); _bus.Enqueue(message2); - } - [Fact] + [Test] public async Task When_A_Requeue_Count_Threshold_For_Events_Has_Been_Reached() { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); await Task.Delay(1000); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); _channel.Enqueue(quitMessage); - await Task.WhenAll(task); - - Assert.Equal(CommandType.Publish, _commandProcessor.Commands[0]); - Assert.Equal(6, _commandProcessor.PublishCount); - - Assert.Empty(_bus.Stream(_routingKey)); - - //TODO: How do we assert that the channel was closed? Observability? + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.Publish); + await Assert.That(_commandProcessor.PublishCount).IsEqualTo(6); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + //TODO: How do we assert that the channel was closed? Observability? } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_requeue_of_command_exception_is_thrown.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_requeue_of_command_exception_is_thrown.cs index 276b186b7e..cd33ed6d3e 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_requeue_of_command_exception_is_thrown.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_requeue_of_command_exception_is_thrown.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Text.Json; using Microsoft.Extensions.Time.Testing; @@ -7,7 +7,6 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -20,46 +19,32 @@ public class MessagePumpCommandRequeueTests private readonly IAmAMessagePump _messagePump; private readonly SpyCommandProcessor _commandProcessor; private readonly MyCommand _command = new(); - public MessagePumpCommandRequeueTests() { _commandProcessor = new SpyRequeueCommandProcessor(); Channel channel = new(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), 2); - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), - null); - messageMapperRegistry.Register(); - _messagePump = new ServiceActivator.Reactor(_commandProcessor, (message) => typeof(MyCommand), - messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel) - { Channel = channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = -1 }; - - var message1 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_command, JsonSerialisationOptions.Options)) - ); - - var message2 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), - new MessageBody(JsonSerializer.Serialize(_command, JsonSerialisationOptions.Options)) - ); - + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyCommandMessageMapper()), null); + messageMapperRegistry.Register(); + _messagePump = new ServiceActivator.Reactor(_commandProcessor, (message) => typeof(MyCommand), messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel) + { + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = -1 + }; + var message1 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_command, JsonSerialisationOptions.Options))); + var message2 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody(JsonSerializer.Serialize(_command, JsonSerialisationOptions.Options))); channel.Enqueue(message1); channel.Enqueue(message2); - var quitMessage = new Message( - new MessageHeader(string.Empty, RoutingKey.Empty, MessageType.MT_QUIT), - new MessageBody("") - ); + var quitMessage = new Message(new MessageHeader(string.Empty, RoutingKey.Empty, MessageType.MT_QUIT), new MessageBody("")); channel.Enqueue(quitMessage); - } - [Fact] - public void When_A_Requeue_Of_Command_Exception_Is_Thrown() + [Test] + public async Task When_A_Requeue_Of_Command_Exception_Is_Thrown() { _messagePump.Run(); - - Assert.Equal(CommandType.Send, _commandProcessor.Commands[0]); - Assert.Equal(2, _bus.Stream(_routingKey).Count()); + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.Send); + await Assert.That(_bus.Stream(_routingKey).Count()).IsEqualTo(2); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_requeue_of_event_exception_is_thrown.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_requeue_of_event_exception_is_thrown.cs index b51e06f697..95099c4a26 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_requeue_of_event_exception_is_thrown.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_a_requeue_of_event_exception_is_thrown.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Text.Json; using Microsoft.Extensions.Time.Testing; @@ -7,7 +7,6 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -19,54 +18,36 @@ public class MessagePumpEventRequeueTests private readonly FakeTimeProvider _timeProvider = new(); private readonly IAmAMessagePump _messagePump; private readonly SpyCommandProcessor _commandProcessor; - public MessagePumpEventRequeueTests() { _commandProcessor = new SpyRequeueCommandProcessor(); - Channel channel = new( - new(Channel), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), - 2 - ); - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), - null); + Channel channel = new(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), 2); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - - _messagePump = new ServiceActivator.Reactor(_commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel) - { Channel = channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = -1 }; - - var message1 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize((MyEvent)new(), JsonSerialisationOptions.Options)) - ); - var message2 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize((MyEvent)new(), JsonSerialisationOptions.Options)) - ); - + _messagePump = new ServiceActivator.Reactor(_commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel) + { + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = -1 + }; + var message1 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize((MyEvent)new(), JsonSerialisationOptions.Options))); + var message2 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize((MyEvent)new(), JsonSerialisationOptions.Options))); channel.Enqueue(message1); channel.Enqueue(message2); var quitMessage = MessageFactory.CreateQuitMessage(new RoutingKey("MyTopic")); channel.Enqueue(quitMessage); - } - [Fact] - public void When_A_Requeue_Of_Event_Exception_Is_Thrown() + [Test] + public async Task When_A_Requeue_Of_Event_Exception_Is_Thrown() { _messagePump.Run(); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - //Should publish the message via the_command_processor - Assert.Equal(CommandType.Publish, _commandProcessor.Commands[0]); - + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.Publish); //_should_requeue_the_messages - Assert.Equal(2, _bus.Stream(_routingKey).Count()); - - //TODO: How do we know that the channel has been disposed? Observability + await Assert.That(_bus.Stream(_routingKey).Count()).IsEqualTo(2); + //TODO: How do we know that the channel has been disposed? Observability } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_aggregate_exception_containing_dont_ack_action_should_not_acknowledge.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_aggregate_exception_containing_dont_ack_action_should_not_acknowledge.cs index 277d184fb0..0670d9a243 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_aggregate_exception_containing_dont_ack_action_should_not_acknowledge.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_aggregate_exception_containing_dont_ack_action_should_not_acknowledge.cs @@ -7,7 +7,6 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.Testing; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -19,28 +18,13 @@ public class MessagePumpEventDontAckAggregateExceptionTests private readonly FakeTimeProvider _timeProvider = new(); private readonly IAmAMessagePump _messagePump; private readonly SpyDontAckCommandProcessor _commandProcessor; - public MessagePumpEventDontAckAggregateExceptionTests() { _commandProcessor = new SpyDontAckCommandProcessor(); - var channel = new Channel( - new(ChannelName), - _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), - null); + var channel = new Channel(new(ChannelName), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - - _messagePump = new ServiceActivator.Reactor( - _commandProcessor, - (message) => typeof(MyEvent), - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new InMemoryRequestContextFactory(), - channel) + _messagePump = new ServiceActivator.Reactor(_commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel) { Channel = channel, TimeOut = TimeSpan.FromMilliseconds(5000), @@ -48,38 +32,30 @@ public MessagePumpEventDontAckAggregateExceptionTests() UnacceptableMessageLimit = 2, DontAckDelay = TimeSpan.Zero }; - // Arrange: enqueue two event messages (both will trigger AggregateException wrapping DontAckAction via Publish) for (int i = 0; i < 2; i++) { - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize(new MyEvent(), JsonSerialisationOptions.Options)) - ); + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(new MyEvent(), JsonSerialisationOptions.Options))); channel.Enqueue(message); } } - [Fact] - public void When_Aggregate_Exception_Containing_DontAck_Action_Should_Not_Acknowledge() + [Test] + public async Task When_Aggregate_Exception_Containing_DontAck_Action_Should_Not_Acknowledge() { // Act _messagePump.Run(); - // Assert: handler was called for both messages via Publish (event path) - Assert.Equal(CommandType.Publish, _commandProcessor.Commands[0]); - Assert.Equal(2, _commandProcessor.PublishCount); - + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.Publish); + await Assert.That(_commandProcessor.PublishCount).IsEqualTo(2); // Assert: pump continued running after the first AggregateException containing DontAckAction // (it processed the second event, proving it didn't crash or stop on the first) - // Assert: unacceptable message count was incremented // The pump exited because the count reached the limit of 2, // which only happens if IncrementUnacceptableMessageCount was called for each DontAckAction - Assert.Equal(MessagePumpStatus.MP_LIMIT_EXCEEDED, _messagePump.Status); - + await Assert.That(_messagePump.Status).IsEqualTo(MessagePumpStatus.MP_LIMIT_EXCEEDED); // Assert: messages were nacked to the bus (available for redelivery) - Assert.NotEmpty(_bus.Stream(_routingKey)); + await Assert.That(_bus.Stream(_routingKey)).IsNotEmpty(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_event_handler_throw_a_reject_message_exception.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_event_handler_throw_a_reject_message_exception.cs index c94f63bed1..805fe3d300 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_event_handler_throw_a_reject_message_exception.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_event_handler_throw_a_reject_message_exception.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -7,10 +7,8 @@ using Paramore.Brighter.Extensions; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor; - public class MessageDispatchRejectMessageExceptionTests { private readonly RoutingKey _routingKey = new("myTopic"); @@ -18,76 +16,37 @@ public class MessageDispatchRejectMessageExceptionTests private readonly InternalBus _bus = new(); private readonly FakeTimeProvider _timeProvider = new(); private Dispatcher _dispatcher; - public MessageDispatchRejectMessageExceptionTests() { MyRejectedEventHandler.Reset(); - var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.Register(); - - var handlerFactory = new SimpleHandlerFactory( - (type) => new MyRejectedEventHandler(), - (type) => throw new ConfigurationException() - ); - + var handlerFactory = new SimpleHandlerFactory((type) => new MyRejectedEventHandler(), (type) => throw new ConfigurationException()); var mapperFactory = new SimpleMessageMapperFactory((r) => new MyRejectedEventHandlerMessageMapper()); var messageMapperRegistry = new MessageMapperRegistry(mapperFactory, null, null, null); messageMapperRegistry.Register(); - - var resiliencePipelineRegistry = new ResiliencePipelineRegistry(); resiliencePipelineRegistry.AddBrighterDefault(); - - var commandProcessor = new CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - resiliencePipelineRegistry, - new InMemorySchedulerFactory() - ); - - var subscription = new InMemorySubscription( - new SubscriptionName("test"), - noOfPerformers: 1, - timeOut: TimeSpan.FromMilliseconds(1000), - channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), - channelName: new ChannelName("myChannel"), - messagePumpType: MessagePumpType.Reactor, - routingKey: _routingKey - ); - + var commandProcessor = new CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), resiliencePipelineRegistry, new InMemorySchedulerFactory()); + var subscription = new InMemorySubscription(new SubscriptionName("test"), noOfPerformers: 1, timeOut: TimeSpan.FromMilliseconds(1000), channelFactory: new InMemoryChannelFactory(_bus, _timeProvider), channelName: new ChannelName("myChannel"), messagePumpType: MessagePumpType.Reactor, routingKey: _routingKey); subscription.DeadLetterRoutingKey = _deadLetterRoutingKey; - - _dispatcher = new Dispatcher( - commandProcessor, - new List { subscription }, - messageMapperRegistry, - requestContextFactory: new InMemoryRequestContextFactory() - ); - + _dispatcher = new Dispatcher(commandProcessor, new List { subscription }, messageMapperRegistry, requestContextFactory: new InMemoryRequestContextFactory()); var @event = new MyRejectedEvent(Id.Random()); - var message = new MyRejectedEventHandlerMessageMapper().MapToMessage(@event, new Publication{Topic = _routingKey}); + var message = new MyRejectedEventHandlerMessageMapper().MapToMessage(@event, new Publication { Topic = _routingKey }); _bus.Enqueue(message); - _dispatcher.Receive(); } - [Fact] + [Test] public async Task When_an_event_handler_throw_a_reject_message_exception() { // Wait for the handler to be invoked before stopping - Assert.True(MyRejectedEventHandler.WaitForHandle(), "Handler was not invoked within timeout"); - + await Assert.That(await MyRejectedEventHandler.WaitForHandleAsync()).IsTrue(); await _dispatcher.End(); - - Assert.Empty(_bus.Stream(_routingKey)); - Assert.NotEmpty(_bus.Stream(_deadLetterRoutingKey)); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + await Assert.That(_bus.Stream(_deadLetterRoutingKey)).IsNotEmpty(); var message = _bus.Dequeue(_deadLetterRoutingKey); var rejectionReason = $"Message rejected reason: {RejectionReason.DeliveryError} Description: {MyRejectedEventHandlerAsync.TestOfRejectionFlow}"; - Assert.Equal(rejectionReason, message.Header.Bag[Message.RejectionReasonHeaderName]); + await Assert.That(message.Header.Bag[Message.RejectionReasonHeaderName]).IsEqualTo(rejectionReason); } - - } diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_event_handler_throws_a_defer_message_Then_message_is_requeued_until_rejected.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_event_handler_throws_a_defer_message_Then_message_is_requeued_until_rejected.cs index 5a6f338ded..0dbfb95dd4 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_event_handler_throws_a_defer_message_Then_message_is_requeued_until_rejected.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_event_handler_throws_a_defer_message_Then_message_is_requeued_until_rejected.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -29,7 +27,6 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -43,56 +40,36 @@ public class MessagePumpEventProcessingDeferMessageActionTests private readonly RoutingKey _routingKey; private readonly Channel _channel; private FakeTimeProvider _timeProvider = new FakeTimeProvider(); - public MessagePumpEventProcessingDeferMessageActionTests() { _routingKey = new RoutingKey(Topic); - SpyRequeueCommandProcessor commandProcessor = new(); - _bus = new InternalBus(); - - _channel = new Channel( - new(Channel), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), - null); + _channel = new Channel(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - - _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) + _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) { - Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = _requeueCount + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = _requeueCount }; - var transformPipelineBuilder = new TransformPipelineBuilder(messageMapperRegistry, null); - - var msg = transformPipelineBuilder.BuildWrapPipeline() - .Wrap(new MyEvent(), new RequestContext(), new Publication{Topic = _routingKey}); - + var msg = transformPipelineBuilder.BuildWrapPipeline().Wrap(new MyEvent(), new RequestContext(), new Publication { Topic = _routingKey }); _bus.Enqueue(msg); - } - [Fact] + [Test] public async Task When_an_event_handler_throws_a_defer_message_Then_message_is_requeued_until_rejected() { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); - //allow requeue to run await Task.Delay(1000); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - var quitMessage = MessageFactory.CreateQuitMessage(new RoutingKey(Topic)); _channel.Enqueue(quitMessage); - await Task.WhenAll(task); - - Assert.Empty(_bus.Stream(_routingKey)); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_event_handler_throws_unhandled_exception_Then_message_is_acked.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_event_handler_throws_unhandled_exception_Then_message_is_acked.cs index c06674903b..c91801ad2f 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_event_handler_throws_unhandled_exception_Then_message_is_acked.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_event_handler_throws_unhandled_exception_Then_message_is_acked.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; @@ -7,7 +7,6 @@ using Paramore.Brighter.ServiceActivator; using Serilog.Events; using Serilog.Sinks.TestCorrelator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -21,60 +20,40 @@ public class MessagePumpEventProcessingExceptionTests private readonly InternalBus _bus; private readonly FakeTimeProvider _timeProvider = new(); private readonly Channel _channel; - public MessagePumpEventProcessingExceptionTests() { SpyExceptionCommandProcessor commandProcessor = new(); - _bus = new InternalBus(); - - _channel = new Channel( - new (Channel), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), - null); + _channel = new Channel(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - var requestContextFactory = new InMemoryRequestContextFactory(); - _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, null, requestContextFactory, _channel) + _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, null, requestContextFactory, _channel) { - Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = _requeueCount + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = _requeueCount }; - var transformPipelineBuilder = new TransformPipelineBuilder(messageMapperRegistry, null); - - var msg = transformPipelineBuilder.BuildWrapPipeline() - .Wrap(new MyEvent(), requestContextFactory.Create(), new Publication{Topic = _routingKey}); - + var msg = transformPipelineBuilder.BuildWrapPipeline().Wrap(new MyEvent(), requestContextFactory.Create(), new Publication { Topic = _routingKey }); _bus.Enqueue(msg); - } - [Fact] + [Test] public async Task When_an_event_handler_throws_unhandled_exception_Then_message_is_acked() { using (TestCorrelator.CreateContext()) { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); await Task.Delay(1000); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - - var quitMessage = new Message(new MessageHeader(string.Empty, RoutingKey.Empty, MessageType.MT_QUIT), - new MessageBody("")); + var quitMessage = new Message(new MessageHeader(string.Empty, RoutingKey.Empty, MessageType.MT_QUIT), new MessageBody("")); _channel.Enqueue(quitMessage); - await Task.WhenAll(task); - - Assert.Empty(_bus.Stream(_routingKey)); - + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); var logEvents = TestCorrelator.GetLogEventsFromCurrentContext(); - Assert.Contains(logEvents, x => x.Level == LogEventLevel.Error && x.MessageTemplate.Text == - "MessagePump: Failed to dispatch message {Id} from {ChannelName} with {RoutingKey} on thread # {ManagementThreadId}"); + await Assert.That(logEvents).Contains(x => x.Level == LogEventLevel.Error && x.MessageTemplate.Text == "MessagePump: Failed to dispatch message {Id} from {ChannelName} with {RoutingKey} on thread # {ManagementThreadId}"); } } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_unacceptable_message_is_recieved.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_unacceptable_message_is_recieved.cs index 9712367054..808494585d 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_unacceptable_message_is_recieved.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_unacceptable_message_is_recieved.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Text.Json; using System.Threading.Tasks; @@ -30,7 +28,6 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -42,50 +39,34 @@ public class MessagePumpUnacceptableMessageTests private readonly InternalBus _bus; private readonly RoutingKey _routingKey = new("MyTopic"); private readonly FakeTimeProvider _timeProvider = new(); - public MessagePumpUnacceptableMessageTests() { SpyRequeueCommandProcessor commandProcessor = new(); - _bus = new InternalBus(); - - _channel = new Channel(new (Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), - null); + _channel = new Channel(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - - _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) + _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) { - Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = 3 + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = 3 }; - var myMessage = JsonSerializer.Serialize(new MyEvent()); - var unacceptableMessage = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody(myMessage) - ); - + var unacceptableMessage = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody(myMessage)); _channel.Enqueue(unacceptableMessage); - } - [Fact] + [Test] public async Task When_An_Unacceptable_Message_Is_Recieved() { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); await Task.Delay(1000); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); _channel.Enqueue(quitMessage); - await Task.WhenAll(new[] { task }); - - Assert.Empty(_bus.Stream(_routingKey)); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_unacceptable_message_is_recieved_and_there_is_a_dlq.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_unacceptable_message_is_recieved_and_there_is_a_dlq.cs index ce34ef27ed..3d37204ca8 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_unacceptable_message_is_recieved_and_there_is_a_dlq.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_unacceptable_message_is_recieved_and_there_is_a_dlq.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Text.Json; using System.Threading.Tasks; @@ -30,10 +28,8 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor; - public class MessagePumpUnacceptableMessageDeadLetterChannelTests { private const string Channel = "MyChannel"; @@ -43,54 +39,34 @@ public class MessagePumpUnacceptableMessageDeadLetterChannelTests private readonly RoutingKey _routingKey = new("MyTopic"); private readonly RoutingKey _deadLetterKey = new("MyDeadLetterTopic"); private readonly FakeTimeProvider _timeProvider = new(); - public MessagePumpUnacceptableMessageDeadLetterChannelTests() { SpyRequeueCommandProcessor commandProcessor = new(); - _bus = new InternalBus(); - - _channel = new Channel( - new (Channel), - _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, deadLetterTopic: _deadLetterKey, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), - null); + _channel = new Channel(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, deadLetterTopic: _deadLetterKey, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - - _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) + _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) { - Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = 3 + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = 3 }; - var myMessage = JsonSerializer.Serialize(new MyEvent()); - var unacceptableMessage = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody(myMessage) - ); - + var unacceptableMessage = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody(myMessage)); _channel.Enqueue(unacceptableMessage); - } - [Fact] + [Test] public async Task When_An_Unacceptable_Message_Is_Recieved() { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); await Task.Delay(1000); // slopwatch:suppress SW004 - message pump runs on background thread with no sync point - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); _channel.Enqueue(quitMessage); - await Task.WhenAll(new[] { task }); - - Assert.Empty(_bus.Stream(_routingKey)); - Assert.NotEmpty(_bus.Stream(_deadLetterKey)); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + await Assert.That(_bus.Stream(_deadLetterKey)).IsNotEmpty(); } } \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_unacceptable_message_is_recieved_and_there_is_a_imc.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_unacceptable_message_is_recieved_and_there_is_a_imc.cs index ed46198f97..a353f0dfa3 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_unacceptable_message_is_recieved_and_there_is_a_imc.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_unacceptable_message_is_recieved_and_there_is_a_imc.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Text.Json; using System.Threading.Tasks; @@ -30,10 +28,8 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor; - public class MessagePumpUnacceptableMessageInvalidMessageChannelTests { private const string Channel = "MyChannel"; @@ -43,54 +39,34 @@ public class MessagePumpUnacceptableMessageInvalidMessageChannelTests private readonly RoutingKey _routingKey = new("MyTopic"); private readonly RoutingKey _invalidMessageKey = new("MyDeadLetterTopic"); private readonly FakeTimeProvider _timeProvider = new(); - public MessagePumpUnacceptableMessageInvalidMessageChannelTests() { SpyRequeueCommandProcessor commandProcessor = new(); - _bus = new InternalBus(); - - _channel = new Channel( - new (Channel), - _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, invalidMessageTopic: _invalidMessageKey, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), - null); + _channel = new Channel(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, invalidMessageTopic: _invalidMessageKey, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - - _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) + _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, null, new InMemoryRequestContextFactory(), _channel) { - Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), RequeueCount = 3 + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = 3 }; - var myMessage = JsonSerializer.Serialize(new MyEvent()); - var unacceptableMessage = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody(myMessage) - ); - + var unacceptableMessage = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody(myMessage)); _channel.Enqueue(unacceptableMessage); - } - [Fact] + [Test] public async Task When_An_Unacceptable_Message_Is_Recieved() { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); await Task.Delay(1000); // slopwatch:suppress SW004 - message pump runs on background thread with no sync point - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); _channel.Enqueue(quitMessage); - await Task.WhenAll(new[] { task }); - - Assert.Empty(_bus.Stream(_routingKey)); - Assert.NotEmpty(_bus.Stream(_invalidMessageKey)); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + await Assert.That(_bus.Stream(_invalidMessageKey)).IsNotEmpty(); } } \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_unacceptable_message_limit_is_reached.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_unacceptable_message_limit_is_reached.cs index dd58fea533..4fb03bc13b 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_unacceptable_message_limit_is_reached.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_unacceptable_message_limit_is_reached.cs @@ -1,11 +1,10 @@ -using System; +using System; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -16,72 +15,39 @@ public class MessagePumpUnacceptableMessageLimitBreachedTests private readonly InternalBus _bus; private readonly FakeTimeProvider _timeProvider = new(); private readonly RoutingKey _routingKey = new("MyTopic"); - public MessagePumpUnacceptableMessageLimitBreachedTests() { SpyRequeueCommandProcessor commandProcessor = new(); - _bus = new InternalBus(); - - var channel = new Channel( - new(Channel), - _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), - 3 - ); - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), - null); + var channel = new Channel(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), 3); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - - _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, null, new InMemoryRequestContextFactory(), channel, - timeProvider:_timeProvider) + _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, null, new InMemoryRequestContextFactory(), channel, timeProvider: _timeProvider) { - Channel = channel, - TimeOut = TimeSpan.FromMilliseconds(5000), - RequeueCount = 3, - UnacceptableMessageLimit = 3, + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = 3, + UnacceptableMessageLimit = 3, UnacceptableMessageLimitWindow = TimeSpan.FromMinutes(1) }; - - var unacceptableMessage1 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody("") - ); - var unacceptableMessage2 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody("") - ); - var unacceptableMessage3 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody("") - ); - var unacceptableMessage4 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody("") - ); - + var unacceptableMessage1 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody("")); + var unacceptableMessage2 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody("")); + var unacceptableMessage3 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody("")); + var unacceptableMessage4 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody("")); channel.Enqueue(unacceptableMessage1); channel.Enqueue(unacceptableMessage2); channel.Enqueue(unacceptableMessage3); channel.Enqueue(unacceptableMessage4); - } - [Fact] + [Test] public async Task When_An_Unacceptable_Message_Limit_Is_Reached() { var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); - await Task.WhenAll(task); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //This will trigger requeue of not acked/rejected messages - - Assert.Empty(_bus.Stream(_routingKey)); - - Assert.Equal(MessagePumpStatus.MP_LIMIT_EXCEEDED, _messagePump.Status); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + await Assert.That(_messagePump.Status).IsEqualTo(MessagePumpStatus.MP_LIMIT_EXCEEDED); } } -} - +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_unacceptable_message_limit_is_reset.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_unacceptable_message_limit_is_reset.cs index a0c0b021e7..e4a6230e04 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_unacceptable_message_limit_is_reset.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_an_unacceptable_message_limit_is_reset.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Extensions; @@ -6,7 +6,6 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -23,105 +22,48 @@ public class MessagePumpUnacceptableMessageLimitResetTests private readonly Message _unacceptableMessage3; private readonly Message _unacceptableMessage4; private readonly Message _timeAdvanceMessage; - public MessagePumpUnacceptableMessageLimitResetTests() { _bus = new InternalBus(); - - _channel = new Channel( - new(Channel), - _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), - 10 - ); - + _channel = new Channel(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), 10); var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.Register(); - - var handlerFactory = new SimpleHandlerFactory( - (type) => new MyAdvanceTimerEventHandler(_timeProvider), - (type) => throw new NotImplementedException() - ); - + var handlerFactory = new SimpleHandlerFactory((type) => new MyAdvanceTimerEventHandler(_timeProvider), (type) => throw new NotImplementedException()); var resiliencePipelineRegistry = new ResiliencePipelineRegistry(); - resiliencePipelineRegistry.AddBrighterDefault(); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyAdvanceTimerEventMessageMapper()), - new SimpleMessageMapperFactoryAsync(_ => throw new NotImplementedException())); + resiliencePipelineRegistry.AddBrighterDefault(); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyAdvanceTimerEventMessageMapper()), new SimpleMessageMapperFactoryAsync(_ => throw new NotImplementedException())); messageMapperRegistry.Register(); - - var commandProcessor = new CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - resiliencePipelineRegistry, - new InMemorySchedulerFactory() - ); - - _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyAdvanceTimerEvent), - messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), _channel, - timeProvider:_timeProvider) + var commandProcessor = new CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), resiliencePipelineRegistry, new InMemorySchedulerFactory()); + _messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyAdvanceTimerEvent), messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), _channel, timeProvider: _timeProvider) { - Channel = _channel, - TimeOut = TimeSpan.FromMilliseconds(5000), - RequeueCount = 3, - UnacceptableMessageLimit = 3, + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + RequeueCount = 3, + UnacceptableMessageLimit = 3, UnacceptableMessageLimitWindow = TimeSpan.FromMinutes(1) }; - - _unacceptableMessage1 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody("") - ); - _unacceptableMessage2 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody("") - ); - _unacceptableMessage3 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody("") - ); - _unacceptableMessage4 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody("") - ); - - _timeAdvanceMessage = new MyAdvanceTimerEventMessageMapper().MapToMessage( - new MyAdvanceTimerEvent(2), - new Publication - { - Topic = _routingKey - }); - + _unacceptableMessage1 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody("")); + _unacceptableMessage2 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody("")); + _unacceptableMessage3 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody("")); + _unacceptableMessage4 = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody("")); + _timeAdvanceMessage = new MyAdvanceTimerEventMessageMapper().MapToMessage(new MyAdvanceTimerEvent(2), new Publication { Topic = _routingKey }); } - [Fact] + [Test] public async Task When_An_Unacceptable_Message_Limit_Is_Reached() { _channel.Enqueue(_unacceptableMessage1); _channel.Enqueue(_unacceptableMessage2); - //force the time forward, whilst in the message loop _channel.Enqueue(_timeAdvanceMessage); - - //will trigger reset of unacceptable message count as window has passed _channel.Enqueue(_unacceptableMessage3); _channel.Enqueue(_unacceptableMessage4); - var task = Task.Factory.StartNew(() => _messagePump.Run(), TaskCreationOptions.LongRunning); - - _channel.Stop(_routingKey); - await Task.WhenAll(task); - - Assert.Empty(_bus.Stream(_routingKey)); - - Assert.Equal(MessagePumpStatus.MP_STOPPED, _messagePump.Status); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); + await Assert.That(_messagePump.Status).IsEqualTo(MessagePumpStatus.MP_STOPPED); } } -} - +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_reading_a__dynamic_message_from_a_channel_pump_out_to_command_processor.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_reading_a__dynamic_message_from_a_channel_pump_out_to_command_processor.cs index 00ef17e270..0c1f108d4b 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_reading_a__dynamic_message_from_a_channel_pump_out_to_command_processor.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_reading_a__dynamic_message_from_a_channel_pump_out_to_command_processor.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text.Json; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; @@ -6,7 +6,6 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -14,93 +13,68 @@ public class MessagePumpToCommandProcessorDynamicMappingTests { private const string Channel = "MyChannel"; private readonly RoutingKey _routingKey = new("MyTopic"); - private readonly InternalBus _bus = new (); + private readonly InternalBus _bus = new(); private readonly FakeTimeProvider _timeProvider = new(); private readonly IAmAMessagePump _messagePump; private readonly SpyCommandProcessor _commandProcessor; private readonly Channel _channel; - public MessagePumpToCommandProcessorDynamicMappingTests() { _commandProcessor = new SpyCommandProcessor(); - _channel = new( - new(Channel), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - - var messagerMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(type => - type switch - { - var t when t == typeof(MyEventMessageMapper) => new MyEventMessageMapper(), - var t when t == typeof(MyOtherEventMessageMapper) => new MyOtherEventMessageMapper(), - _ => throw new ArgumentException($"No mapper registered for type {type.FullName}", nameof(type)) - }), - null); + _channel = new(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messagerMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(type => type switch + { + var t when t == typeof(MyEventMessageMapper) => new MyEventMessageMapper(), + var t when t == typeof(MyOtherEventMessageMapper) => new MyOtherEventMessageMapper(), + _ => throw new ArgumentException($"No mapper registered for type {type.FullName}", nameof(type))}), null); messagerMapperRegistry.Register(); messagerMapperRegistry.Register(); - - _messagePump = new ServiceActivator.Reactor(_commandProcessor, (message) => - message switch - { - var m when m.Header.Type == new CloudEventsType("io.brighter.paramore.myevent") => typeof(MyEvent), - var m when m.Header.Type == new CloudEventsType("io.brighter.paramore.myotherevent") => typeof(MyOtherEvent), - _ => throw new ArgumentException($"No type mapping found for message with type {message.Header.Type}", nameof(message)), - }, - messagerMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), _channel) - { Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000) }; + _messagePump = new ServiceActivator.Reactor(_commandProcessor, (message) => message switch + { + var m when m.Header.Type == new CloudEventsType("io.brighter.paramore.myevent") => typeof(MyEvent), + var m when m.Header.Type == new CloudEventsType("io.brighter.paramore.myotherevent") => typeof(MyOtherEvent), + _ => throw new ArgumentException($"No type mapping found for message with type {message.Header.Type}", nameof(message)), + }, messagerMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), _channel) + { + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000) + }; } - [Fact] - public void When_Reading_A_MyOtherEvent_Message_From_A_Channel_Pump_Out_To_Command_Processor() + [Test] + public async Task When_Reading_A_MyOtherEvent_Message_From_A_Channel_Pump_Out_To_Command_Processor() { //arrange var @event = new MyEvent(); //although we send a MyEvent, we will map it dynamically to a MyOtherEvent - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT, type: new CloudEventsType("io.brighter.paramore.myotherevent") ), - new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options)) - ); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT, type: new CloudEventsType("io.brighter.paramore.myotherevent")), new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); _channel.Enqueue(message); var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); _channel.Enqueue(quitMessage); - //act _messagePump.Run(); - //assert - - Assert.Equal(CommandType.Publish, _commandProcessor.Commands[0]); + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.Publish); var myOtherEvent = _commandProcessor.Observe(); - Assert.Equal(@event.Id, myOtherEvent.Id); - Assert.Equal(@event.Data, myOtherEvent.Data); + await Assert.That(myOtherEvent.Id).IsEqualTo(@event.Id); + await Assert.That(myOtherEvent.Data).IsEqualTo(@event.Data); } - - [Fact] - public void When_Reading_A_MyEvent_Message_From_A_Channel_Pump_Out_To_Command_Processor() + + [Test] + public async Task When_Reading_A_MyEvent_Message_From_A_Channel_Pump_Out_To_Command_Processor() { //arrange var @event = new MyEvent(); //we send a MyEvent, we will map it dynamically to a MyEvent - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT, type: new CloudEventsType("io.brighter.paramore.myevent") ), - new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options)) - ); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT, type: new CloudEventsType("io.brighter.paramore.myevent")), new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); _channel.Enqueue(message); var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); _channel.Enqueue(quitMessage); - //act _messagePump.Run(); - //assert - - Assert.Equal(CommandType.Publish, _commandProcessor.Commands[0]); + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.Publish); var myEvent = _commandProcessor.Observe(); - Assert.Equal(@event.Id, myEvent.Id); - Assert.Equal(@event.Data, myEvent.Data); + await Assert.That(myEvent.Id).IsEqualTo(@event.Id); + await Assert.That(myEvent.Data).IsEqualTo(@event.Data); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_reading_a_message_from_a_channel_pump_out_to_command_processor.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_reading_a_message_from_a_channel_pump_out_to_command_processor.cs index e68d13165e..22651bd9e2 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_reading_a_message_from_a_channel_pump_out_to_command_processor.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_reading_a_message_from_a_channel_pump_out_to_command_processor.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text.Json; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; @@ -6,7 +6,6 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -14,49 +13,35 @@ public class MessagePumpToCommandProcessorTests { private const string Channel = "MyChannel"; private readonly RoutingKey _routingKey = new("MyTopic"); - private readonly InternalBus _bus = new (); + private readonly InternalBus _bus = new(); private readonly FakeTimeProvider _timeProvider = new(); private readonly IAmAMessagePump _messagePump; private readonly SpyCommandProcessor _commandProcessor; private readonly MyEvent _event; - public MessagePumpToCommandProcessorTests() { _commandProcessor = new SpyCommandProcessor(); - Channel channel = new( - new(Channel), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - - var messagerMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), - null); + Channel channel = new(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messagerMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), null); messagerMapperRegistry.Register(); - - _messagePump = new ServiceActivator.Reactor(_commandProcessor, (message) => typeof(MyEvent), - messagerMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel) - { Channel = channel, TimeOut = TimeSpan.FromMilliseconds(5000) }; - + _messagePump = new ServiceActivator.Reactor(_commandProcessor, (message) => typeof(MyEvent), messagerMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel) + { + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(5000) + }; _event = new MyEvent(); - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize(_event, JsonSerialisationOptions.Options)) - ); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(_event, JsonSerialisationOptions.Options))); channel.Enqueue(message); var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); channel.Enqueue(quitMessage); - } - [Fact] - public void When_Reading_A_Message_From_A_Channel_Pump_Out_To_Command_Processor() + [Test] + public async Task When_Reading_A_Message_From_A_Channel_Pump_Out_To_Command_Processor() { _messagePump.Run(); - - Assert.Equal(CommandType.Publish, _commandProcessor.Commands[0]); - Assert.Equal(_event, _commandProcessor.Observe()); + await Assert.That(_commandProcessor.Commands[0]).IsEqualTo(CommandType.Publish); + await Assert.That(_commandProcessor.Observe()).IsEqualTo(_event); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_running_a_message_pump_on_a_thread_should_be_able_to_stop.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_running_a_message_pump_on_a_thread_should_be_able_to_stop.cs index aa9a89f7cf..e4be64296b 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_running_a_message_pump_on_a_thread_should_be_able_to_stop.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/Reactor/When_running_a_message_pump_on_a_thread_should_be_able_to_stop.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text.Json; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; @@ -7,7 +7,6 @@ using Paramore.Brighter.Testing; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.ServiceActivator; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageDispatch.Reactor { @@ -19,49 +18,31 @@ public class PerformerCanStopTests private readonly InternalBus _bus = new(); private readonly FakeTimeProvider _timeProvider = new(); private readonly Task _performerTask; - public PerformerCanStopTests() { SpyCommandProcessor commandProcessor = new(); - Channel channel = new( - new(Channel), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), - null); + Channel channel = new(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - - var messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel); + var messagePump = new ServiceActivator.Reactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel); messagePump.Channel = channel; messagePump.TimeOut = TimeSpan.FromMilliseconds(5000); - var @event = new MyEvent(); - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options)) - ); + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); channel.Enqueue(message); - Performer performer = new(channel, messagePump); _performerTask = performer.Run(); performer.Stop(new RoutingKey(Topic)); - } - -#pragma warning disable xUnit1031 - [Fact] - public void When_Running_A_Message_Pump_On_A_Thread_Should_Be_Able_To_Stop() - { - _performerTask.Wait(); - Assert.True(_performerTask.IsCompleted); - Assert.False(_performerTask.IsFaulted); - Assert.False(_performerTask.IsCanceled); - Assert.Empty(_bus.Stream(_routingKey)); + [Test] + public async Task When_Running_A_Message_Pump_On_A_Thread_Should_Be_Able_To_Stop() + { + await _performerTask; + await Assert.That(_performerTask.IsCompleted).IsTrue(); + await Assert.That(_performerTask.IsFaulted).IsFalse(); + await Assert.That(_performerTask.IsCanceled).IsFalse(); + await Assert.That(_bus.Stream(_routingKey)).IsEmpty(); } -#pragma warning restore xUnit1031 } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/TestDoubles/MyRejectedEventHandler.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/TestDoubles/MyRejectedEventHandler.cs index 84abf59375..3c18f3eeb6 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/TestDoubles/MyRejectedEventHandler.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/TestDoubles/MyRejectedEventHandler.cs @@ -1,18 +1,24 @@ -using System.Threading; +using System; +using System.Threading.Tasks; using Paramore.Brighter.Actions; namespace Paramore.Brighter.Core.Tests.MessageDispatch.TestDoubles; public class MyRejectedEventHandler : RequestHandler { - private static readonly ManualResetEventSlim s_handled = new(false); + private static TaskCompletionSource s_handled = NewCompletionSource(); - public static void Reset() => s_handled.Reset(); - public static bool WaitForHandle(int timeoutMs = 5000) => s_handled.Wait(timeoutMs); + public static void Reset() => s_handled = NewCompletionSource(); + + public static Task WaitForHandleAsync(int timeoutMs = 5000) => + s_handled.Task.WaitAsync(TimeSpan.FromMilliseconds(timeoutMs)); + + private static TaskCompletionSource NewCompletionSource() => + new(TaskCreationOptions.RunContinuationsAsynchronously); public override MyRejectedEvent Handle(MyRejectedEvent myRejectedEvent) { - s_handled.Set(); + s_handled.TrySetResult(true); throw new RejectMessageAction("Test of rejection flow"); } } diff --git a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/TestDoubles/SpyCommandProcessor.cs b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/TestDoubles/SpyCommandProcessor.cs index dd8ee34037..d1d4b69784 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageDispatch/TestDoubles/SpyCommandProcessor.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageDispatch/TestDoubles/SpyCommandProcessor.cs @@ -103,7 +103,8 @@ public SpyDontAckCommandProcessor() PublishCount = 0; } - public bool WaitForHandle(int timeoutMs = 5000) => _handled.Wait(timeoutMs); + public async Task WaitForHandleAsync(int timeoutMs = 5000) => + await _handled.WaitAsync(TimeSpan.FromMilliseconds(timeoutMs)); public override void Send(T command, RequestContext? requestContext = null) { diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Message_Has_A_Transform.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Message_Has_A_Transform.cs index 5a9aed385f..9e749b2ed4 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Message_Has_A_Transform.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Message_Has_A_Transform.cs @@ -1,43 +1,32 @@ -using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; -using Xunit; +using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - - public class MessageUnwrapPathPipelineTests +public class MessageUnwrapPathPipelineTests { private UnwrapPipeline _transformPipeline; private readonly TransformPipelineBuilder _pipelineBuilder; - public MessageUnwrapPathPipelineTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyTransformableCommandMessageMapper()), - null); + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyTransformableCommandMessageMapper()), null); mapperRegistry.Register(); - var messageTransformerFactory = new SimpleMessageTransformerFactory((_ => new MySimpleTransform())); - _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, messageTransformerFactory); - } - - [Fact] - public void When_A_Message_Mapper_Map_To_Message_Has_A_Transform() + + [Test] + public async Task When_A_Message_Mapper_Map_To_Message_Has_A_Transform() { //act _transformPipeline = _pipelineBuilder.BuildUnwrapPipeline(); - //assert - Assert.Equal("MySimpleTransform|MyTransformableCommandMessageMapper", TraceFilters().ToString()); + await Assert.That(TraceFilters().ToString()).IsEqualTo("MySimpleTransform|MyTransformableCommandMessageMapper"); } - + private TransformPipelineTracer TraceFilters() { var pipelineTracer = new TransformPipelineTracer(); _transformPipeline.DescribePath(pipelineTracer); return pipelineTracer; } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Message_Has_A_TransformAsync.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Message_Has_A_TransformAsync.cs index 6e0295a556..4e036a5a06 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Message_Has_A_TransformAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Message_Has_A_TransformAsync.cs @@ -1,45 +1,33 @@ -using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; +using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - - public class AsyncMessageUnwrapPathPipelineTests +public class AsyncMessageUnwrapPathPipelineTests { private UnwrapPipelineAsync _transformPipeline; private readonly TransformPipelineBuilderAsync _pipelineBuilder; - public AsyncMessageUnwrapPathPipelineTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyTransformableCommandMessageMapperAsync())); + var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyTransformableCommandMessageMapperAsync())); mapperRegistry.RegisterAsync(); - var messageTransformerFactory = new SimpleMessageTransformerFactoryAsync((_ => new MySimpleTransformAsync())); - _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.All); - } - - [Fact] - public void When_A_Message_Mapper_Map_To_Message_Has_A_Transform() + + [Test] + public async Task When_A_Message_Mapper_Map_To_Message_Has_A_Transform() { //act _transformPipeline = _pipelineBuilder.BuildUnwrapPipeline(); - //assert - Assert.Equal("MySimpleTransformAsync|MyTransformableCommandMessageMapperAsync", TraceFilters().ToString()); - + await Assert.That(TraceFilters().ToString()).IsEqualTo("MySimpleTransformAsync|MyTransformableCommandMessageMapperAsync"); } - + private TransformPipelineTracer TraceFilters() { var pipelineTracer = new TransformPipelineTracer(); _transformPipeline.DescribePath(pipelineTracer); return pipelineTracer; } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Message_Has_No_Transform.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Message_Has_No_Transform.cs index eded1cda11..851a37881e 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Message_Has_No_Transform.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Message_Has_No_Transform.cs @@ -1,43 +1,32 @@ -using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; -using Xunit; +using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - - public class MessageUnwrapPathNoTransformPipelineTests +public class MessageUnwrapPathNoTransformPipelineTests { private UnwrapPipeline _transformPipeline; private readonly TransformPipelineBuilder _pipelineBuilder; - public MessageUnwrapPathNoTransformPipelineTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyVanillaCommandMessageMapper()), - null); - mapperRegistry.Register(); - + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyVanillaCommandMessageMapper()), null); + mapperRegistry.Register(); var messageTransformerFactory = new SimpleMessageTransformerFactory((_ => null)); - _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, messageTransformerFactory); - } - - [Fact] - public void When_A_Message_Mapper_Map_To_Message_Has_No_Transform() + + [Test] + public async Task When_A_Message_Mapper_Map_To_Message_Has_No_Transform() { //act _transformPipeline = _pipelineBuilder.BuildUnwrapPipeline(); - //assert - Assert.Equal("MyVanillaCommandMessageMapper", TraceFilters().ToString()); + await Assert.That(TraceFilters().ToString()).IsEqualTo("MyVanillaCommandMessageMapper"); } - + private TransformPipelineTracer TraceFilters() { var pipelineTracer = new TransformPipelineTracer(); _transformPipeline.DescribePath(pipelineTracer); return pipelineTracer; } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Message_Has_No_TransformAsync.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Message_Has_No_TransformAsync.cs index efc330dbc3..3c5494da95 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Message_Has_No_TransformAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Message_Has_No_TransformAsync.cs @@ -1,44 +1,33 @@ -using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; +using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - - public class AsyncMessageUnwrapPathNoTransformPipelineTests +public class AsyncMessageUnwrapPathNoTransformPipelineTests { private UnwrapPipelineAsync _transformPipeline; private readonly TransformPipelineBuilderAsync _pipelineBuilder; - public AsyncMessageUnwrapPathNoTransformPipelineTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyVanillaCommandMessageMapperAsync())); - mapperRegistry.RegisterAsync(); - + var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyVanillaCommandMessageMapperAsync())); + mapperRegistry.RegisterAsync(); var messageTransformerFactory = new SimpleMessageTransformerFactoryAsync((_ => null)); - _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.All); - } - - [Fact] - public void When_A_Message_Mapper_Map_To_Message_Has_No_Transform() + + [Test] + public async Task When_A_Message_Mapper_Map_To_Message_Has_No_Transform() { //act _transformPipeline = _pipelineBuilder.BuildUnwrapPipeline(); - //assert - Assert.Equal("MyVanillaCommandMessageMapperAsync", TraceFilters().ToString()); + await Assert.That(TraceFilters().ToString()).IsEqualTo("MyVanillaCommandMessageMapperAsync"); } - + private TransformPipelineTracer TraceFilters() { var pipelineTracer = new TransformPipelineTracer(); _transformPipeline.DescribePath(pipelineTracer); return pipelineTracer; } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Request_Has_A_Transform.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Request_Has_A_Transform.cs index 3c7d1c9fa1..d030bc063c 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Request_Has_A_Transform.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Request_Has_A_Transform.cs @@ -1,38 +1,26 @@ -using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; -using Xunit; +using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - - public class MessageWrapPathPipelineTests +public class MessageWrapPathPipelineTests { private WrapPipeline _transformPipeline; private readonly TransformPipelineBuilder _pipelineBuilder; - public MessageWrapPathPipelineTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyTransformableCommandMessageMapper()), - null - ); - mapperRegistry.Register(); - + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyTransformableCommandMessageMapper()), null); + mapperRegistry.Register(); var messageTransformerFactory = new SimpleMessageTransformerFactory((_ => new MySimpleTransform())); - _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, messageTransformerFactory); - } - - [Fact] - public void When_A_Message_Mapper_Map_To_Request_Has_A_Transform() + + [Test] + public async Task When_A_Message_Mapper_Map_To_Request_Has_A_Transform() { //act _transformPipeline = _pipelineBuilder.BuildWrapPipeline(); - //assert - Assert.Equal("MyTransformableCommandMessageMapper|MySimpleTransform", TraceFilters().ToString()); + await Assert.That(TraceFilters().ToString()).IsEqualTo("MyTransformableCommandMessageMapper|MySimpleTransform"); } private TransformPipelineTracer TraceFilters() @@ -41,4 +29,4 @@ private TransformPipelineTracer TraceFilters() _transformPipeline.DescribePath(pipelineTracer); return pipelineTracer; } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Request_Has_A_TransformAsync.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Request_Has_A_TransformAsync.cs index 893a36aa12..3ee8191521 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Request_Has_A_TransformAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Request_Has_A_TransformAsync.cs @@ -1,39 +1,27 @@ -using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; +using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - - public class AsyncMessageWrapPathPipelineTests +public class AsyncMessageWrapPathPipelineTests { private WrapPipelineAsync _transformPipeline; private readonly TransformPipelineBuilderAsync _pipelineBuilder; - public AsyncMessageWrapPathPipelineTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyTransformableCommandMessageMapperAsync()) - ); - mapperRegistry.RegisterAsync(); - + var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyTransformableCommandMessageMapperAsync())); + mapperRegistry.RegisterAsync(); var messageTransformerFactory = new SimpleMessageTransformerFactoryAsync((_ => new MySimpleTransformAsync())); - _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.All); - } - - [Fact] - public void When_A_Message_Mapper_Map_To_Request_Has_A_Transform() + + [Test] + public async Task When_A_Message_Mapper_Map_To_Request_Has_A_Transform() { //act _transformPipeline = _pipelineBuilder.BuildWrapPipeline(); - //assert - Assert.Equal("MyTransformableCommandMessageMapperAsync|MySimpleTransformAsync", TraceFilters().ToString()); + await Assert.That(TraceFilters().ToString()).IsEqualTo("MyTransformableCommandMessageMapperAsync|MySimpleTransformAsync"); } private TransformPipelineTracer TraceFilters() @@ -42,4 +30,4 @@ private TransformPipelineTracer TraceFilters() _transformPipeline.DescribePath(pipelineTracer); return pipelineTracer; } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Request_Has_No_Transform.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Request_Has_No_Transform.cs index 0cb27b1bde..2bb0ca0f8d 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Request_Has_No_Transform.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Request_Has_No_Transform.cs @@ -1,37 +1,26 @@ -using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; -using Xunit; +using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - - public class MessageWrapPathPipelineNoTransformTests +public class MessageWrapPathPipelineNoTransformTests { private WrapPipeline _transformPipeline; private readonly TransformPipelineBuilder _pipelineBuilder; - public MessageWrapPathPipelineNoTransformTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyVanillaCommandMessageMapper()), - null); - mapperRegistry.Register(); - + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyVanillaCommandMessageMapper()), null); + mapperRegistry.Register(); var messageTransformerFactory = new SimpleMessageTransformerFactory((_ => null)); - _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, messageTransformerFactory); - } - - [Fact] - public void When_A_Message_Mapper_Map_To_Request_Has_No_Transform() + + [Test] + public async Task When_A_Message_Mapper_Map_To_Request_Has_No_Transform() { //act _transformPipeline = _pipelineBuilder.BuildWrapPipeline(); - //assert - Assert.Equal("MyVanillaCommandMessageMapper", TraceFilters().ToString()); + await Assert.That(TraceFilters().ToString()).IsEqualTo("MyVanillaCommandMessageMapper"); } private TransformPipelineTracer TraceFilters() @@ -40,4 +29,4 @@ private TransformPipelineTracer TraceFilters() _transformPipeline.DescribePath(pipelineTracer); return pipelineTracer; } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Request_Has_No_Transform_Async.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Request_Has_No_Transform_Async.cs index 607c8110a4..3ff8a7d2d4 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Request_Has_No_Transform_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_A_Message_Mapper_Map_To_Request_Has_No_Transform_Async.cs @@ -1,38 +1,27 @@ -using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; +using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - - public class AsyncMessageWrapPathPipelineNoTransformTests +public class AsyncMessageWrapPathPipelineNoTransformTests { private WrapPipelineAsync _transformPipeline; private readonly TransformPipelineBuilderAsync _pipelineBuilder; - public AsyncMessageWrapPathPipelineNoTransformTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyVanillaCommandMessageMapperAsync())); - mapperRegistry.RegisterAsync(); - + var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyVanillaCommandMessageMapperAsync())); + mapperRegistry.RegisterAsync(); var messageTransformerFactory = new SimpleMessageTransformerFactoryAsync((_ => null)); - _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.All); - } - - [Fact] - public void When_A_Message_Mapper_Map_To_Request_Has_No_Transform() + + [Test] + public async Task When_A_Message_Mapper_Map_To_Request_Has_No_Transform() { //act _transformPipeline = _pipelineBuilder.BuildWrapPipeline(); - //assert - Assert.Equal("MyVanillaCommandMessageMapperAsync", TraceFilters().ToString()); + await Assert.That(TraceFilters().ToString()).IsEqualTo("MyVanillaCommandMessageMapperAsync"); } private TransformPipelineTracer TraceFilters() @@ -41,4 +30,4 @@ private TransformPipelineTracer TraceFilters() _transformPipeline.DescribePath(pipelineTracer); return pipelineTracer; } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_A_Pipeline_Builder_Without_A_Registry.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_A_Pipeline_Builder_Without_A_Registry.cs index d4c8dc670a..a2b70a57a5 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_A_Pipeline_Builder_Without_A_Registry.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_A_Pipeline_Builder_Without_A_Registry.cs @@ -1,25 +1,18 @@ -using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; +using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Core.Tests.TestHelpers; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - - public class TransformPipelineMissingRegistryTests +public class TransformPipelineMissingRegistryTests { - [Fact] - public void When_Creating_A_Pipeline_Builder_Without_A_Registry() + [Test] + public async Task When_Creating_A_Pipeline_Builder_Without_A_Registry() { - //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var messageTransformerFactory = new SimpleMessageTransformerFactory((_ => new MySimpleTransform())); - - //act - var exception = Catch.Exception(() => new TransformPipelineBuilder(null, messageTransformerFactory)); - - //assert - Assert.NotNull(exception); - Assert.True((exception) is ConfigurationException); - + //arrange + var messageTransformerFactory = new SimpleMessageTransformerFactory((_ => new MySimpleTransform())); + //act + var exception = Catch.Exception(() => new TransformPipelineBuilder(null, messageTransformerFactory)); + //assert + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ConfigurationException).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_A_Pipeline_Builder_Without_A_Registry_Async.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_A_Pipeline_Builder_Without_A_Registry_Async.cs index c5fb4bf80c..7370d23afe 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_A_Pipeline_Builder_Without_A_Registry_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_A_Pipeline_Builder_Without_A_Registry_Async.cs @@ -1,26 +1,19 @@ -using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; +using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - - public class AsyncTransformPipelineMissingRegistryTests +public class AsyncTransformPipelineMissingRegistryTests { - [Fact] - public void When_Creating_A_Pipeline_Builder_Without_A_Registry() + [Test] + public async Task When_Creating_A_Pipeline_Builder_Without_A_Registry() { - //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var messageTransformerFactory = new SimpleMessageTransformerFactoryAsync((_ => new MySimpleTransformAsync())); - - //act - var exception = Catch.Exception(() => new TransformPipelineBuilderAsync(null, messageTransformerFactory, InstrumentationOptions.All)); - - //assert - Assert.NotNull(exception); - Assert.True((exception) is ConfigurationException); - + //arrange + var messageTransformerFactory = new SimpleMessageTransformerFactoryAsync((_ => new MySimpleTransformAsync())); + //act + var exception = Catch.Exception(() => new TransformPipelineBuilderAsync(null, messageTransformerFactory, InstrumentationOptions.All)); + //assert + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ConfigurationException).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_A_Wrap_Without_A_Factory.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_A_Wrap_Without_A_Factory.cs index 1433af116e..bdcce30d03 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_A_Wrap_Without_A_Factory.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_A_Wrap_Without_A_Factory.cs @@ -1,57 +1,45 @@ -using System.Text.Json; +using System.Text.Json; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - - public class TransformPipelineMissingFactoryWrapTests +public class TransformPipelineMissingFactoryWrapTests { private WrapPipeline _transformPipeline; private readonly TransformPipelineBuilder _pipelineBuilder; private readonly MyTransformableCommand _myCommand; private readonly Publication _publication; - public TransformPipelineMissingFactoryWrapTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyTransformableCommandMessageMapper()), - null); + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyTransformableCommandMessageMapper()), null); mapperRegistry.Register(); - _myCommand = new MyTransformableCommand(); - - _publication = new Publication { Topic = new RoutingKey("MyTransformableCommand") }; - + _publication = new Publication + { + Topic = new RoutingKey("MyTransformableCommand") + }; _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, null); } - - [Fact] - public void When_Creating_A_Wrap_Without_A_Factory() + + [Test] + public async Task When_Creating_A_Wrap_Without_A_Factory() { //act _transformPipeline = _pipelineBuilder.BuildWrapPipeline(); - // If no factory we default to just them mapper - Assert.Equal("MyTransformableCommandMessageMapper", TraceFilters().ToString()); - + await Assert.That(TraceFilters().ToString()).IsEqualTo("MyTransformableCommandMessageMapper"); //wrap should just do message mapper - var message = _transformPipeline.Wrap(_myCommand,new RequestContext(), _publication); - + var message = _transformPipeline.Wrap(_myCommand, new RequestContext(), _publication); //assert - Assert.Equal(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)).ToString(), message.Body.Value); - + await Assert.That(message.Body.Value).IsEqualTo(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)).ToString()); //we won't run a transform - Assert.Equal(false, message.Header.Bag.ContainsKey(MySimpleTransformAsync.HEADER_KEY)); + await Assert.That(message.Header.Bag.ContainsKey(MySimpleTransformAsync.HEADER_KEY)).IsEqualTo(false); } - + private TransformPipelineTracer TraceFilters() { var pipelineTracer = new TransformPipelineTracer(); _transformPipeline.DescribePath(pipelineTracer); return pipelineTracer; } - -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_A_Wrap_Without_A_Factory_Async.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_A_Wrap_Without_A_Factory_Async.cs index 30ac902219..23091fe314 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_A_Wrap_Without_A_Factory_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_A_Wrap_Without_A_Factory_Async.cs @@ -1,59 +1,48 @@ -using System.Text.Json; +using System.Text.Json; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - - public class AsyncTransformPipelineMissingFactoryWrapTests +public class AsyncTransformPipelineMissingFactoryWrapTests { private WrapPipelineAsync _transformPipeline; private readonly TransformPipelineBuilderAsync _pipelineBuilder; private readonly MyTransformableCommand _myCommand; private readonly Publication _publication; - public AsyncTransformPipelineMissingFactoryWrapTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyTransformableCommandMessageMapperAsync())); + var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyTransformableCommandMessageMapperAsync())); mapperRegistry.RegisterAsync(); - _myCommand = new MyTransformableCommand(); - - _publication = new Publication{Topic = new RoutingKey("MyTransformableCommand"), RequestType= typeof(MyTransformableCommand)}; - + _publication = new Publication + { + Topic = new RoutingKey("MyTransformableCommand"), + RequestType = typeof(MyTransformableCommand) + }; _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, null, InstrumentationOptions.All); } - - [Fact] + + [Test] public async Task When_Creating_A_Wrap_Without_A_Factory() { //act _transformPipeline = _pipelineBuilder.BuildWrapPipeline(); - // If no factory we default to just them mapper - Assert.Equal("MyTransformableCommandMessageMapperAsync", TraceFilters().ToString()); - + await Assert.That(TraceFilters().ToString()).IsEqualTo("MyTransformableCommandMessageMapperAsync"); //wrap should just do message mapper var message = await _transformPipeline.WrapAsync(_myCommand, new RequestContext(), _publication); - //assert - Assert.Equal(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)).ToString(), message.Body.Value); - + await Assert.That(message.Body.Value).IsEqualTo(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)).ToString()); //we won't run a transform - Assert.Equal(false, message.Header.Bag.ContainsKey(MySimpleTransformAsync.HEADER_KEY)); + await Assert.That(message.Header.Bag.ContainsKey(MySimpleTransformAsync.HEADER_KEY)).IsEqualTo(false); } - + private TransformPipelineTracer TraceFilters() { var pipelineTracer = new TransformPipelineTracer(); _transformPipeline.DescribePath(pipelineTracer); return pipelineTracer; } - -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_An_Unwrap_Without_A_Factory.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_An_Unwrap_Without_A_Factory.cs index 289145caee..f44adab01d 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_An_Unwrap_Without_A_Factory.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_An_Unwrap_Without_A_Factory.cs @@ -1,58 +1,41 @@ -using System; +using System; using System.Text.Json; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - - public class TransformPipelineMissingFactoryUnwrapTests +public class TransformPipelineMissingFactoryUnwrapTests { private UnwrapPipeline _transformPipeline; private readonly TransformPipelineBuilder _pipelineBuilder; private readonly MyTransformableCommand _myCommand; private readonly Message _message; - public TransformPipelineMissingFactoryUnwrapTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyTransformableCommandMessageMapper()), - null); + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyTransformableCommandMessageMapper()), null); mapperRegistry.Register(); - _myCommand = new MyTransformableCommand(); - - _message = new Message( - new MessageHeader(_myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), - new MessageBody(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General))) - ); - + _message = new Message(new MessageHeader(_myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), new MessageBody(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)))); _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, null); } - - [Fact] - public void When_Creating_An_Unwrap_Without_A_Factory() + + [Test] + public async Task When_Creating_An_Unwrap_Without_A_Factory() { //act _transformPipeline = _pipelineBuilder.BuildUnwrapPipeline(); - // If no factory we default to just them mapper - Assert.Equal("MyTransformableCommandMessageMapper", TraceFilters().ToString()); - + await Assert.That(TraceFilters().ToString()).IsEqualTo("MyTransformableCommandMessageMapper"); //wrap should just do message mapper var request = _transformPipeline.Unwrap(_message, new RequestContext()); - //assert request.Value = _myCommand.Value; } - + private TransformPipelineTracer TraceFilters() { var pipelineTracer = new TransformPipelineTracer(); _transformPipeline.DescribePath(pipelineTracer); return pipelineTracer; } - -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_An_Unwrap_Without_A_Factory_Async.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_An_Unwrap_Without_A_Factory_Async.cs index 59cc0e0fdd..efb0a302eb 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_An_Unwrap_Without_A_Factory_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Creating_An_Unwrap_Without_A_Factory_Async.cs @@ -1,60 +1,43 @@ -using System; +using System; using System.Text.Json; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - - public class AsyncTransformPipelineMissingFactoryUnwrapTests +public class AsyncTransformPipelineMissingFactoryUnwrapTests { private UnwrapPipelineAsync _transformPipeline; private readonly TransformPipelineBuilderAsync _pipelineBuilder; private readonly MyTransformableCommand _myCommand; private readonly Message _message; - public AsyncTransformPipelineMissingFactoryUnwrapTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyTransformableCommandMessageMapperAsync())); + var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyTransformableCommandMessageMapperAsync())); mapperRegistry.RegisterAsync(); - _myCommand = new MyTransformableCommand(); - - _message = new Message( - new MessageHeader(_myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), - new MessageBody(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General))) - ); - + _message = new Message(new MessageHeader(_myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), new MessageBody(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)))); _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, null, InstrumentationOptions.All); } - - [Fact] + + [Test] public async Task When_Creating_An_Unwrap_Without_A_Factory() { //act _transformPipeline = _pipelineBuilder.BuildUnwrapPipeline(); - // If no factory we default to just them mapper - Assert.Equal("MyTransformableCommandMessageMapperAsync", TraceFilters().ToString()); - + await Assert.That(TraceFilters().ToString()).IsEqualTo("MyTransformableCommandMessageMapperAsync"); //wrap should just do message mapper var request = await _transformPipeline.UnwrapAsync(_message, new RequestContext()); - //assert request.Value = _myCommand.Value; } - + private TransformPipelineTracer TraceFilters() { var pipelineTracer = new TransformPipelineTracer(); _transformPipeline.DescribePath(pipelineTracer); return pipelineTracer; } - -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Deserializing_A_Message_Header_Bag.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Deserializing_A_Message_Header_Bag.cs index 4a24287171..45b61144cf 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Deserializing_A_Message_Header_Bag.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Deserializing_A_Message_Header_Bag.cs @@ -1,77 +1,94 @@ -using System; +using System; using System.Collections.Generic; using System.Text.Json; using Paramore.Brighter.JsonConverters; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation { - public class BagHelper + public class BagHelper { //We use a Dictionary for a header. System.Json.Text will serialize this as expected //but when deserializing it will return a a Dictionary where the object is a JsonElement //not a primitive/reference type. //The goal here is to convert back - [Fact] - public void When_deserializing_a_message_header_bag() - { - //Arrange - var header = new MessageHeader( - messageId: Guid.NewGuid().ToString(), - topic: new RoutingKey("MyTopic"), - messageType: MessageType.MT_EVENT, - timeStamp: DateTime.UtcNow, - correlationId: Guid.NewGuid().ToString() - ); - - var myGuid = Guid.NewGuid(); - var expectedBag = new Dictionary - { - {"myStringKey", "A string value"}, - {"myDateTimeKey", DateTime.UtcNow}, - {"myIntegerKey", 123}, - {"myDecimalKey", 123.56}, - {"myBooleanKeyTrue", true}, - {"myBooleanKey", false}, - {"myGuid", myGuid}, - {"myArrayKey", new int[]{1,2,3,4,}} - }; - - foreach (var key in expectedBag.Keys) - { + [Test] + public async Task When_deserializing_a_message_header_bag() + { + //Arrange + var header = new MessageHeader(messageId: Guid.NewGuid().ToString(), topic: new RoutingKey("MyTopic"), messageType: MessageType.MT_EVENT, timeStamp: DateTime.UtcNow, correlationId: Guid.NewGuid().ToString()); + var myGuid = Guid.NewGuid(); + var expectedBag = new Dictionary + { + { + "myStringKey", + "A string value" + }, + { + "myDateTimeKey", + DateTime.UtcNow + }, + { + "myIntegerKey", + 123 + }, + { + "myDecimalKey", + 123.56 + }, + { + "myBooleanKeyTrue", + true + }, + { + "myBooleanKey", + false + }, + { + "myGuid", + myGuid + }, + { + "myArrayKey", + new int[] + { + 1, + 2, + 3, + 4, + } + } + }; + foreach (var key in expectedBag.Keys) + { header.Bag.Add(key, expectedBag[key]); - } + } - var json = JsonSerializer.Serialize(header, JsonSerialisationOptions.Options); - - //Act - MessageHeader deserializedHeader = JsonSerializer.Deserialize(json, JsonSerialisationOptions.Options); - //fix the headers to pass - - //Assert - foreach (var key in expectedBag.Keys) - { - if (key != "myArrayKey") - { - var expected = expectedBag[key]; - var actual = deserializedHeader!.Bag[key]; - - Assert.Equivalent(expected, actual); - } - if (key == "myArrayKey") - { - var expectedVals = (int[])expectedBag[key]; - var providedVals = (List)deserializedHeader.Bag[key]; - - for (int i = 0; i < 4; i++) - { - int actual = Convert.ToInt32(providedVals[i]); - int expected = expectedVals[i]; - Assert.Equal(expected, actual); - } - } - } + var json = JsonSerializer.Serialize(header, JsonSerialisationOptions.Options); + //Act + MessageHeader deserializedHeader = JsonSerializer.Deserialize(json, JsonSerialisationOptions.Options); + //fix the headers to pass + //Assert + foreach (var key in expectedBag.Keys) + { + if (key != "myArrayKey") + { + var expected = expectedBag[key]; + var actual = deserializedHeader!.Bag[key]; + await Assert.That(actual?.ToString()).IsEqualTo(expected?.ToString()); + } - } + if (key == "myArrayKey") + { + var expectedVals = (int[])expectedBag[key]; + var providedVals = (List)deserializedHeader.Bag[key]; + for (int i = 0; i < 4; i++) + { + int actual = Convert.ToInt32(providedVals[i]); + int expected = expectedVals[i]; + await Assert.That(actual).IsEqualTo(expected); + } + } + } + } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_I_Am_Serialising_The_Payload.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_I_Am_Serialising_The_Payload.cs index 81e2666cab..7e96651810 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_I_Am_Serialising_The_Payload.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_I_Am_Serialising_The_Payload.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Net; using System.Net.Mime; @@ -6,250 +6,206 @@ using System.Text.Json; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.JsonConverters; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - -public class MessageValueSerializationTests +public class MessageValueSerializationTests { - - - [Fact] - public void When_I_serialise_a_vanilla_payload_as_a_utf8_string() + [Test] + public async Task When_I_serialise_a_vanilla_payload_as_a_utf8_string() { //arrange var request = new MyTransformableCommand { Value = "Hello World" }; - var body = JsonSerializer.Serialize(request, JsonSerialisationOptions.Options); var contentType = new ContentType(MediaTypeNames.Application.Json); - var serBody = new MessageBody(body, contentType, characterEncoding: CharacterEncoding.UTF8); - //act var serBodyValue = serBody.Value; - var desBody = new MessageBody(serBodyValue, contentType, characterEncoding: CharacterEncoding.UTF8); - //assert - Assert.Equal(CharacterEncoding.UTF8, serBody.CharacterEncoding); - Assert.Equal(CharacterEncoding.UTF8, desBody.CharacterEncoding); - Assert.Equal(desBody.Bytes, serBody.Bytes); - Assert.Equal(desBody.Value, serBody.Value); - + await Assert.That(serBody.CharacterEncoding).IsEqualTo(CharacterEncoding.UTF8); + await Assert.That(desBody.CharacterEncoding).IsEqualTo(CharacterEncoding.UTF8); + await Assert.That(serBody.Bytes).IsEquivalentTo(desBody.Bytes); + await Assert.That(serBody.Value).IsEqualTo(desBody.Value); } - - [Fact] - public void When_I_serialise_a_vanilla_payload_as_a_base64_string() + + [Test] + public async Task When_I_serialise_a_vanilla_payload_as_a_base64_string() { //arrange var request = new MyTransformableCommand { Value = "Hello World" }; - var body = JsonSerializer.Serialize(request, JsonSerialisationOptions.Options); var contentType = new ContentType(MediaTypeNames.Application.Json); - var serBody = new MessageBody(body, contentType, characterEncoding: CharacterEncoding.UTF8); - //act var serBodyValue = serBody.ToCharacterEncodedString(CharacterEncoding.Base64); - var desBody = new MessageBody(serBodyValue, contentType, characterEncoding: CharacterEncoding.Base64); - //assert - Assert.Equal(CharacterEncoding.UTF8, serBody.CharacterEncoding); - Assert.Equal(CharacterEncoding.Base64, desBody.CharacterEncoding); - Assert.Equal(desBody.Bytes, serBody.Bytes); - Assert.Equal(desBody.ToCharacterEncodedString(CharacterEncoding.UTF8), serBody.Value); - + await Assert.That(serBody.CharacterEncoding).IsEqualTo(CharacterEncoding.UTF8); + await Assert.That(desBody.CharacterEncoding).IsEqualTo(CharacterEncoding.Base64); + await Assert.That(serBody.Bytes).IsEquivalentTo(desBody.Bytes); + await Assert.That(serBody.Value).IsEqualTo(desBody.ToCharacterEncodedString(CharacterEncoding.UTF8)); } - - [Fact] - public void When_I_serialise_a_raw_payload_as_binary() + + [Test] + public async Task When_I_serialise_a_raw_payload_as_binary() { //arrange var request = new MyTransformableCommand { Value = "Hello World" }; - var body = JsonSerializer.Serialize(request, JsonSerialisationOptions.Options); var contentType = new ContentType(MediaTypeNames.Application.Octet); - var serBody = new MessageBody(Encoding.UTF8.GetBytes(body), contentType, characterEncoding: CharacterEncoding.Raw); - //act var desBody = new MessageBody(serBody.Bytes, contentType, characterEncoding: CharacterEncoding.Raw); - //assert - Assert.Equal(CharacterEncoding.Raw, serBody.CharacterEncoding); - Assert.Equal(CharacterEncoding.Raw, desBody.CharacterEncoding); - Assert.Equal(desBody.Bytes, serBody.Bytes); - + await Assert.That(serBody.CharacterEncoding).IsEqualTo(CharacterEncoding.Raw); + await Assert.That(desBody.CharacterEncoding).IsEqualTo(CharacterEncoding.Raw); + await Assert.That(serBody.Bytes).IsEquivalentTo(desBody.Bytes); } - - [Fact] - public void When_I_serialise_a_raw_payload_as_a_base64_string() + + [Test] + public async Task When_I_serialise_a_raw_payload_as_a_base64_string() { //arrange var request = new MyTransformableCommand { Value = "Hello World" }; - var body = JsonSerializer.Serialize(request, JsonSerialisationOptions.Options); var contentType = new ContentType(MediaTypeNames.Application.Octet); - var serBody = new MessageBody(Encoding.UTF8.GetBytes(body), contentType, characterEncoding: CharacterEncoding.Raw); - //act //Ask for the bytes as a base 64 string - var bodyAsString = serBody.ToCharacterEncodedString(CharacterEncoding.Base64); - + var bodyAsString = serBody.ToCharacterEncodedString(CharacterEncoding.Base64); var desBody = new MessageBody(serBody.Bytes, contentType, characterEncoding: CharacterEncoding.Base64); - //assert - Assert.Equal(CharacterEncoding.Raw, serBody.CharacterEncoding); - Assert.Equal(CharacterEncoding.Base64, desBody.CharacterEncoding); - Assert.Equal(desBody.Bytes, serBody.Bytes); - + await Assert.That(serBody.CharacterEncoding).IsEqualTo(CharacterEncoding.Raw); + await Assert.That(desBody.CharacterEncoding).IsEqualTo(CharacterEncoding.Base64); + await Assert.That(serBody.Bytes).IsEquivalentTo(desBody.Bytes); } - - [Fact] - public void When_I_try_to_serialise_a_raw_payload_as_a_string() + + [Test] + public async Task When_I_try_to_serialise_a_raw_payload_as_a_string() { //arrange var request = new MyTransformableCommand { Value = "Hello World" }; - var body = JsonSerializer.Serialize(request, JsonSerialisationOptions.Options); var contentType = new ContentType(MediaTypeNames.Application.Octet); - var serBody = new MessageBody(Encoding.UTF8.GetBytes(body), contentType, characterEncoding: CharacterEncoding.Raw); - //act //If we are raw, we get the bytes as a base64 encoded string var bodyAsString = serBody.Value; - var desBody = new MessageBody(bodyAsString, contentType, characterEncoding: CharacterEncoding.Base64); - //assert - Assert.Equal(CharacterEncoding.Raw, serBody.CharacterEncoding); - Assert.Equal(CharacterEncoding.Base64, desBody.CharacterEncoding); - Assert.Equal(desBody.Bytes, serBody.Bytes); + await Assert.That(serBody.CharacterEncoding).IsEqualTo(CharacterEncoding.Raw); + await Assert.That(desBody.CharacterEncoding).IsEqualTo(CharacterEncoding.Base64); + await Assert.That(serBody.Bytes).IsEquivalentTo(desBody.Bytes); } - - - [Fact] - public void When_I_serialise_a_kafka_payload_as_binary() + + [Test] + public async Task When_I_serialise_a_kafka_payload_as_binary() { //arrange var request = new MyTransformableCommand { Value = "Hello World" }; - var id = 1234; //Emulate Kafka SerDes that puts header bytes into the payload var body = JsonSerializer.Serialize(request, JsonSerialisationOptions.Options); - var magicByte = new byte[] { 0 }; + var magicByte = new byte[] + { + 0 + }; var schemaId = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(id)); var payload = magicByte.Concat(schemaId).ToArray(); var serdesBody = payload.Concat(Encoding.ASCII.GetBytes(body)).ToArray(); var contentType = new ContentType(MediaTypeNames.Application.Octet); - var serBody = new MessageBody(serdesBody, contentType, characterEncoding: CharacterEncoding.Raw); - //act //Ask for the value back as a Base64 encoded string var bodyAsString = serBody.ToCharacterEncodedString(CharacterEncoding.Base64); - //will be base64 encoded when read back var desBody = new MessageBody(bodyAsString, contentType, characterEncoding: CharacterEncoding.Base64); var retrievedSchemaId = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(desBody.Bytes.Skip(1).Take(4).ToArray())); - //assert - Assert.Equal(CharacterEncoding.Raw, serBody.CharacterEncoding); - Assert.Equal(CharacterEncoding.Base64, desBody.CharacterEncoding); - Assert.Equal(desBody.Bytes, serBody.Bytes); - Assert.Equal(id, retrievedSchemaId); - + await Assert.That(serBody.CharacterEncoding).IsEqualTo(CharacterEncoding.Raw); + await Assert.That(desBody.CharacterEncoding).IsEqualTo(CharacterEncoding.Base64); + await Assert.That(serBody.Bytes).IsEquivalentTo(desBody.Bytes); + await Assert.That(retrievedSchemaId).IsEqualTo(id); } - - [Fact] - public void When_I_serialise_a_utf8_kafka_payload_as_bytes() + + [Test] + public async Task When_I_serialise_a_utf8_kafka_payload_as_bytes() { //arrange var request = new MyTransformableCommand { Value = "Hello World" }; - var id = 1234; //Emulate Kafka SerDes that puts header bytes into the payload var body = JsonSerializer.Serialize(request, JsonSerialisationOptions.Options); - var magicByte = new byte[] { 0 }; + var magicByte = new byte[] + { + 0 + }; var schemaId = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(id)); var payload = magicByte.Concat(schemaId).ToArray(); var serdesBody = payload.Concat(Encoding.ASCII.GetBytes(body)).ToArray(); var contentType = new ContentType(MediaTypeNames.Application.Json); - var serBody = new MessageBody(serdesBody, contentType, characterEncoding: CharacterEncoding.UTF8); - //act - var bodyAsBytes = serBody.Bytes; //Transfer as bytes - + var bodyAsBytes = serBody.Bytes; //Transfer as bytes var desBody = new MessageBody(bodyAsBytes, contentType, characterEncoding: CharacterEncoding.UTF8); var retrievedSchemaId = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(desBody.Bytes.Skip(1).Take(4).ToArray())); - //assert - Assert.Equal(CharacterEncoding.UTF8, serBody.CharacterEncoding); - Assert.Equal(CharacterEncoding.UTF8, desBody.CharacterEncoding); - Assert.Equal(desBody.Bytes, serBody.Bytes); - Assert.Equal(desBody.Value, serBody.Value); - Assert.Equal(id, retrievedSchemaId); - + await Assert.That(serBody.CharacterEncoding).IsEqualTo(CharacterEncoding.UTF8); + await Assert.That(desBody.CharacterEncoding).IsEqualTo(CharacterEncoding.UTF8); + await Assert.That(serBody.Bytes).IsEquivalentTo(desBody.Bytes); + await Assert.That(serBody.Value).IsEqualTo(desBody.Value); + await Assert.That(retrievedSchemaId).IsEqualTo(id); } - - [Fact] - public void When_I_try_to_serialise_a_utf8_kafka_payload_as_a_utf8_string() + + [Test] + public async Task When_I_try_to_serialise_a_utf8_kafka_payload_as_a_utf8_string() { //arrange var request = new MyTransformableCommand { Value = "Hello World" }; - var id = 1234; //Emulate Kafka SerDes that puts header bytes into the payload var body = JsonSerializer.Serialize(request, JsonSerialisationOptions.Options); - var magicByte = new byte[] { 0 }; + var magicByte = new byte[] + { + 0 + }; var schemaId = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(id)); var payload = magicByte.Concat(schemaId).ToArray(); var serdesBody = payload.Concat(Encoding.ASCII.GetBytes(body)).ToArray(); var contentType = new ContentType(MediaTypeNames.Application.Json); - var serBody = new MessageBody(serdesBody, contentType, characterEncoding: CharacterEncoding.UTF8); - //act - var bodyAsBytes = serBody.Value; //Transfer as utf8 string fails for Kafka - + var bodyAsBytes = serBody.Value; //Transfer as utf8 string fails for Kafka var desBody = new MessageBody(bodyAsBytes, contentType, characterEncoding: CharacterEncoding.UTF8); var retrievedSchemaId = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(desBody.Bytes.Skip(1).Take(4).ToArray())); - //assert - Assert.Equal(CharacterEncoding.UTF8, serBody.CharacterEncoding); - Assert.Equal(CharacterEncoding.UTF8, desBody.CharacterEncoding); - + await Assert.That(serBody.CharacterEncoding).IsEqualTo(CharacterEncoding.UTF8); + await Assert.That(desBody.CharacterEncoding).IsEqualTo(CharacterEncoding.UTF8); //Note the issue here, that the UTF conversion means that we do not get back the same bytes - Assert.NotEqual(desBody.Bytes, serBody.Bytes); - + await Assert.That(serBody.Bytes).IsNotEquivalentTo(desBody.Bytes); } -} - +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Message_Mapper.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Message_Mapper.cs index 67227ff94a..2d7c50c2ea 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Message_Mapper.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Message_Mapper.cs @@ -1,49 +1,32 @@ -using System; +using System; using System.Text.Json; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class MessageUnwrapRequestTests { private UnwrapPipeline _transformPipeline; private readonly TransformPipelineBuilder _pipelineBuilder; private readonly Message _message; - public MessageUnwrapRequestTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyTransformableCommandMessageMapper()), - null - ); + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyTransformableCommandMessageMapper()), null); mapperRegistry.Register(); - MyTransformableCommand myCommand = new(); - var messageTransformerFactory = new SimpleMessageTransformerFactory((_ => new MySimpleTransform())); - _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, messageTransformerFactory); - - _message = new Message( - new MessageHeader(myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), - new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General))) - ); - + _message = new Message(new MessageHeader(myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)))); _message.Header.Bag[MySimpleTransformAsync.HEADER_KEY] = MySimpleTransformAsync.TRANSFORM_VALUE; } - - [Fact] - public void When_Unwrapping_A_Message_Mapper() + + [Test] + public async Task When_Unwrapping_A_Message_Mapper() { //act _transformPipeline = _pipelineBuilder.BuildUnwrapPipeline(); var request = _transformPipeline.Unwrap(_message, new RequestContext()); - //assert - Assert.Equal(MySimpleTransformAsync.TRANSFORM_VALUE, request.Value); + await Assert.That(request.Value).IsEqualTo(MySimpleTransformAsync.TRANSFORM_VALUE); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Message_MapperAsync.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Message_MapperAsync.cs index f8de6a010e..aa9ab73ae4 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Message_MapperAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Message_MapperAsync.cs @@ -1,51 +1,34 @@ -using System; +using System; using System.Text.Json; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class AsyncMessageUnwrapRequestTests { private UnwrapPipelineAsync _transformPipeline; private readonly TransformPipelineBuilderAsync _pipelineBuilder; private readonly Message _message; - public AsyncMessageUnwrapRequestTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyTransformableCommandMessageMapperAsync()) - ); + var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyTransformableCommandMessageMapperAsync())); mapperRegistry.RegisterAsync(); - MyTransformableCommand myCommand = new(); - var messageTransformerFactory = new SimpleMessageTransformerFactoryAsync((_ => new MySimpleTransformAsync())); - _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.All); - - _message = new Message( - new MessageHeader(myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), - new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General))) - ); - + _message = new Message(new MessageHeader(myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)))); _message.Header.Bag[MySimpleTransformAsync.HEADER_KEY] = MySimpleTransformAsync.TRANSFORM_VALUE; } - - [Fact] + + [Test] public async Task When_Unwrapping_A_Message_Mapper() { //act _transformPipeline = _pipelineBuilder.BuildUnwrapPipeline(); var request = await _transformPipeline.UnwrapAsync(_message, new RequestContext()); - //assert - Assert.Equal(MySimpleTransformAsync.TRANSFORM_VALUE, request.Value); + await Assert.That(request.Value).IsEqualTo(MySimpleTransformAsync.TRANSFORM_VALUE); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Message_Mapper_But_Not_In_Transform_Factory.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Message_Mapper_But_Not_In_Transform_Factory.cs index 330012e95e..5c060ce376 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Message_Mapper_But_Not_In_Transform_Factory.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Message_Mapper_But_Not_In_Transform_Factory.cs @@ -1,45 +1,30 @@ -using System; +using System; using System.Text.Json; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Core.Tests.TestHelpers; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class MessageUnwrapRequestMissingTransformTests { private readonly TransformPipelineBuilder _pipelineBuilder; - public MessageUnwrapRequestMissingTransformTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyTransformableCommandMessageMapper()), - null); + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyTransformableCommandMessageMapper()), null); mapperRegistry.Register(); - MyTransformableCommand myCommand = new(); - var messageTransformerFactory = new SimpleMessageTransformerFactory((_ => null)); - _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, messageTransformerFactory); - - Message message = new( - new MessageHeader(myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), - new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General))) - ); - + Message message = new(new MessageHeader(myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)))); message.Header.Bag[MySimpleTransformAsync.HEADER_KEY] = MySimpleTransformAsync.TRANSFORM_VALUE; } - - [Fact] - public void When_Unwrapping_A_Message_Mapper_But_Not_In_Transform_Factory() + + [Test] + public async Task When_Unwrapping_A_Message_Mapper_But_Not_In_Transform_Factory() { //act - var exception = Catch.Exception(() => _pipelineBuilder.BuildUnwrapPipeline()); - Assert.NotNull(exception); - Assert.True((exception) is ConfigurationException); + var exception = Catch.Exception(() => _pipelineBuilder.BuildUnwrapPipeline()); + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ConfigurationException).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Message_Mapper_With_Parameters.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Message_Mapper_With_Parameters.cs index 459e967a46..5433599c68 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Message_Mapper_With_Parameters.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Message_Mapper_With_Parameters.cs @@ -1,46 +1,32 @@ -using System; +using System; using System.Text.Json; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class MessageUnwrapRequestWithAttributesTests { private UnwrapPipeline _transformPipeline; private readonly TransformPipelineBuilder _pipelineBuilder; private readonly Message _message; - public MessageUnwrapRequestWithAttributesTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyParameterizedTransformMessageMapper()), - null); - mapperRegistry.Register(); - + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyParameterizedTransformMessageMapper()), null); + mapperRegistry.Register(); var myCommand = new MyTransformableCommand(); myCommand.Value = "Hello World"; - var messageTransformerFactory = new SimpleMessageTransformerFactory((_ => new MyParameterizedTransform())); - _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, messageTransformerFactory); - - _message = new Message( - new MessageHeader(myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), - new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)))); + _message = new Message(new MessageHeader(myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)))); } - - [Fact] - public void When_Wrapping_A_Message_Mapper_With_Attributes() + + [Test] + public async Task When_Wrapping_A_Message_Mapper_With_Attributes() { //act _transformPipeline = _pipelineBuilder.BuildUnwrapPipeline(); var request = _transformPipeline.Unwrap(_message, new RequestContext()); - //assert - Assert.Equal("I am a parameterized template: Hello World", request.Value); + await Assert.That(request.Value).IsEqualTo("I am a parameterized template: Hello World"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Vanilla_Message_Mapper.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Vanilla_Message_Mapper.cs index 893c24e722..3a5fcdbc19 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Vanilla_Message_Mapper.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Vanilla_Message_Mapper.cs @@ -1,49 +1,33 @@ -using System; +using System; using System.Text.Json; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class VanillaMessageUnwrapRequestTests { private UnwrapPipeline _transformPipeline; private readonly TransformPipelineBuilder _pipelineBuilder; private readonly MyTransformableCommand _myCommand; private readonly Message _message; - public VanillaMessageUnwrapRequestTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyVanillaCommandMessageMapper()), - null); + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyVanillaCommandMessageMapper()), null); mapperRegistry.Register(); - _myCommand = new MyTransformableCommand(); - var messageTransformerFactory = new SimpleMessageTransformerFactory((_ => null)); - _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, messageTransformerFactory); - - _message = new Message( - new MessageHeader(_myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), - new MessageBody(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General))) - ); - + _message = new Message(new MessageHeader(_myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), new MessageBody(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)))); _message.Header.Bag[MySimpleTransformAsync.HEADER_KEY] = MySimpleTransformAsync.TRANSFORM_VALUE; } - - [Fact] - public void When_Unwrapping_A_Vanilla_Message_Mapper() + + [Test] + public async Task When_Unwrapping_A_Vanilla_Message_Mapper() { //act _transformPipeline = _pipelineBuilder.BuildUnwrapPipeline(); var request = _transformPipeline.Unwrap(_message, new RequestContext()); - //assert request.Value = _myCommand.Value; } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Vanilla_Message_MapperAsync.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Vanilla_Message_MapperAsync.cs index 80ed742308..3839373aa3 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Vanilla_Message_MapperAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_A_Vanilla_Message_MapperAsync.cs @@ -1,51 +1,35 @@ -using System; +using System; using System.Text.Json; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class AsyncVanillaMessageUnwrapRequestTests { private UnwrapPipelineAsync _transformPipeline; private readonly TransformPipelineBuilderAsync _pipelineBuilder; private readonly MyTransformableCommand _myCommand; private readonly Message _message; - public AsyncVanillaMessageUnwrapRequestTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyVanillaCommandMessageMapperAsync())); + var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyVanillaCommandMessageMapperAsync())); mapperRegistry.RegisterAsync(); - _myCommand = new MyTransformableCommand(); - var messageTransformerFactory = new SimpleMessageTransformerFactoryAsync((_ => null)); - _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.All); - - _message = new Message( - new MessageHeader(_myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), - new MessageBody(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General))) - ); - + _message = new Message(new MessageHeader(_myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), new MessageBody(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)))); _message.Header.Bag[MySimpleTransformAsync.HEADER_KEY] = MySimpleTransformAsync.TRANSFORM_VALUE; } - - [Fact] + + [Test] public async Task When_Unwrapping_A_Vanilla_Message_Mapper() { //act _transformPipeline = _pipelineBuilder.BuildUnwrapPipeline(); var request = await _transformPipeline.UnwrapAsync(_message, new RequestContext()); - //assert request.Value = _myCommand.Value; } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_But_Factory_Returns_Null.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_But_Factory_Returns_Null.cs index 17f27c7d9a..fc884aeeb5 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_But_Factory_Returns_Null.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_But_Factory_Returns_Null.cs @@ -1,47 +1,32 @@ -using System; +using System; using System.Text.Json; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Core.Tests.TestHelpers; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class MessageUnwrapRequestFailingMapperFactoryTests { private UnwrapPipeline _transformPipeline; private readonly TransformPipelineBuilder _pipelineBuilder; - public MessageUnwrapRequestFailingMapperFactoryTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => null), - null); + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => null), null); mapperRegistry.Register(); - MyTransformableCommand myCommand = new(); - var messageTransformerFactory = new SimpleMessageTransformerFactory((_ => new MySimpleTransform())); - _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, messageTransformerFactory); - - Message message = new( - new MessageHeader(myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), - new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General))) - ); - + Message message = new(new MessageHeader(myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)))); message.Header.Bag[MySimpleTransformAsync.HEADER_KEY] = MySimpleTransformAsync.TRANSFORM_VALUE; } - - [Fact] - public void When_Wrapping_But_Factory_Fails() + + [Test] + public async Task When_Wrapping_But_Factory_Fails() { //act var exception = Catch.Exception(() => _transformPipeline = _pipelineBuilder.BuildUnwrapPipeline()); - Assert.NotNull(exception); - Assert.True((exception) is ConfigurationException); - Assert.True((exception.InnerException) is InvalidOperationException); + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ConfigurationException).IsTrue(); + await Assert.That((exception.InnerException) is InvalidOperationException).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_But_Factory_Returns_Null_Async.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_But_Factory_Returns_Null_Async.cs index 05a1360bda..e491ab8835 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_But_Factory_Returns_Null_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_But_Factory_Returns_Null_Async.cs @@ -1,49 +1,33 @@ -using System; +using System; using System.Text.Json; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class AsyncMessageUnwrapRequestFailingMapperFactoryTests { private UnwrapPipelineAsync _transformPipeline; private readonly TransformPipelineBuilderAsync _pipelineBuilder; - public AsyncMessageUnwrapRequestFailingMapperFactoryTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => null) - ); + var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => null)); mapperRegistry.RegisterAsync(); - MyTransformableCommand myCommand = new(); - var messageTransformerFactory = new SimpleMessageTransformerFactoryAsync((_ => new MySimpleTransformAsync())); - _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.All); - - Message message = new( - new MessageHeader(myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), - new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General))) - ); - + Message message = new(new MessageHeader(myCommand.Id, new("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)))); message.Header.Bag[MySimpleTransformAsync.HEADER_KEY] = MySimpleTransformAsync.TRANSFORM_VALUE; } - - [Fact] - public void When_Wrapping_But_Factory_Fails() + + [Test] + public async Task When_Wrapping_But_Factory_Fails() { //act var exception = Catch.Exception(() => _transformPipeline = _pipelineBuilder.BuildUnwrapPipeline()); - Assert.NotNull(exception); - Assert.True((exception) is ConfigurationException); - Assert.True((exception.InnerException) is InvalidOperationException); + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ConfigurationException).IsTrue(); + await Assert.That((exception.InnerException) is InvalidOperationException).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_But_No_Registered_Mapper.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_But_No_Registered_Mapper.cs index 95f119c95e..673deb06ec 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_But_No_Registered_Mapper.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_But_No_Registered_Mapper.cs @@ -1,46 +1,31 @@ -using System; +using System; using System.Text.Json; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Core.Tests.TestHelpers; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class MessageUnwrapRequestMissingMapperTests { private UnwrapPipeline _transformPipeline; private readonly TransformPipelineBuilder _pipelineBuilder; - public MessageUnwrapRequestMissingMapperTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyTransformableCommandMessageMapper()), - null); - + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyTransformableCommandMessageMapper()), null); MyTransformableCommand myCommand = new(); - var messageTransformerFactory = new SimpleMessageTransformerFactory((_ => new MySimpleTransform())); - _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, messageTransformerFactory); - - Message message = new( - new MessageHeader(myCommand.Id, new RoutingKey("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), - new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General))) - ); - + Message message = new(new MessageHeader(myCommand.Id, new RoutingKey("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)))); message.Header.Bag[MySimpleTransformAsync.HEADER_KEY] = MySimpleTransformAsync.TRANSFORM_VALUE; } - - [Fact] - public void When_Wrapping_But_No_Registered_Mapper() + + [Test] + public async Task When_Wrapping_But_No_Registered_Mapper() { //act var exception = Catch.Exception(() => _transformPipeline = _pipelineBuilder.BuildUnwrapPipeline()); - Assert.NotNull(exception); - Assert.True((exception) is ConfigurationException); - Assert.True((exception.InnerException) is InvalidOperationException); + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ConfigurationException).IsTrue(); + await Assert.That((exception.InnerException) is InvalidOperationException).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_But_No_Registered_MapperAsync.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_But_No_Registered_MapperAsync.cs index 47557cd3f6..e0ef145d90 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_But_No_Registered_MapperAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Unwrapping_But_No_Registered_MapperAsync.cs @@ -1,47 +1,32 @@ -using System; +using System; using System.Text.Json; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class AsyncMessageUnwrapRequestMissingMapperTests { private UnwrapPipelineAsync _transformPipeline; private readonly TransformPipelineBuilderAsync _pipelineBuilder; - public AsyncMessageUnwrapRequestMissingMapperTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyTransformableCommandMessageMapperAsync())); - + var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyTransformableCommandMessageMapperAsync())); MyTransformableCommand myCommand = new(); - var messageTransformerFactory = new SimpleMessageTransformerFactoryAsync((_ => new MySimpleTransformAsync())); - _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.All); - - Message message = new( - new MessageHeader(myCommand.Id, new RoutingKey("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), - new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General))) - ); - + Message message = new(new MessageHeader(myCommand.Id, new RoutingKey("transform.event"), MessageType.MT_COMMAND, timeStamp: DateTime.UtcNow), new MessageBody(JsonSerializer.Serialize(myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)))); message.Header.Bag[MySimpleTransformAsync.HEADER_KEY] = MySimpleTransformAsync.TRANSFORM_VALUE; } - - [Fact] - public void When_Wrapping_But_No_Registered_Mapper() + + [Test] + public async Task When_Wrapping_But_No_Registered_Mapper() { //act var exception = Catch.Exception(() => _transformPipeline = _pipelineBuilder.BuildUnwrapPipeline()); - Assert.NotNull(exception); - Assert.True((exception) is ConfigurationException); - Assert.True((exception.InnerException) is InvalidOperationException); + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ConfigurationException).IsTrue(); + await Assert.That((exception.InnerException) is InvalidOperationException).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_Mapper.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_Mapper.cs index 0593f1e3d6..3708ac3bbb 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_Mapper.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_Mapper.cs @@ -1,44 +1,35 @@ -using System.Text.Json; +using System.Text.Json; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class MessageWrapRequestTests { private WrapPipeline _transformPipeline; private readonly TransformPipelineBuilder _pipelineBuilder; private readonly MyTransformableCommand _myCommand; private readonly Publication _publication; - public MessageWrapRequestTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyTransformableCommandMessageMapper()), - null); - mapperRegistry.Register(); - + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyTransformableCommandMessageMapper()), null); + mapperRegistry.Register(); _myCommand = new MyTransformableCommand(); - var messageTransformerFactory = new SimpleMessageTransformerFactory((_ => new MySimpleTransform())); - - _publication = new Publication { Topic = new RoutingKey("MyTransformableCommand") }; - + _publication = new Publication + { + Topic = new RoutingKey("MyTransformableCommand") + }; _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, messageTransformerFactory); } - - [Fact] - public void When_Wrapping_A_Message_Mapper() + + [Test] + public async Task When_Wrapping_A_Message_Mapper() { //act _transformPipeline = _pipelineBuilder.BuildWrapPipeline(); var message = _transformPipeline.Wrap(_myCommand, new RequestContext(), _publication); - //assert - Assert.Equal(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)).ToString(), message.Body.Value); - Assert.Equal(MySimpleTransformAsync.TRANSFORM_VALUE, message.Header.Bag[MySimpleTransformAsync.HEADER_KEY]); + await Assert.That(message.Body.Value).IsEqualTo(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)).ToString()); + await Assert.That(message.Header.Bag[MySimpleTransformAsync.HEADER_KEY]).IsEqualTo(MySimpleTransformAsync.TRANSFORM_VALUE); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_MapperAsync.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_MapperAsync.cs index 39a5f1a090..376e150cab 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_MapperAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_MapperAsync.cs @@ -1,46 +1,38 @@ -using System.Text.Json; +using System.Text.Json; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class AsyncMessageWrapRequestTests { private WrapPipelineAsync _transformPipeline; private readonly TransformPipelineBuilderAsync _pipelineBuilder; private readonly MyTransformableCommand _myCommand; private readonly Publication _publication; - public AsyncMessageWrapRequestTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyTransformableCommandMessageMapperAsync())); - mapperRegistry.RegisterAsync(); - + var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyTransformableCommandMessageMapperAsync())); + mapperRegistry.RegisterAsync(); _myCommand = new MyTransformableCommand(); - var messageTransformerFactory = new SimpleMessageTransformerFactoryAsync((_ => new MySimpleTransformAsync())); - - _publication = new Publication{Topic = new RoutingKey("MyTransformableCommand"), RequestType= typeof(MyTransformableCommand)}; - + _publication = new Publication + { + Topic = new RoutingKey("MyTransformableCommand"), + RequestType = typeof(MyTransformableCommand) + }; _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.All); } - - [Fact] + + [Test] public async Task When_Wrapping_A_Message_Mapper() { //act _transformPipeline = _pipelineBuilder.BuildWrapPipeline(); var message = await _transformPipeline.WrapAsync(_myCommand, new RequestContext(), _publication); - //assert - Assert.Equal(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)).ToString(), message.Body.Value); - Assert.Equal(MySimpleTransformAsync.TRANSFORM_VALUE, message.Header.Bag[MySimpleTransformAsync.HEADER_KEY]); + await Assert.That(message.Body.Value).IsEqualTo(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)).ToString()); + await Assert.That(message.Header.Bag[MySimpleTransformAsync.HEADER_KEY]).IsEqualTo(MySimpleTransformAsync.TRANSFORM_VALUE); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_Mapper_But_Not_In_Transform_Factory.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_Mapper_But_Not_In_Transform_Factory.cs index 4598f3707e..cd3118d543 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_Mapper_But_Not_In_Transform_Factory.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_Mapper_But_Not_In_Transform_Factory.cs @@ -1,35 +1,25 @@ -using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; +using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Core.Tests.TestHelpers; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class MessageWrapRequestMissingTransformTests { private readonly TransformPipelineBuilder _pipelineBuilder; - public MessageWrapRequestMissingTransformTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyTransformableCommandMessageMapper()), - null); + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyTransformableCommandMessageMapper()), null); mapperRegistry.Register(); - var messageTransformerFactory = new SimpleMessageTransformerFactory((_ => null)); - _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, messageTransformerFactory); } - - [Fact] - public void When_Wrapping_A_Message_Mapper_But_Not_In_Transform_Factory() + + [Test] + public async Task When_Wrapping_A_Message_Mapper_But_Not_In_Transform_Factory() { //act var exception = Catch.Exception(() => _pipelineBuilder.BuildWrapPipeline()); - Assert.NotNull(exception); - Assert.True((exception) is ConfigurationException); - + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ConfigurationException).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_Mapper_But_Not_In_Transform_Factory_Async.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_Mapper_But_Not_In_Transform_Factory_Async.cs index da12d72cee..d663a43842 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_Mapper_But_Not_In_Transform_Factory_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_Mapper_But_Not_In_Transform_Factory_Async.cs @@ -1,36 +1,26 @@ -using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; +using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class AsyncMessageWrapRequestMissingTransformTests { private readonly TransformPipelineBuilderAsync _pipelineBuilder; - public AsyncMessageWrapRequestMissingTransformTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyTransformableCommandMessageMapperAsync())); + var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyTransformableCommandMessageMapperAsync())); mapperRegistry.Register(); - var messageTransformerFactory = new SimpleMessageTransformerFactoryAsync((_ => null)); - _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.All); } - - [Fact] - public void When_Wrapping_A_Message_Mapper_But_Not_In_Transform_Factory() + + [Test] + public async Task When_Wrapping_A_Message_Mapper_But_Not_In_Transform_Factory() { //act var exception = Catch.Exception(() => _pipelineBuilder.BuildWrapPipeline()); - Assert.NotNull(exception); - Assert.True((exception) is ConfigurationException); - + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ConfigurationException).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_Mapper_With_Parameters.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_Mapper_With_Parameters.cs index 594815e060..dbbc9796cc 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_Mapper_With_Parameters.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_Mapper_With_Parameters.cs @@ -1,45 +1,35 @@ -using System.Text.Json; +using System.Text.Json; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class MessageWrapRequestWithAttributesTests { private WrapPipeline _transformPipeline; private readonly TransformPipelineBuilder _pipelineBuilder; private readonly MyTransformableCommand _myCommand; private readonly Publication _publication; - public MessageWrapRequestWithAttributesTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory( - _ => new MyParameterizedTransformMessageMapper()), - null); - mapperRegistry.Register(); - + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyParameterizedTransformMessageMapper()), null); + mapperRegistry.Register(); _myCommand = new MyTransformableCommand(); - - _publication = new Publication { Topic = new RoutingKey("transform.event") }; - + _publication = new Publication + { + Topic = new RoutingKey("transform.event") + }; var messageTransformerFactory = new SimpleMessageTransformerFactory((_ => new MyParameterizedTransform())); - _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, messageTransformerFactory); } - - [Fact] - public void When_Wrapping_A_Message_Mapper_With_Attributes() + + [Test] + public async Task When_Wrapping_A_Message_Mapper_With_Attributes() { //act _transformPipeline = _pipelineBuilder.BuildWrapPipeline(); var message = _transformPipeline.Wrap(_myCommand, new RequestContext(), _publication); - //assert - Assert.Equal(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)).ToString(), message.Body.Value); - Assert.Equal("I am a format indicator {0}", message.Header.Bag[MyParameterizedTransformAsync.HEADER_KEY]); + await Assert.That(message.Body.Value).IsEqualTo(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)).ToString()); + await Assert.That(message.Header.Bag[MyParameterizedTransformAsync.HEADER_KEY]).IsEqualTo("I am a format indicator {0}"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_Mapper_With_Parameters_Async.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_Mapper_With_Parameters_Async.cs index 0c40c7fd36..d8666b7b34 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_Mapper_With_Parameters_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Message_Mapper_With_Parameters_Async.cs @@ -1,50 +1,38 @@ -using System.Text.Json; +using System.Text.Json; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class AsyncMessageWrapRequestWithAttributesTests { private WrapPipelineAsync _transformPipeline; private readonly TransformPipelineBuilderAsync _pipelineBuilder; private readonly MyTransformableCommand _myCommand; private readonly Publication _publication; - public AsyncMessageWrapRequestWithAttributesTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyParameterizedTransformMessageMapperAsync()) - ); - mapperRegistry.RegisterAsync(); - + var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyParameterizedTransformMessageMapperAsync())); + mapperRegistry.RegisterAsync(); _myCommand = new MyTransformableCommand(); - var messageTransformerFactory = new SimpleMessageTransformerFactoryAsync((_ => new MyParameterizedTransformAsync())); - _publication = new Publication { - Topic = new RoutingKey("MyTransformableCommand"), RequestType = typeof(MyTransformableCommand) + Topic = new RoutingKey("MyTransformableCommand"), + RequestType = typeof(MyTransformableCommand) }; - _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.All); } - - [Fact] + + [Test] public async Task When_Wrapping_A_Message_Mapper_With_Attributes() { //act _transformPipeline = _pipelineBuilder.BuildWrapPipeline(); var message = await _transformPipeline.WrapAsync(_myCommand, new RequestContext(), _publication); - //assert - Assert.Equal(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)).ToString(), message.Body.Value); - Assert.Equal("I am a format indicator {0}", message.Header.Bag[MyParameterizedTransformAsync.HEADER_KEY]); + await Assert.That(message.Body.Value).IsEqualTo(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)).ToString()); + await Assert.That(message.Header.Bag[MyParameterizedTransformAsync.HEADER_KEY]).IsEqualTo("I am a format indicator {0}"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Vanilla_Message_Mapper.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Vanilla_Message_Mapper.cs index 28af2798a2..c60160bbfa 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Vanilla_Message_Mapper.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Vanilla_Message_Mapper.cs @@ -1,43 +1,34 @@ -using System.Text.Json; +using System.Text.Json; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class VanillaMessageWrapRequestTests { private WrapPipeline _transformPipeline; private readonly TransformPipelineBuilder _pipelineBuilder; private readonly MyTransformableCommand _myCommand; private readonly Publication _publication; - public VanillaMessageWrapRequestTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyVanillaCommandMessageMapper()), - null); + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyVanillaCommandMessageMapper()), null); mapperRegistry.Register(); - _myCommand = new MyTransformableCommand(); - var messageTransformerFactory = new SimpleMessageTransformerFactory((_ => null)); - - _publication = new Publication { Topic = new RoutingKey("MyTransformableCommand") }; - + _publication = new Publication + { + Topic = new RoutingKey("MyTransformableCommand") + }; _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, messageTransformerFactory); } - - [Fact] - public void When_Wrapping_A_Vanilla_Message_Mapper() + + [Test] + public async Task When_Wrapping_A_Vanilla_Message_Mapper() { //act _transformPipeline = _pipelineBuilder.BuildWrapPipeline(); var message = _transformPipeline.Wrap(_myCommand, new RequestContext(), _publication); - //assert - Assert.Equal(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)).ToString(), message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)).ToString()); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Vanilla_Message_MapperAsync.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Vanilla_Message_MapperAsync.cs index 218f11d241..c1527b8a92 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Vanilla_Message_MapperAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_A_Vanilla_Message_MapperAsync.cs @@ -1,45 +1,37 @@ -using System.Text.Json; +using System.Text.Json; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class AsyncVanillaMessageWrapRequestTests { private WrapPipelineAsync _transformPipeline; private readonly TransformPipelineBuilderAsync _pipelineBuilder; private readonly MyTransformableCommand _myCommand; private readonly Publication _publication; - public AsyncVanillaMessageWrapRequestTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyVanillaCommandMessageMapperAsync())); + var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyVanillaCommandMessageMapperAsync())); mapperRegistry.RegisterAsync(); - _myCommand = new MyTransformableCommand(); - var messageTransformerFactory = new SimpleMessageTransformerFactoryAsync((_ => null)); - - _publication = new Publication{Topic = new RoutingKey("MyTransformableCommand"), RequestType = typeof(MyTransformableCommand)}; - + _publication = new Publication + { + Topic = new RoutingKey("MyTransformableCommand"), + RequestType = typeof(MyTransformableCommand) + }; _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.All); } - - [Fact] + + [Test] public async Task When_Wrapping_A_Vanilla_Message_Mapper() { //act _transformPipeline = _pipelineBuilder.BuildWrapPipeline(); var message = await _transformPipeline.WrapAsync(_myCommand, new RequestContext(), _publication); - //assert - Assert.Equal(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)).ToString(), message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(JsonSerializer.Serialize(_myCommand, new JsonSerializerOptions(JsonSerializerDefaults.General)).ToString()); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_But_No_Registered_Mapper.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_But_No_Registered_Mapper.cs index 5ae561163b..ba4e6744e2 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_But_No_Registered_Mapper.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_But_No_Registered_Mapper.cs @@ -1,38 +1,29 @@ -using System; +using System; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class MessageWrapRequestMissingMapperTests { private WrapPipelineAsync _transformPipeline; private readonly TransformPipelineBuilderAsync _pipelineBuilder; - public MessageWrapRequestMissingMapperTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => null), - null); - mapperRegistry.Register(); - + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => null), null); + mapperRegistry.Register(); var messageTransformerFactory = new SimpleMessageTransformerFactoryAsync((_ => new MySimpleTransformAsync())); - _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.All); } - - [Fact] - public void When_Wrapping_But_No_Registered_Mapper() + + [Test] + public async Task When_Wrapping_But_No_Registered_Mapper() { //act var exception = Catch.Exception(() => _transformPipeline = _pipelineBuilder.BuildWrapPipeline()); - Assert.NotNull(exception); - Assert.True((exception) is ConfigurationException); - Assert.True((exception.InnerException) is InvalidOperationException); + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ConfigurationException).IsTrue(); + await Assert.That((exception.InnerException) is InvalidOperationException).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_But_No_Registered_MapperAsync.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_But_No_Registered_MapperAsync.cs index 12df00937a..698f708678 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_But_No_Registered_MapperAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_But_No_Registered_MapperAsync.cs @@ -1,38 +1,29 @@ -using System; +using System; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class AsyncMessageWrapRequestMissingMapperTests { private WrapPipelineAsync _transformPipeline; private readonly TransformPipelineBuilderAsync _pipelineBuilder; - public AsyncMessageWrapRequestMissingMapperTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => null), - null); - mapperRegistry.Register(); - + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => null), null); + mapperRegistry.Register(); var messageTransformerFactory = new SimpleMessageTransformerFactoryAsync((_ => new MySimpleTransformAsync())); - _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.All); } - - [Fact] - public void When_Wrapping_But_No_Registered_Mapper() + + [Test] + public async Task When_Wrapping_But_No_Registered_Mapper() { //act var exception = Catch.Exception(() => _transformPipeline = _pipelineBuilder.BuildWrapPipeline()); - Assert.NotNull(exception); - Assert.True((exception) is ConfigurationException); - Assert.True((exception.InnerException) is InvalidOperationException); + await Assert.That(exception).IsNotNull(); + await Assert.That((exception) is ConfigurationException).IsTrue(); + await Assert.That((exception.InnerException) is InvalidOperationException).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_Clean_Up_The_Pipeline.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_Clean_Up_The_Pipeline.cs index 31b87e6cc3..e1cecd9432 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_Clean_Up_The_Pipeline.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_Clean_Up_The_Pipeline.cs @@ -1,9 +1,7 @@ -using System; +using System; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class MessageWrapCleanupTests { private WrapPipeline _transformPipeline; @@ -11,38 +9,31 @@ public class MessageWrapCleanupTests private readonly MyTransformableCommand _myCommand; public static string s_released; private readonly Publication _publication; - public MessageWrapCleanupTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => new MyTransformableCommandMessageMapper()), - null); + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyTransformableCommandMessageMapper()), null); mapperRegistry.Register(); - _myCommand = new MyTransformableCommand(); - - _publication = new Publication { Topic = new RoutingKey("MyTransformableCommand") }; - + _publication = new Publication + { + Topic = new RoutingKey("MyTransformableCommand") + }; _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, new MyReleaseTrackingTransformFactory()); } - - [Fact] - public void When_Wrapping_Clean_Up_The_Pipeline() + + [Test] + public async Task When_Wrapping_Clean_Up_The_Pipeline() { //act _transformPipeline = _pipelineBuilder.BuildWrapPipeline(); var message = _transformPipeline.Wrap(_myCommand, new RequestContext(), _publication); _transformPipeline.Dispose(); - //assert - Assert.Equal("|MySimpleTransform", s_released); - + await Assert.That(s_released).IsEqualTo("|MySimpleTransform"); } - - private sealed class MyReleaseTrackingTransformFactory : IAmAMessageTransformerFactory + + private sealed class MyReleaseTrackingTransformFactory : Paramore.Brighter.IAmAMessageTransformerFactory { public IAmAMessageTransform Create(Type transformerType) { @@ -53,9 +44,7 @@ public void Release(IAmAMessageTransform transformer) { var disposable = transformer as IDisposable; disposable?.Dispose(); - s_released += "|" + transformer.GetType().Name; } } - -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_Clean_Up_The_PipelineAsync.cs b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_Clean_Up_The_PipelineAsync.cs index 951ed83022..414ba04d64 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_Clean_Up_The_PipelineAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessageSerialisation/When_Wrapping_Clean_Up_The_PipelineAsync.cs @@ -1,11 +1,9 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.MessageSerialisation.Test_Doubles; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessageSerialisation; - public class AsyncMessageWrapCleanupTests { private WrapPipelineAsync _transformPipeline; @@ -13,38 +11,32 @@ public class AsyncMessageWrapCleanupTests private readonly MyTransformableCommand _myCommand; public static string s_released; private readonly Publication _publication; - public AsyncMessageWrapCleanupTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync(_ => new MyTransformableCommandMessageMapperAsync())); + var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync(_ => new MyTransformableCommandMessageMapperAsync())); mapperRegistry.RegisterAsync(); - _myCommand = new MyTransformableCommand(); - - _publication = new Publication{Topic = new RoutingKey("MyTransformableCommand"), RequestType= typeof(MyTransformableCommand)}; - + _publication = new Publication + { + Topic = new RoutingKey("MyTransformableCommand"), + RequestType = typeof(MyTransformableCommand) + }; _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, new MyReleaseTrackingTransformFactoryAsync(), InstrumentationOptions.All); } - - [Fact] + + [Test] public async Task When_Wrapping_Clean_Up_The_Pipeline() { //act _transformPipeline = _pipelineBuilder.BuildWrapPipeline(); var message = await _transformPipeline.WrapAsync(_myCommand, new RequestContext(), _publication); _transformPipeline.Dispose(); - //assert - Assert.Equal("|MySimpleTransformAsync", s_released); - + await Assert.That(s_released).IsEqualTo("|MySimpleTransformAsync"); } - - private sealed class MyReleaseTrackingTransformFactoryAsync : IAmAMessageTransformerFactoryAsync + + private sealed class MyReleaseTrackingTransformFactoryAsync : Paramore.Brighter.IAmAMessageTransformerFactoryAsync { public IAmAMessageTransformAsync Create(Type transformerType) { @@ -55,9 +47,7 @@ public void Release(IAmAMessageTransformAsync transformer) { var disposable = transformer as IDisposable; disposable?.Dispose(); - s_released += "|" + transformer.GetType().Name; } } - -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_A_Stop_Message_Is_Added_To_A_Channel.cs b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_A_Stop_Message_Is_Added_To_A_Channel.cs index ac6a48a043..6cdfa1efc9 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_A_Stop_Message_Is_Added_To_A_Channel.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_A_Stop_Message_Is_Added_To_A_Channel.cs @@ -19,11 +19,8 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessagingGateway { @@ -33,30 +30,22 @@ public class ChannelStopTests private const string ChannelName = "myChannel"; private readonly IAmAChannelSync _channel; private readonly InternalBus _bus; - public ChannelStopTests() { _bus = new InternalBus(); - IAmAMessageConsumerSync gateway = new InMemoryMessageConsumer(_routingKey, _bus, TimeProvider.System, ackTimeout: TimeSpan.FromMilliseconds(1000)); - - _channel = new Channel(new(ChannelName),_routingKey, gateway); - - Message sentMessage = new( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody("a test body")); - + IAmAMessageConsumerSync gateway = new InMemoryMessageConsumer(_routingKey, _bus, TimeProvider.System, ackTimeout: TimeSpan.FromMilliseconds(1000)); + _channel = new Channel(new(ChannelName), _routingKey, gateway); + Message sentMessage = new(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody("a test body")); _bus.Enqueue(sentMessage); - _channel.Stop(_routingKey); } - [Fact] - public void When_A_Stop_Message_Is_Added_To_A_Channel() + [Test] + public async Task When_A_Stop_Message_Is_Added_To_A_Channel() { var stopMessage = _channel.Receive(TimeSpan.FromMilliseconds(1000)); - Assert.Equal(MessageType.MT_QUIT, stopMessage.Header.MessageType); - - Assert.Single(_bus.Stream(new RoutingKey(_routingKey))); + await Assert.That(stopMessage.Header.MessageType).IsEqualTo(MessageType.MT_QUIT); + await Assert.That(_bus.Stream(new RoutingKey(_routingKey))).HasSingleItem(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_Acknowledge_Is_Called_On_A_Channel.cs b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_Acknowledge_Is_Called_On_A_Channel.cs index 57f2e2547d..493ecb6fe5 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_Acknowledge_Is_Called_On_A_Channel.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_Acknowledge_Is_Called_On_A_Channel.cs @@ -19,12 +19,9 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Microsoft.Extensions.Time.Testing; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessagingGateway { @@ -35,28 +32,20 @@ public class ChannelAcknowledgeTests private readonly FakeTimeProvider _fakeTimeProvider = new(); private readonly RoutingKey Topic = new("myTopic"); private const string ChannelName = "myChannel"; - public ChannelAcknowledgeTests() { - IAmAMessageConsumerSync gateway = new InMemoryMessageConsumer(new RoutingKey(Topic), _bus, _fakeTimeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)); - - _channel = new Channel(new (ChannelName), new(Topic), gateway); - - var sentMessage = new Message( - new MessageHeader(Guid.NewGuid().ToString(), Topic, MessageType.MT_EVENT), - new MessageBody("a test body")); - + IAmAMessageConsumerSync gateway = new InMemoryMessageConsumer(new RoutingKey(Topic), _bus, _fakeTimeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)); + _channel = new Channel(new(ChannelName), new(Topic), gateway); + var sentMessage = new Message(new MessageHeader(Guid.NewGuid().ToString(), Topic, MessageType.MT_EVENT), new MessageBody("a test body")); _bus.Enqueue(sentMessage); } - [Fact] - public void When_Acknowledge_Is_Called_On_A_Channel_Should_Be_Removed() + [Test] + public async Task When_Acknowledge_Is_Called_On_A_Channel_Should_Be_Removed() { var receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(1000)); _channel.Acknowledge(receivedMessage); - _fakeTimeProvider.Advance(TimeSpan.FromSeconds(2)); //allow for message to timeout if not acked - } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_Constructing_A_Combined_Producer_Registry.cs b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_Constructing_A_Combined_Producer_Registry.cs index fb8ed6af3b..aee705c5bf 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_Constructing_A_Combined_Producer_Registry.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_Constructing_A_Combined_Producer_Registry.cs @@ -1,16 +1,13 @@ -using System.Linq; +using System.Linq; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessagingGateway; - public class CombinedProducerRegistryTests { - [Fact] - public void When_constructing_a_combined_producer_registry() + [Test] + public async Task When_constructing_a_combined_producer_registry() { var bus = new InternalBus(); - var firstProducers = new[] { new Publication @@ -25,17 +22,14 @@ public void When_constructing_a_combined_producer_registry() Topic = new RoutingKey("SecondTopic") } }; - var firstProducerFactory = new InMemoryMessageProducerFactory(bus, firstProducers, InstrumentationOptions.All); var secondProducerFactory = new InMemoryMessageProducerFactory(bus, secondProducers, InstrumentationOptions.All); - var combinedRegistryFactory = new CombinedProducerRegistryFactory(firstProducerFactory, secondProducerFactory); - var producerRegistry = combinedRegistryFactory.Create(); - + var producerRegistry = await combinedRegistryFactory.CreateAsync(); // Producer registry should contain producers for both topics var producers = producerRegistry.Producers.ToList(); - Assert.Equal(2, producers.Count); - Assert.Equal(1, producers.Count(x => x.Publication.Topic == "FirstTopic")); - Assert.Equal(1, producers.Count(x => x.Publication.Topic == "SecondTopic")); + await Assert.That(producers.Count).IsEqualTo(2); + await Assert.That(producers.Count(x => x.Publication.Topic == "FirstTopic")).IsEqualTo(1); + await Assert.That(producers.Count(x => x.Publication.Topic == "SecondTopic")).IsEqualTo(1); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_Constructing_ProducerRegistry_With_Empty_Dictionary.cs b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_Constructing_ProducerRegistry_With_Empty_Dictionary.cs index 1743489bd2..a141525650 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_Constructing_ProducerRegistry_With_Empty_Dictionary.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_Constructing_ProducerRegistry_With_Empty_Dictionary.cs @@ -1,5 +1,4 @@ #region License - /* The MIT License (MIT) Copyright © 2025 Jakub Syty jakub.nekro@gmail.com @@ -20,83 +19,70 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - -# endregion - +#endregion using System.Collections.Generic; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessagingGateway; - public class EmptyProducerRegistryTests { - [Fact] - public void When_constructing_producer_registry_with_empty_dictionary() + [Test] + public async Task When_constructing_producer_registry_with_empty_dictionary() { // Arrange var emptyProducers = new Dictionary(); - // Act var registry = new ProducerRegistry(emptyProducers); - // Assert - Assert.NotNull(registry); - Assert.Empty(registry.Producers); - Assert.Empty(registry.ProducersSync); - Assert.Empty(registry.ProducersAsync); + await Assert.That(registry).IsNotNull(); + await Assert.That(registry.Producers).IsEmpty(); + await Assert.That(registry.ProducersSync).IsEmpty(); + await Assert.That(registry.ProducersAsync).IsEmpty(); } - [Fact] - public void When_constructing_producer_registry_with_null_dictionary() + [Test] + public async Task When_constructing_producer_registry_with_null_dictionary() { // Arrange Dictionary? nullProducers = null; - // Act var registry = new ProducerRegistry(nullProducers); - // Assert - Assert.NotNull(registry); - Assert.Empty(registry.Producers); - Assert.Empty(registry.ProducersSync); - Assert.Empty(registry.ProducersAsync); + await Assert.That(registry).IsNotNull(); + await Assert.That(registry.Producers).IsEmpty(); + await Assert.That(registry.ProducersSync).IsEmpty(); + await Assert.That(registry.ProducersAsync).IsEmpty(); } - [Fact] - public void When_looking_up_producer_in_empty_registry_throws() + [Test] + public async Task When_looking_up_producer_in_empty_registry_throws() { // Arrange var emptyProducers = new Dictionary(); var registry = new ProducerRegistry(emptyProducers); var topic = new RoutingKey("test-topic"); - // Act & Assert - var exception = Assert.Throws(() => - registry.LookupBy(topic)); - Assert.Contains("No producers found in the registry", exception.Message); + var exception = await Assert.That(() => registry.LookupBy(topic)).ThrowsExactly(); + await Assert.That(exception.Message).Contains("No producers found in the registry"); } - [Fact] - public void When_closing_empty_producer_registry_succeeds() + [Test] + public async Task When_closing_empty_producer_registry_succeeds() { // Arrange var emptyProducers = new Dictionary(); var registry = new ProducerRegistry(emptyProducers); - // Act & Assert (should not throw) registry.CloseAll(); - Assert.Empty(registry.Producers); + await Assert.That(registry.Producers).IsEmpty(); } - [Fact] - public void When_disposing_empty_producer_registry_succeeds() + [Test] + public async Task When_disposing_empty_producer_registry_succeeds() { // Arrange var emptyProducers = new Dictionary(); var registry = new ProducerRegistry(emptyProducers); - // Act & Assert (should not throw) registry.Dispose(); } - -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_Listening_To_Messages_On_A_Channel.cs b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_Listening_To_Messages_On_A_Channel.cs index 9c37236950..2d2a9e2039 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_Listening_To_Messages_On_A_Channel.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_Listening_To_Messages_On_A_Channel.cs @@ -19,12 +19,9 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Microsoft.Extensions.Time.Testing; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessagingGateway { @@ -36,29 +33,21 @@ public class ChannelMessageReceiveTests private readonly InternalBus _bus = new(); private readonly FakeTimeProvider _fakeTimeProvider = new(); private readonly Message _sentMessage; - public ChannelMessageReceiveTests() { IAmAMessageConsumerSync gateway = new InMemoryMessageConsumer(new RoutingKey(_routingKey), _bus, _fakeTimeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)); - - _channel = new Channel(new(ChannelName),new(_routingKey), gateway); - - _sentMessage = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody("a test body")); - + _channel = new Channel(new(ChannelName), new(_routingKey), gateway); + _sentMessage = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody("a test body")); _bus.Enqueue(_sentMessage); } - - [Fact] - public void When_Listening_To_Messages_On_A_Channel() + [Test] + public async Task When_Listening_To_Messages_On_A_Channel() { var receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(1000)); _channel.Acknowledge(receivedMessage); - - Assert.NotNull(receivedMessage); - Assert.Equal(_sentMessage, receivedMessage); + await Assert.That(receivedMessage).IsNotNull(); + await Assert.That(receivedMessage).IsEqualTo(_sentMessage); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_No_Acknowledge_Is_Called_On_A_Channel.cs b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_No_Acknowledge_Is_Called_On_A_Channel.cs index 4633f43a45..b54ee41e6f 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_No_Acknowledge_Is_Called_On_A_Channel.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_No_Acknowledge_Is_Called_On_A_Channel.cs @@ -19,12 +19,9 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Microsoft.Extensions.Time.Testing; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessagingGateway { @@ -35,30 +32,21 @@ public class ChannelNackTests private readonly FakeTimeProvider _timeProvider = new(); private readonly RoutingKey _routingKey = new("myTopic"); private const string ChannelName = "myChannel"; - public ChannelNackTests() { IAmAMessageConsumerSync gateway = new InMemoryMessageConsumer(new RoutingKey(_routingKey), _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)); - _channel = new Channel(new(ChannelName), _routingKey, gateway); - - var sentMessage = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody("a test body")); - + var sentMessage = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody("a test body")); _bus.Enqueue(sentMessage); } - - [Fact] - public void When_No_Acknowledge_Is_Called_On_A_Channel() + [Test] + public async Task When_No_Acknowledge_Is_Called_On_A_Channel() { var receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(1000)); _channel.Reject(receivedMessage); - _timeProvider.Advance(TimeSpan.FromSeconds(2)); //allow for message to timeout if not rejected - - Assert.Empty(_bus.Stream(new RoutingKey(_routingKey))); + await Assert.That(_bus.Stream(new RoutingKey(_routingKey))).IsEmpty(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_Requeuing_A_Message_With_No_Delay.cs b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_Requeuing_A_Message_With_No_Delay.cs index 6bb2f16fea..f4f2510f8f 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_Requeuing_A_Message_With_No_Delay.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_Requeuing_A_Message_With_No_Delay.cs @@ -19,12 +19,9 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Microsoft.Extensions.Time.Testing; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessagingGateway { @@ -34,29 +31,21 @@ public class ChannelRequeueWithoutDelayTest private readonly RoutingKey _routingKey = new("myTopic"); private const string ChannelName = "myChannel"; private readonly InternalBus _bus = new(); - public ChannelRequeueWithoutDelayTest() { - var consumer = new InMemoryMessageConsumer(new RoutingKey(_routingKey), _bus, new FakeTimeProvider(), ackTimeout: TimeSpan.FromMilliseconds(1000)); - - _channel = new Channel(new(ChannelName),new (_routingKey), consumer); - - var sentMessage = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody("a test body")); - + var consumer = new InMemoryMessageConsumer(new RoutingKey(_routingKey), _bus, new FakeTimeProvider(), ackTimeout: TimeSpan.FromMilliseconds(1000)); + _channel = new Channel(new(ChannelName), new(_routingKey), consumer); + var sentMessage = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody("a test body")); _bus.Enqueue(sentMessage); } - - [Fact] - public void When_Requeuing_A_Message_With_No_Delay() + [Test] + public async Task When_Requeuing_A_Message_With_No_Delay() { var requeueMessage = _channel.Receive(TimeSpan.FromMilliseconds(1000)); _channel.Requeue(requeueMessage); - - Assert.Single(_bus.Stream(new RoutingKey(_routingKey)) ?? []); - Assert.Contains(requeueMessage, _bus.Stream(new RoutingKey(_routingKey))); + await Assert.That(_bus.Stream(new RoutingKey(_routingKey)) ?? []).HasSingleItem(); + await Assert.That(_bus.Stream(new RoutingKey(_routingKey))).Contains(requeueMessage); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_The_Buffer_Is_Not_Empty_Read_From_That_Before_Receiving.cs b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_The_Buffer_Is_Not_Empty_Read_From_That_Before_Receiving.cs index 6215cc75e1..d5b36488b5 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_The_Buffer_Is_Not_Empty_Read_From_That_Before_Receiving.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_The_Buffer_Is_Not_Empty_Read_From_That_Before_Receiving.cs @@ -1,6 +1,5 @@ using System; using Microsoft.Extensions.Time.Testing; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessagingGateway { @@ -12,80 +11,56 @@ public class BufferedChannelTests private readonly RoutingKey _routingKey = new("MyTopic"); private const string Channel = "MyChannel"; private readonly InternalBus _bus = new(); - public BufferedChannelTests() { - _gateway = new InMemoryMessageConsumer(new RoutingKey(_routingKey), _bus,new FakeTimeProvider(), ackTimeout: TimeSpan.FromMilliseconds(1000)); - _channel = new Channel(new (Channel), new (_routingKey), _gateway, BufferLimit); + _gateway = new InMemoryMessageConsumer(new RoutingKey(_routingKey), _bus, new FakeTimeProvider(), ackTimeout: TimeSpan.FromMilliseconds(1000)); + _channel = new Channel(new(Channel), new(_routingKey), _gateway, BufferLimit); } - [Fact] - public void When_the_buffer_is_not_empty_read_from_that_before_receiving() + [Test] + public async Task When_the_buffer_is_not_empty_read_from_that_before_receiving() { //arrange - var messageOne = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody("FirstMessage")); - - var messageTwo = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody("SecondMessage")); - + var messageOne = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody("FirstMessage")); + var messageTwo = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody("SecondMessage")); //put BufferLimit messages on the channel first _channel.Enqueue(messageOne, messageTwo); - - var messageThree = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody("ThirdMessage")); - + var messageThree = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody("ThirdMessage")); //put a message on the bus, to pull once the buffer is empty _bus.Enqueue(messageThree); - //act var msgOne = _channel.Receive(TimeSpan.FromMilliseconds(10)); var msgTwo = _channel.Receive(TimeSpan.FromMilliseconds(10)); var msgThree = _channel.Receive(TimeSpan.FromMilliseconds(10)); - //assert - Assert.Equal(messageOne.Id, msgOne.Id); - Assert.Equal(messageTwo.Id, msgTwo.Id); - Assert.Equal(messageThree.Id, msgThree.Id); - } + await Assert.That(msgOne.Id).IsEqualTo(messageOne.Id); + await Assert.That(msgTwo.Id).IsEqualTo(messageTwo.Id); + await Assert.That(msgThree.Id).IsEqualTo(messageThree.Id); + } - [Fact] - public void When_the_buffer_is_replenished_allow_up_to_the_maximum_number_of_new_elements_to_enqueue() + [Test] + public async Task When_the_buffer_is_replenished_allow_up_to_the_maximum_number_of_new_elements_to_enqueue() { //put BufferLimit messages on the queue first - var messageOne = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody("FirstMessage")); - - var messageTwo = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody("SecondMessage")); - - var messageThree = new Message( - new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), - new MessageBody("ThirdMessage")); - + var messageOne = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody("FirstMessage")); + var messageTwo = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody("SecondMessage")); + var messageThree = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_EVENT), new MessageBody("ThirdMessage")); // This should be fine - _channel.Enqueue(messageOne, messageTwo, messageThree); - - //This should throw an exception - Assert.Throws(() => _channel.Enqueue(messageThree)); - + _channel.Enqueue(messageOne, messageTwo, messageThree); + //This should throw an exception + await Assert.That(() => _channel.Enqueue(messageThree)).ThrowsExactly(); } - [Fact] - public void When_we_try_to_create_with_too_small_a_buffer() + [Test] + public async Task When_we_try_to_create_with_too_small_a_buffer() { - Assert.Throws(() => new Channel(new(Channel), new (_routingKey), _gateway, 0)); + await Assert.That(() => new Channel(new(Channel), new(_routingKey), _gateway, 0)).ThrowsExactly(); } - [Fact] - public void When_we_try_to_create_with_too_large_a_buffer() + [Test] + public async Task When_we_try_to_create_with_too_large_a_buffer() { - Assert.Throws(() => new Channel(new(Channel), new (_routingKey), _gateway, 11)); + await Assert.That(() => new Channel(new(Channel), new(_routingKey), _gateway, 11)).ThrowsExactly(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_combined_channel_factory_propagates_scheduler.cs b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_combined_channel_factory_propagates_scheduler.cs index 89734c1163..132698db18 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_combined_channel_factory_propagates_scheduler.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_combined_channel_factory_propagates_scheduler.cs @@ -19,89 +19,80 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #endregion - using System; using System.Threading; using System.Threading.Tasks; using FakeItEasy; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessagingGateway; - public class CombinedChannelFactorySchedulerTests { - [Fact] - public void Should_propagate_scheduler_to_inner_factories() + [Test] + public async Task Should_propagate_scheduler_to_inner_factories() { // Arrange var factory1 = new SchedulerAwareMockFactory(); var factory2 = new SchedulerAwareMockFactory(); var combined = new CombinedChannelFactory([factory1, factory2]); var scheduler = A.Fake(); - // Act ((IAmAChannelFactoryWithScheduler)combined).Scheduler = scheduler; - // Assert - Assert.Same(scheduler, factory1.Scheduler); - Assert.Same(scheduler, factory2.Scheduler); + await Assert.That(factory1.Scheduler).IsSameReferenceAs(scheduler); + await Assert.That(factory2.Scheduler).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_read_scheduler_from_first_inner_factory() + [Test] + public async Task Should_read_scheduler_from_first_inner_factory() { // Arrange var scheduler = A.Fake(); - var factory1 = new SchedulerAwareMockFactory { Scheduler = scheduler }; + var factory1 = new SchedulerAwareMockFactory + { + Scheduler = scheduler + }; var factory2 = new SchedulerAwareMockFactory(); var combined = new CombinedChannelFactory([factory1, factory2]); - // Act var result = ((IAmAChannelFactoryWithScheduler)combined).Scheduler; - // Assert - Assert.Same(scheduler, result); + await Assert.That(result).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_skip_inner_factories_that_do_not_implement_scheduler_interface() + [Test] + public async Task Should_skip_inner_factories_that_do_not_implement_scheduler_interface() { // Arrange var plainFactory = new PlainMockFactory(); var schedulerFactory = new SchedulerAwareMockFactory(); var combined = new CombinedChannelFactory([plainFactory, schedulerFactory]); var scheduler = A.Fake(); - // Act ((IAmAChannelFactoryWithScheduler)combined).Scheduler = scheduler; - // Assert — only the scheduler-aware factory gets the scheduler - Assert.Same(scheduler, schedulerFactory.Scheduler); + await Assert.That(schedulerFactory.Scheduler).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_implement_scheduler_interface() + [Test] + public async Task Should_implement_scheduler_interface() { var combined = new CombinedChannelFactory([]); - - Assert.IsAssignableFrom(combined); + await Assert.That(combined).IsAssignableTo(); } - private class SchedulerAwareMockFactory : IAmAChannelFactory, IAmAChannelFactoryWithScheduler + private class SchedulerAwareMockFactory : Paramore.Brighter.IAmAChannelFactory, Paramore.Brighter.IAmAChannelFactoryWithScheduler { public IAmAMessageScheduler? Scheduler { get; set; } public IAmAChannelSync CreateSyncChannel(Subscription subscription) => A.Fake(); public IAmAChannelAsync CreateAsyncChannel(Subscription subscription) => A.Fake(); - public Task CreateAsyncChannelAsync(Subscription subscription, CancellationToken ct = default) - => Task.FromResult(A.Fake()); + public Task CreateAsyncChannelAsync(Subscription subscription, CancellationToken ct = default) => Task.FromResult(A.Fake()); } private class PlainMockFactory : IAmAChannelFactory { public IAmAChannelSync CreateSyncChannel(Subscription subscription) => A.Fake(); public IAmAChannelAsync CreateAsyncChannel(Subscription subscription) => A.Fake(); - public Task CreateAsyncChannelAsync(Subscription subscription, CancellationToken ct = default) - => Task.FromResult(A.Fake()); + public Task CreateAsyncChannelAsync(Subscription subscription, CancellationToken ct = default) => Task.FromResult(A.Fake()); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_constructing_a_channel_with_combined_factory.cs b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_constructing_a_channel_with_combined_factory.cs index 464acd2dd0..1bd43fa427 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_constructing_a_channel_with_combined_factory.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_constructing_a_channel_with_combined_factory.cs @@ -1,101 +1,64 @@ -using System; +using System; using System.Threading; using System.Threading.Tasks; using FakeItEasy; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessagingGateway; - public class CombinedChannelFactoryTest { - [Fact] - public void When_constructing_a_sync_channel_with_combined_factory() + [Test] + public async Task When_constructing_a_sync_channel_with_combined_factory() { - var sub1 = new MockSubscription(typeof(MockChannelFactory), dataType: typeof(string), - messagePumpType: MessagePumpType.Proactor); + var sub1 = new MockSubscription(typeof(MockChannelFactory), dataType: typeof(string), messagePumpType: MessagePumpType.Proactor); var factory1 = new MockChannelFactory(sub1); - - var sub2 = new MockSubscription(typeof(MockChannel2Factory), dataType: typeof(string), - messagePumpType: MessagePumpType.Proactor); + var sub2 = new MockSubscription(typeof(MockChannel2Factory), dataType: typeof(string), messagePumpType: MessagePumpType.Proactor); var factory2 = new MockChannel2Factory(sub2); - - var channelFactory = new CombinedChannelFactory( - [factory1, factory2] - ); - + var channelFactory = new CombinedChannelFactory([factory1, factory2]); var channel = channelFactory.CreateSyncChannel(sub1); - Assert.NotNull(channel); - Assert.Equal(factory1.ChannelSync, channel); - - + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsEqualTo(factory1.ChannelSync); channel = channelFactory.CreateSyncChannel(sub2); - Assert.NotNull(channel); - Assert.Equal(factory2.ChannelSync, channel); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsEqualTo(factory2.ChannelSync); } - [Fact] - public void When_constructing_a_async_channel_with_combined_factory() + [Test] + public async Task When_constructing_a_async_channel_with_combined_factory() { - var sub1 = new MockSubscription(typeof(MockChannelFactory), dataType: typeof(string), - messagePumpType: MessagePumpType.Proactor); + var sub1 = new MockSubscription(typeof(MockChannelFactory), dataType: typeof(string), messagePumpType: MessagePumpType.Proactor); var factory1 = new MockChannelFactory(sub1); - - var sub2 = new MockSubscription(typeof(MockChannel2Factory), dataType: typeof(string), - messagePumpType: MessagePumpType.Proactor); + var sub2 = new MockSubscription(typeof(MockChannel2Factory), dataType: typeof(string), messagePumpType: MessagePumpType.Proactor); var factory2 = new MockChannel2Factory(sub2); - - var channelFactory = new CombinedChannelFactory( - [factory1, factory2] - ); - - var channel = channelFactory.CreateAsyncChannel(sub1); - Assert.NotNull(channel); - Assert.Equal(factory1.ChannelAsync, channel); - - - channel = channelFactory.CreateAsyncChannel(sub2); - Assert.NotNull(channel); - Assert.Equal(factory2.ChannelAsync, channel); + var channelFactory = new CombinedChannelFactory([factory1, factory2]); + var channel = await channelFactory.CreateAsyncChannelAsync(sub1); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsEqualTo(factory1.ChannelAsync); + channel = await channelFactory.CreateAsyncChannelAsync(sub2); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsEqualTo(factory2.ChannelAsync); } - [Fact] + [Test] public async Task When_constructing_a_async_channel_with_combined_factory_async() { - var sub1 = new MockSubscription(typeof(MockChannelFactory), dataType: typeof(string), - messagePumpType: MessagePumpType.Proactor); + var sub1 = new MockSubscription(typeof(MockChannelFactory), dataType: typeof(string), messagePumpType: MessagePumpType.Proactor); var factory1 = new MockChannelFactory(sub1); - - var sub2 = new MockSubscription(typeof(MockChannel2Factory), dataType: typeof(string), - messagePumpType: MessagePumpType.Proactor); + var sub2 = new MockSubscription(typeof(MockChannel2Factory), dataType: typeof(string), messagePumpType: MessagePumpType.Proactor); var factory2 = new MockChannel2Factory(sub2); - - var channelFactory = new CombinedChannelFactory( - [factory1, factory2] - ); - + var channelFactory = new CombinedChannelFactory([factory1, factory2]); var channel = await channelFactory.CreateAsyncChannelAsync(sub1); - Assert.NotNull(channel); - Assert.Equal(factory1.ChannelAsync, channel); - + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsEqualTo(factory1.ChannelAsync); channel = await channelFactory.CreateAsyncChannelAsync(sub2); - Assert.NotNull(channel); - Assert.Equal(factory2.ChannelAsync, channel); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsEqualTo(factory2.ChannelAsync); } - public class MockSubscription : Subscription + public class MockSubscription : Paramore.Brighter.Subscription { public override Type ChannelFactoryType { get; } - public MockSubscription( - Type channelFactoryType, SubscriptionName? name = null, ChannelName? channelName = null, - RoutingKey? routingKey = null, Type? dataType = null, Func? getRequestType = null, - int bufferSize = 1, int noOfPerformers = 1, TimeSpan? timeOut = null, int requeueCount = -1, TimeSpan? requeueDelay = null, - int unacceptableMessageLimit = 0, MessagePumpType messagePumpType = MessagePumpType.Unknown, - IAmAChannelFactory? channelFactory = null, OnMissingChannel makeChannels = OnMissingChannel.Create, - TimeSpan? emptyChannelDelay = null, TimeSpan? channelFailureDelay = null) : base(name, - channelName, routingKey, dataType, getRequestType, bufferSize, noOfPerformers, timeOut, requeueCount, requeueDelay, - unacceptableMessageLimit, messagePumpType, channelFactory, makeChannels, emptyChannelDelay, - channelFailureDelay) + public MockSubscription(Type channelFactoryType, SubscriptionName? name = null, ChannelName? channelName = null, RoutingKey? routingKey = null, Type? dataType = null, Func? getRequestType = null, int bufferSize = 1, int noOfPerformers = 1, TimeSpan? timeOut = null, int requeueCount = -1, TimeSpan? requeueDelay = null, int unacceptableMessageLimit = 0, MessagePumpType messagePumpType = MessagePumpType.Unknown, IAmAChannelFactory? channelFactory = null, OnMissingChannel makeChannels = OnMissingChannel.Create, TimeSpan? emptyChannelDelay = null, TimeSpan? channelFailureDelay = null) : base(name, channelName, routingKey, dataType, getRequestType, bufferSize, noOfPerformers, timeOut, requeueCount, requeueDelay, unacceptableMessageLimit, messagePumpType, channelFactory, makeChannels, emptyChannelDelay, channelFailureDelay) { ChannelFactoryType = channelFactoryType; } @@ -105,7 +68,6 @@ public class MockChannelFactory : IAmAChannelFactory { public IAmAChannelSync ChannelSync { get; } public IAmAChannelAsync ChannelAsync { get; } - public Subscription Subscription { get; } public MockChannelFactory(Subscription subscription) @@ -150,7 +112,6 @@ public class MockChannel2Factory : IAmAChannelFactory { public IAmAChannelSync ChannelSync { get; } public IAmAChannelAsync ChannelAsync { get; } - public Subscription Subscription { get; } public MockChannel2Factory(Subscription subscription) @@ -190,4 +151,4 @@ public Task CreateAsyncChannelAsync(Subscription subscription, throw new Exception(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_stale_shutdown_handler_fires_should_not_dispose_replacement_connection.cs b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_stale_shutdown_handler_fires_should_not_dispose_replacement_connection.cs index 145c8c41e3..a080d7e3d4 100644 --- a/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_stale_shutdown_handler_fires_should_not_dispose_replacement_connection.cs +++ b/tests/Paramore.Brighter.Core.Tests/MessagingGateway/When_stale_shutdown_handler_fires_should_not_dispose_replacement_connection.cs @@ -2,10 +2,8 @@ using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; -using Xunit; namespace Paramore.Brighter.Core.Tests.MessagingGateway; - /// /// Regression test for issue #4024 — connection pool race condition. /// @@ -21,25 +19,21 @@ namespace Paramore.Brighter.Core.Tests.MessagingGateway; /// public class ConnectionPoolReferenceEqualityGuardTests { - [Fact] - public void When_Stale_Handler_Fires_Should_Not_Dispose_Replacement_Connection() + [Test] + public async Task When_Stale_Handler_Fires_Should_Not_Dispose_Replacement_Connection() { // Arrange — simulate the pool with two connections sharing the same key var pool = new Dictionary(); const string connectionId = "guest.guest.localhost.5672./"; - var oldConnection = new FakeConnection("old"); var newConnection = new FakeConnection("new"); - // First connection is added, then replaced pool[connectionId] = new FakePooledConnection(oldConnection); pool[connectionId] = new FakePooledConnection(newConnection); - // Act — simulate the old connection's shutdown handler firing // This is the exact pattern from RmqMessageGatewayConnectionPool.ShutdownHandler object sender = oldConnection; // the shutdown event sender is the OLD connection - if (pool.TryGetValue(connectionId, out var pooled) - && ReferenceEquals(pooled.Connection, sender)) + if (pool.TryGetValue(connectionId, out var pooled) && ReferenceEquals(pooled.Connection, sender)) { // This block should NOT execute because sender is the old connection pooled.Connection.SimulateDispose(); @@ -47,57 +41,49 @@ public void When_Stale_Handler_Fires_Should_Not_Dispose_Replacement_Connection() } // Assert — the new connection should still be in the pool and not disposed - Assert.True(pool.ContainsKey(connectionId), "New connection should still be in the pool"); - Assert.False(newConnection.IsDisposed, "New connection should not have been disposed by stale handler"); - Assert.False(oldConnection.IsDisposed, "Old connection should not have been disposed (guard prevented it)"); + await Assert.That(pool.ContainsKey(connectionId)).IsTrue(); + await Assert.That(newConnection.IsDisposed).IsFalse(); + await Assert.That(oldConnection.IsDisposed).IsFalse(); } - [Fact] - public void When_Current_Connection_Shuts_Down_Should_Remove_From_Pool() + [Test] + public async Task When_Current_Connection_Shuts_Down_Should_Remove_From_Pool() { // Arrange — the handler fires for the connection that IS currently in the pool var pool = new Dictionary(); const string connectionId = "guest.guest.localhost.5672./"; - var currentConnection = new FakeConnection("current"); pool[connectionId] = new FakePooledConnection(currentConnection); - // Act — shutdown handler fires for the current connection object sender = currentConnection; - if (pool.TryGetValue(connectionId, out var pooled) - && ReferenceEquals(pooled.Connection, sender)) + if (pool.TryGetValue(connectionId, out var pooled) && ReferenceEquals(pooled.Connection, sender)) { pooled.Connection.SimulateDispose(); pool.Remove(connectionId); } // Assert — the connection should be removed and disposed - Assert.False(pool.ContainsKey(connectionId), "Connection should be removed from pool"); - Assert.True(currentConnection.IsDisposed, "Current connection should be disposed"); + await Assert.That(pool.ContainsKey(connectionId)).IsFalse(); + await Assert.That(currentConnection.IsDisposed).IsTrue(); } - [Fact] + [Test] public async Task When_Stale_Async_Handler_Fires_Should_Not_Dispose_Replacement_Connection() { // Arrange — same pattern but with SemaphoreSlim (matching the async pool) var pool = new Dictionary(); var semaphore = new SemaphoreSlim(1, 1); const string connectionId = "guest.guest.localhost.5672./"; - var oldConnection = new FakeConnection("old"); var newConnection = new FakeConnection("new"); - pool[connectionId] = new FakePooledConnection(oldConnection); pool[connectionId] = new FakePooledConnection(newConnection); - // Act — simulate the async shutdown handler object sender = oldConnection; - await semaphore.WaitAsync(CancellationToken.None); try { - if (pool.TryGetValue(connectionId, out var pooled) - && ReferenceEquals(pooled.Connection, sender)) + if (pool.TryGetValue(connectionId, out var pooled) && ReferenceEquals(pooled.Connection, sender)) { pooled.Connection.SimulateDispose(); pool.Remove(connectionId); @@ -109,8 +95,8 @@ public async Task When_Stale_Async_Handler_Fires_Should_Not_Dispose_Replacement_ } // Assert - Assert.True(pool.ContainsKey(connectionId)); - Assert.False(newConnection.IsDisposed); + await Assert.That(pool.ContainsKey(connectionId)).IsTrue(); + await Assert.That(newConnection.IsDisposed).IsFalse(); } private sealed class FakeConnection(string name) @@ -119,9 +105,8 @@ private sealed class FakeConnection(string name) public bool IsDisposed { get; private set; } public void SimulateDispose() => IsDisposed = true; - public override string ToString() => $"FakeConnection({Name})"; } private sealed record FakePooledConnection(FakeConnection Connection); -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Monitoring/When_Monitoring_Is_On_For_A_Handler.cs b/tests/Paramore.Brighter.Core.Tests/Monitoring/When_Monitoring_Is_On_For_A_Handler.cs index 20f7d67536..a3fedba459 100644 --- a/tests/Paramore.Brighter.Core.Tests/Monitoring/When_Monitoring_Is_On_For_A_Handler.cs +++ b/tests/Paramore.Brighter.Core.Tests/Monitoring/When_Monitoring_Is_On_For_A_Handler.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,20 +12,17 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.Monitoring.TestDoubles; -using Xunit; using Paramore.Brighter.Monitoring.Configuration; using Paramore.Brighter.Monitoring.Events; using Paramore.Brighter.Monitoring.Handlers; @@ -37,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Core.Tests.Monitoring { - [Trait("Category", "Monitoring")] + [Property("Category", "Monitoring")] public class MonitorHandlerPipelineTests { private readonly MyCommand _command; @@ -47,66 +44,56 @@ public class MonitorHandlerPipelineTests private readonly string _originalRequestAsJson; private MonitorEvent _beforeEvent; private MonitorEvent _afterEvent; - public MonitorHandlerPipelineTests() { _controlBusSender = new SpyControlBusSender(); var registry = new SubscriberRegistry(); - registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); container.AddSingleton(_controlBusSender); container.AddSingleton(new MonitorConfiguration { IsMonitoringEnabled = true, InstanceName = "UnitTests" }); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); _command = new MyCommand(); - _originalRequestAsJson = JsonSerializer.Serialize(_command, JsonSerialisationOptions.Options); - _at = DateTime.UtcNow.AddMilliseconds(-500); } - [Fact] - public void When_Monitoring_Is_On_For_A_Handler() + [Test] + public async Task When_Monitoring_Is_On_For_A_Handler() { _commandProcessor.Send(_command); _beforeEvent = _controlBusSender.Observe(); _afterEvent = _controlBusSender.Observe(); - //_should_have_an_instance_name_before - Assert.Equal("UnitTests", _beforeEvent.InstanceName); + await Assert.That(_beforeEvent.InstanceName).IsEqualTo("UnitTests"); //_should_post_the_event_type_to_the_control_bus_before - Assert.Equal(MonitorEventType.EnterHandler, _beforeEvent.EventType); + await Assert.That(_beforeEvent.EventType).IsEqualTo(MonitorEventType.EnterHandler); //_should_post_the_handler_fullname_to_the_control_bus_before - Assert.Equal(typeof(MyMonitoredHandler).AssemblyQualifiedName, _beforeEvent.HandlerFullAssemblyName); + await Assert.That(_beforeEvent.HandlerFullAssemblyName).IsEqualTo(typeof(MyMonitoredHandler).AssemblyQualifiedName); //_should_post_the_handler_name_to_the_control_bus_before - Assert.Equal(typeof(MyMonitoredHandler).FullName, _beforeEvent.HandlerName); + await Assert.That(_beforeEvent.HandlerName).IsEqualTo(typeof(MyMonitoredHandler).FullName); //_should_include_the_underlying_request_details_before - Assert.Equal(_originalRequestAsJson, _beforeEvent.RequestBody); + await Assert.That(_beforeEvent.RequestBody).IsEqualTo(_originalRequestAsJson); //_should_post_the_time_of_the_request_before - Assert.True((_beforeEvent.EventTime.ToUniversalTime()) >= ((_at.ToUniversalTime()) - (TimeSpan.FromSeconds(1))) && (_beforeEvent.EventTime.ToUniversalTime()) <= ((_at.ToUniversalTime()) + (TimeSpan.FromSeconds(1)))); + await Assert.That((_beforeEvent.EventTime.ToUniversalTime()) >= ((_at.ToUniversalTime()) - (TimeSpan.FromSeconds(1))) && (_beforeEvent.EventTime.ToUniversalTime()) <= ((_at.ToUniversalTime()) + (TimeSpan.FromSeconds(1)))).IsTrue(); //_should_elapsed_before_as_zero - Assert.Equal(0, _beforeEvent.TimeElapsedMs); + await Assert.That(_beforeEvent.TimeElapsedMs).IsEqualTo(0); //_should_have_an_instance_name_after - Assert.Equal("UnitTests", _afterEvent.InstanceName); + await Assert.That(_afterEvent.InstanceName).IsEqualTo("UnitTests"); //_should_post_the_handler_fullname_to_the_control_bus_after - Assert.Equal(MonitorEventType.ExitHandler, _afterEvent.EventType); + await Assert.That(_afterEvent.EventType).IsEqualTo(MonitorEventType.ExitHandler); //_should_post_the_handler_fullname_to_the_control_bus_after - Assert.Equal(typeof(MyMonitoredHandler).AssemblyQualifiedName, _afterEvent.HandlerFullAssemblyName); + await Assert.That(_afterEvent.HandlerFullAssemblyName).IsEqualTo(typeof(MyMonitoredHandler).AssemblyQualifiedName); //_should_post_the_handler_name_to_the_control_bus_after - Assert.Equal(typeof(MyMonitoredHandler).FullName, _afterEvent.HandlerName); + await Assert.That(_afterEvent.HandlerName).IsEqualTo(typeof(MyMonitoredHandler).FullName); //_should_include_the_underlying_request_details_after - Assert.Equal(_originalRequestAsJson, _afterEvent.RequestBody); + await Assert.That(_afterEvent.RequestBody).IsEqualTo(_originalRequestAsJson); //should_post_the_time_of_the_request_after - Assert.True((_afterEvent.EventTime.ToUniversalTime()) > (_at.ToUniversalTime())); + await Assert.That((_afterEvent.EventTime.ToUniversalTime()) > (_at.ToUniversalTime())).IsTrue(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Monitoring/When_Monitoring_Is_On_For_A_Handler_Async.cs b/tests/Paramore.Brighter.Core.Tests/Monitoring/When_Monitoring_Is_On_For_A_Handler_Async.cs index b3aa967c64..2cab35d430 100644 --- a/tests/Paramore.Brighter.Core.Tests/Monitoring/When_Monitoring_Is_On_For_A_Handler_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Monitoring/When_Monitoring_Is_On_For_A_Handler_Async.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,21 +12,18 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.Monitoring.TestDoubles; -using Xunit; using Paramore.Brighter.Monitoring.Configuration; using Paramore.Brighter.Monitoring.Events; using Paramore.Brighter.Monitoring.Handlers; @@ -38,7 +35,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Core.Tests.Monitoring { - [Trait("Category", "Monitoring")] + [Property("Category", "Monitoring")] public class MonitorHandlerPipelineAsyncTests { private readonly MyCommand _command; @@ -48,63 +45,54 @@ public class MonitorHandlerPipelineAsyncTests private readonly string _originalRequestAsJson; private MonitorEvent _beforeEvent; private MonitorEvent _afterEvent; - public MonitorHandlerPipelineAsyncTests() { _controlBusSender = new SpyControlBusSender(); var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); container.AddSingleton(_controlBusSender); container.AddSingleton(new MonitorConfiguration { IsMonitoringEnabled = true, InstanceName = "UnitTests" }); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); _command = new MyCommand(); - _originalRequestAsJson = JsonSerializer.Serialize(_command, JsonSerialisationOptions.Options); - _at = DateTime.UtcNow.AddMilliseconds(-500); } - [Fact] + [Test] public async Task When_Monitoring_Is_on_For_A_Handler_Async() { await _commandProcessor.SendAsync(_command); _beforeEvent = _controlBusSender.Observe(); _afterEvent = _controlBusSender.Observe(); - //_should_have_an_instance_name_before - Assert.Equal("UnitTests", _beforeEvent.InstanceName); + await Assert.That(_beforeEvent.InstanceName).IsEqualTo("UnitTests"); //_should_post_the_event_type_to_the_control_bus_before - Assert.Equal(MonitorEventType.EnterHandler, _beforeEvent.EventType); + await Assert.That(_beforeEvent.EventType).IsEqualTo(MonitorEventType.EnterHandler); //_should_post_the_handler_fullname_to_the_control_bus_before - Assert.Equal(typeof(MyMonitoredHandlerAsync).AssemblyQualifiedName, _beforeEvent.HandlerFullAssemblyName); + await Assert.That(_beforeEvent.HandlerFullAssemblyName).IsEqualTo(typeof(MyMonitoredHandlerAsync).AssemblyQualifiedName); //_should_post_the_handler_name_to_the_control_bus_before - Assert.Equal(typeof(MyMonitoredHandlerAsync).FullName, _beforeEvent.HandlerName); + await Assert.That(_beforeEvent.HandlerName).IsEqualTo(typeof(MyMonitoredHandlerAsync).FullName); //_should_include_the_underlying_request_details_before - Assert.Equal(_originalRequestAsJson, _beforeEvent.RequestBody); + await Assert.That(_beforeEvent.RequestBody).IsEqualTo(_originalRequestAsJson); //should_post_the_time_of_the_request_before - Assert.True((_beforeEvent.EventTime.ToUniversalTime()) >= ((_at.ToUniversalTime()) - (TimeSpan.FromSeconds(1))) && (_beforeEvent.EventTime.ToUniversalTime()) <= ((_at.ToUniversalTime()) + (TimeSpan.FromSeconds(1)))); + await Assert.That((_beforeEvent.EventTime.ToUniversalTime()) >= ((_at.ToUniversalTime()) - (TimeSpan.FromSeconds(1))) && (_beforeEvent.EventTime.ToUniversalTime()) <= ((_at.ToUniversalTime()) + (TimeSpan.FromSeconds(1)))).IsTrue(); //_should_have_an_instance_name_after - Assert.Equal("UnitTests", _afterEvent.InstanceName); + await Assert.That(_afterEvent.InstanceName).IsEqualTo("UnitTests"); //_should_post_the_event_type_to_the_control_bus_after - Assert.Equal(MonitorEventType.ExitHandler, _afterEvent.EventType); + await Assert.That(_afterEvent.EventType).IsEqualTo(MonitorEventType.ExitHandler); //_should_post_the_handler_fullname_to_the_control_bus_after - Assert.Equal(typeof(MyMonitoredHandlerAsync).AssemblyQualifiedName, _afterEvent.HandlerFullAssemblyName); + await Assert.That(_afterEvent.HandlerFullAssemblyName).IsEqualTo(typeof(MyMonitoredHandlerAsync).AssemblyQualifiedName); //_should_post_the_handler_name_to_the_control_bus_after - Assert.Equal(typeof(MyMonitoredHandlerAsync).FullName, _afterEvent.HandlerName); + await Assert.That(_afterEvent.HandlerName).IsEqualTo(typeof(MyMonitoredHandlerAsync).FullName); //_should_include_the_underlying_request_details_after - Assert.Equal(_originalRequestAsJson, _afterEvent.RequestBody); + await Assert.That(_afterEvent.RequestBody).IsEqualTo(_originalRequestAsJson); //should_post_the_time_of_the_request_after - Assert.True((_afterEvent.EventTime.ToUniversalTime()) > (_at.ToUniversalTime())); + await Assert.That((_afterEvent.EventTime.ToUniversalTime()) > (_at.ToUniversalTime())).IsTrue(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Monitoring/When_Monitoring_We_Should_Record_But_Rethrow_Exceptions.cs b/tests/Paramore.Brighter.Core.Tests/Monitoring/When_Monitoring_We_Should_Record_But_Rethrow_Exceptions.cs index 545e56ef62..3fd13ea886 100644 --- a/tests/Paramore.Brighter.Core.Tests/Monitoring/When_Monitoring_We_Should_Record_But_Rethrow_Exceptions.cs +++ b/tests/Paramore.Brighter.Core.Tests/Monitoring/When_Monitoring_We_Should_Record_But_Rethrow_Exceptions.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2015 Ian Cooper +Copyright 2015 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.Monitoring.TestDoubles; @@ -32,11 +30,10 @@ THE SOFTWARE. */ using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.Monitoring { - [Trait("Category", "Monitoring")] + [Property("Category", "Monitoring")] public class MonitorHandlerTests { private readonly MyCommand _command; @@ -45,51 +42,43 @@ public class MonitorHandlerTests private readonly CommandProcessor _commandProcessor; private MonitorEvent _afterEvent; private readonly DateTime _at; - public MonitorHandlerTests() { _controlBusSender = new SpyControlBusSender(); var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); container.AddSingleton(_controlBusSender); container.AddSingleton(new MonitorConfiguration { IsMonitoringEnabled = true, InstanceName = "UnitTests" }); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); _command = new MyCommand(); - _at = DateTime.UtcNow.AddMilliseconds(-500); } - [Fact] - public void When_Monitoring_We_Should_Record_But_Rethrow_Exceptions() + [Test] + public async Task When_Monitoring_We_Should_Record_But_Rethrow_Exceptions() { _thrownException = Catch.Exception(() => _commandProcessor.Send(_command)); _controlBusSender.Observe(); //pop but don't inspect before. _afterEvent = _controlBusSender.Observe(); - //_should_pass_through_the_exception_not_swallow - Assert.NotNull(_thrownException); + await Assert.That(_thrownException).IsNotNull(); //_should_monitor_the_exception - Assert.True((_afterEvent.Exception) is Exception); + await Assert.That((_afterEvent.Exception) is Exception).IsTrue(); //_should_surface_the_error_message - Assert.Contains("monitored", _afterEvent.Exception.Message); + await Assert.That(_afterEvent.Exception.Message).Contains("monitored"); //_should_have_an_instance_name_after - Assert.Equal("UnitTests", _afterEvent.InstanceName); + await Assert.That(_afterEvent.InstanceName).IsEqualTo("UnitTests"); //_should_post_the_handler_fullname_to_the_control_bus_after - Assert.Equal(typeof(MyMonitoredHandler).FullName, _afterEvent.HandlerName); + await Assert.That(_afterEvent.HandlerName).IsEqualTo(typeof(MyMonitoredHandler).FullName); //_should_post_the_handler_name_to_the_control_bus_after - Assert.Equal(typeof(MyMonitoredHandler).AssemblyQualifiedName, _afterEvent.HandlerFullAssemblyName); + await Assert.That(_afterEvent.HandlerFullAssemblyName).IsEqualTo(typeof(MyMonitoredHandler).AssemblyQualifiedName); //should_post_the_time_of_the_request_after - Assert.True((_afterEvent.EventTime.ToUniversalTime()) > (_at.ToUniversalTime())); + await Assert.That((_afterEvent.EventTime.ToUniversalTime()) > (_at.ToUniversalTime())).IsTrue(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Monitoring/When_Monitoring_We_Should_Record_But_Rethrow_Exceptions_Async.cs b/tests/Paramore.Brighter.Core.Tests/Monitoring/When_Monitoring_We_Should_Record_But_Rethrow_Exceptions_Async.cs index f129d8e7ab..a0fccf326b 100644 --- a/tests/Paramore.Brighter.Core.Tests/Monitoring/When_Monitoring_We_Should_Record_But_Rethrow_Exceptions_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Monitoring/When_Monitoring_We_Should_Record_But_Rethrow_Exceptions_Async.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2015 Ian Cooper +Copyright 2015 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,21 +12,18 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.Monitoring.TestDoubles; -using Xunit; using Paramore.Brighter.Monitoring.Configuration; using Paramore.Brighter.Monitoring.Events; using Paramore.Brighter.Monitoring.Handlers; @@ -39,7 +36,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Core.Tests.Monitoring { - [Trait("Category", "Monitoring")] + [Property("Category", "Monitoring")] public class MonitorHandlerMustObserveButRethrowTests { private readonly MyCommand _command; @@ -49,55 +46,46 @@ public class MonitorHandlerMustObserveButRethrowTests private readonly DateTime _at; private MonitorEvent _afterEvent; private Exception? _exception; - public MonitorHandlerMustObserveButRethrowTests() { _controlBusSender = new SpyControlBusSender(); var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); container.AddSingleton(_controlBusSender); container.AddSingleton(new MonitorConfiguration { IsMonitoringEnabled = true, InstanceName = "UnitTests" }); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); - + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); _command = new MyCommand(); - _originalRequestAsJson = JsonSerializer.Serialize(_command, JsonSerialisationOptions.Options); - _at = DateTime.UtcNow.AddMilliseconds(-500); } - [Fact] + [Test] public async Task When_Monitoring_We_Should_Record_But_Rethrow_Exceptions_Async() { _exception = await Catch.ExceptionAsync(() => _commandProcessor.SendAsync(_command)); _controlBusSender.Observe(); _afterEvent = _controlBusSender.Observe(); - - //_should_pass_through_the_exception_not_swallow - Assert.NotNull(_exception); + //_should_pass_through_the_exception_not_swallow + await Assert.That(_exception).IsNotNull(); //_should_monitor_the_exception - Assert.True((_afterEvent.Exception) is Exception); + await Assert.That((_afterEvent.Exception) is Exception).IsTrue(); //_should_surface_the_error_message - Assert.Contains("monitored", _afterEvent.Exception.Message); + await Assert.That(_afterEvent.Exception.Message).Contains("monitored"); //_should_have_an_instance_name_after - Assert.Equal("UnitTests", _afterEvent.InstanceName); + await Assert.That(_afterEvent.InstanceName).IsEqualTo("UnitTests"); //_should_post_the_handler_fullname_to_the_control_bus_after - Assert.Equal(typeof(MyMonitoredHandlerThatThrowsAsync).AssemblyQualifiedName, _afterEvent.HandlerFullAssemblyName); + await Assert.That(_afterEvent.HandlerFullAssemblyName).IsEqualTo(typeof(MyMonitoredHandlerThatThrowsAsync).AssemblyQualifiedName); //_should_post_the_handler_name_to_the_control_bus_after - Assert.Equal(typeof(MyMonitoredHandlerThatThrowsAsync).FullName, _afterEvent.HandlerName); + await Assert.That(_afterEvent.HandlerName).IsEqualTo(typeof(MyMonitoredHandlerThatThrowsAsync).FullName); //_should_include_the_underlying_request_details_after - Assert.Equal(_originalRequestAsJson, _afterEvent.RequestBody); + await Assert.That(_afterEvent.RequestBody).IsEqualTo(_originalRequestAsJson); //should_post_the_time_of_the_request_after - Assert.True((_afterEvent.EventTime.ToUniversalTime()) > (_at.ToUniversalTime())); + await Assert.That((_afterEvent.EventTime.ToUniversalTime()) > (_at.ToUniversalTime())).IsTrue(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Monitoring/When_Serializing_A_Monitoring_Event.cs b/tests/Paramore.Brighter.Core.Tests/Monitoring/When_Serializing_A_Monitoring_Event.cs index f59f29c281..a0828e84fb 100644 --- a/tests/Paramore.Brighter.Core.Tests/Monitoring/When_Serializing_A_Monitoring_Event.cs +++ b/tests/Paramore.Brighter.Core.Tests/Monitoring/When_Serializing_A_Monitoring_Event.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,19 +12,16 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; -using Xunit; using Paramore.Brighter.Monitoring.Events; using Paramore.Brighter.Monitoring.Mappers; using System.Text.Json; @@ -32,8 +29,8 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Core.Tests.Monitoring { - [Trait("Category", "Monitoring")] - public class MonitorEventMessageMapperTests + [Property("Category", "Monitoring")] + public class MonitorEventMessageMapperTests { private const string InstanceName = "Paramore.Tests"; private const string HandlerFullAssemblyName = "Paramore.Dummy.Handler, with some Assembly information"; @@ -44,40 +41,34 @@ public class MonitorEventMessageMapperTests private readonly string _originalRequestAsJson; private static int _elapsedMilliseconds; private static DateTime _at; - public MonitorEventMessageMapperTests() { _at = DateTime.UtcNow.AddMilliseconds(-500); - _monitorEventMessageMapper = new MonitorEventMessageMapper(); - _originalRequestAsJson = JsonSerializer.Serialize(new MyCommand(), JsonSerialisationOptions.Options); _elapsedMilliseconds = 34; - var @event = new MonitorEvent(InstanceName, MonitorEventType.EnterHandler, HandlerName, HandlerFullAssemblyName, _originalRequestAsJson, _at, _elapsedMilliseconds); - _message = _monitorEventMessageMapper.MapToMessage(@event, new Publication{Topic = new RoutingKey("paramore.monitoring.event")}); - } + _message = _monitorEventMessageMapper.MapToMessage(@event, new Publication { Topic = new RoutingKey("paramore.monitoring.event") }); + } - [Fact] - public void When_Serializing_A_Monitoring_Event() + [Test] + public async Task When_Serializing_A_Monitoring_Event() { _monitorEvent = _monitorEventMessageMapper.MapToRequest(_message); - //Should have the correct instance name - Assert.Equal(InstanceName, _monitorEvent.InstanceName); + await Assert.That(_monitorEvent.InstanceName).IsEqualTo(InstanceName); //Should have the correct handler name - Assert.Equal(HandlerName, _monitorEvent.HandlerName); + await Assert.That(_monitorEvent.HandlerName).IsEqualTo(HandlerName); //Should have the correct handler full assembly name - Assert.Equal(HandlerFullAssemblyName, _monitorEvent.HandlerFullAssemblyName); + await Assert.That(_monitorEvent.HandlerFullAssemblyName).IsEqualTo(HandlerFullAssemblyName); //Should have the correct monitor type - Assert.Equal(MonitorEventType.EnterHandler, _monitorEvent.EventType); + await Assert.That(_monitorEvent.EventType).IsEqualTo(MonitorEventType.EnterHandler); //Should have the original request as json - Assert.Equal(_originalRequestAsJson, _monitorEvent.RequestBody); + await Assert.That(_monitorEvent.RequestBody).IsEqualTo(_originalRequestAsJson); //Should have the correct event time - Assert.True((_monitorEvent.EventTime.ToUniversalTime()) >= ((_at.ToUniversalTime()) - (TimeSpan.FromSeconds(1))) && (_monitorEvent.EventTime.ToUniversalTime()) <= ((_at.ToUniversalTime()) + (TimeSpan.FromSeconds(1)))); + await Assert.That((_monitorEvent.EventTime.ToUniversalTime()) >= ((_at.ToUniversalTime()) - (TimeSpan.FromSeconds(1))) && (_monitorEvent.EventTime.ToUniversalTime()) <= ((_at.ToUniversalTime()) + (TimeSpan.FromSeconds(1)))).IsTrue(); //Should have the correct time elapsed - Assert.Equal(_elapsedMilliseconds, _monitorEvent.TimeElapsedMs); + await Assert.That(_monitorEvent.TimeElapsedMs).IsEqualTo(_elapsedMilliseconds); } - - } -} + } +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/NamingConventions/When_creating_dead_letter_name_with_custom_template_should_use_template.cs b/tests/Paramore.Brighter.Core.Tests/NamingConventions/When_creating_dead_letter_name_with_custom_template_should_use_template.cs index a91b42203d..fbc6706dfa 100644 --- a/tests/Paramore.Brighter.Core.Tests/NamingConventions/When_creating_dead_letter_name_with_custom_template_should_use_template.cs +++ b/tests/Paramore.Brighter.Core.Tests/NamingConventions/When_creating_dead_letter_name_with_custom_template_should_use_template.cs @@ -1,45 +1,16 @@ -#region Licence -/* The MIT License (MIT) -Copyright © 2025 Ian Cooper - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. */ - -#endregion - -using Xunit; - namespace Paramore.Brighter.Core.Tests.NamingConventions; - public class DeadLetterNamingConventionCustomTemplateTests { - [Fact] - public void When_creating_dead_letter_name_with_custom_template_should_use_template() + [Test] + public async Task When_creating_dead_letter_name_with_custom_template_should_use_template() { //Arrange var customTemplate = "failed-{0}"; var convention = new DeadLetterNamingConvention(customTemplate); var dataTopic = new RoutingKey("orders"); - //Act var deadLetterRoutingKey = convention.MakeChannelName(dataTopic); - //Assert - Assert.Equal("failed-orders", deadLetterRoutingKey.Value); + await Assert.That(deadLetterRoutingKey.Value).IsEqualTo("failed-orders"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/NamingConventions/When_creating_dead_letter_name_with_default_template_should_append_dlq.cs b/tests/Paramore.Brighter.Core.Tests/NamingConventions/When_creating_dead_letter_name_with_default_template_should_append_dlq.cs index dae264cc52..b155cc9ddf 100644 --- a/tests/Paramore.Brighter.Core.Tests/NamingConventions/When_creating_dead_letter_name_with_default_template_should_append_dlq.cs +++ b/tests/Paramore.Brighter.Core.Tests/NamingConventions/When_creating_dead_letter_name_with_default_template_should_append_dlq.cs @@ -1,20 +1,15 @@ -using Xunit; - namespace Paramore.Brighter.Core.Tests.NamingConventions; - public class DeadLetterNamingConventionDefaultTemplateTests { - [Fact] - public void When_creating_dead_letter_name_with_default_template_should_append_dlq() + [Test] + public async Task When_creating_dead_letter_name_with_default_template_should_append_dlq() { //Arrange var convention = new DeadLetterNamingConvention(); var dataTopic = new RoutingKey("orders"); - //Act var deadLetterRoutingKey = convention.MakeChannelName(dataTopic); - //Assert - Assert.Equal("orders.dlq", deadLetterRoutingKey.Value); + await Assert.That(deadLetterRoutingKey.Value).IsEqualTo("orders.dlq"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/NamingConventions/When_creating_invalid_message_name_with_custom_template_should_use_template.cs b/tests/Paramore.Brighter.Core.Tests/NamingConventions/When_creating_invalid_message_name_with_custom_template_should_use_template.cs index 12f7fcbe9e..1e3c85b5ae 100644 --- a/tests/Paramore.Brighter.Core.Tests/NamingConventions/When_creating_invalid_message_name_with_custom_template_should_use_template.cs +++ b/tests/Paramore.Brighter.Core.Tests/NamingConventions/When_creating_invalid_message_name_with_custom_template_should_use_template.cs @@ -1,45 +1,16 @@ -#region Licence -/* The MIT License (MIT) -Copyright © 2025 Ian Cooper - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. */ - -#endregion - -using Xunit; - namespace Paramore.Brighter.Core.Tests.NamingConventions; - public class InvalidMessageNamingConventionCustomTemplateTests { - [Fact] - public void When_creating_invalid_message_name_with_custom_template_should_use_template() + [Test] + public async Task When_creating_invalid_message_name_with_custom_template_should_use_template() { //Arrange var customTemplate = "bad-{0}"; var convention = new InvalidMessageNamingConvention(customTemplate); var dataTopic = new RoutingKey("orders"); - //Act var invalidMessageRoutingKey = convention.MakeChannelName(dataTopic); - //Assert - Assert.Equal("bad-orders", invalidMessageRoutingKey.Value); + await Assert.That(invalidMessageRoutingKey.Value).IsEqualTo("bad-orders"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/NamingConventions/When_creating_invalid_message_name_with_default_template_should_append_invalid.cs b/tests/Paramore.Brighter.Core.Tests/NamingConventions/When_creating_invalid_message_name_with_default_template_should_append_invalid.cs index ffa876c6e8..04c6e6bdd4 100644 --- a/tests/Paramore.Brighter.Core.Tests/NamingConventions/When_creating_invalid_message_name_with_default_template_should_append_invalid.cs +++ b/tests/Paramore.Brighter.Core.Tests/NamingConventions/When_creating_invalid_message_name_with_default_template_should_append_invalid.cs @@ -1,44 +1,15 @@ -#region Licence -/* The MIT License (MIT) -Copyright © 2025 Ian Cooper - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. */ - -#endregion - -using Xunit; - namespace Paramore.Brighter.Core.Tests.NamingConventions; - public class InvalidMessageNamingConventionDefaultTemplateTests { - [Fact] - public void When_creating_invalid_message_name_with_default_template_should_append_invalid() + [Test] + public async Task When_creating_invalid_message_name_with_default_template_should_append_invalid() { //Arrange var convention = new InvalidMessageNamingConvention(); var dataTopic = new RoutingKey("orders"); - //Act var invalidMessageRoutingKey = convention.MakeChannelName(dataTopic); - //Assert - Assert.Equal("orders.invalid", invalidMessageRoutingKey.Value); + await Assert.That(invalidMessageRoutingKey.Value).IsEqualTo("orders.invalid"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/Archive/When_archiving_from_the_outbox.cs b/tests/Paramore.Brighter.Core.Tests/Observability/Archive/When_archiving_from_the_outbox.cs index f9de40cf8f..7b84854141 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/Archive/When_archiving_from_the_outbox.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/Archive/When_archiving_from_the_outbox.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -12,14 +12,13 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.Archive; - +[NotInParallel("Observability")] public class ExternalServiceBusArchiveObservabilityTests { private readonly List _exportedActivities = new(); - private readonly OutboxProducerMediator _bus; + private readonly OutboxProducerMediator _bus; private readonly Publication _publication; private readonly FakeTimeProvider _timeProvider; private RoutingKey _routingKey = new("MyEvent"); @@ -27,24 +26,14 @@ public class ExternalServiceBusArchiveObservabilityTests private readonly TracerProvider _traceProvider; private const double TOLERANCE = 0.000000001; private readonly BrighterTracer _tracer; - public ExternalServiceBusArchiveObservabilityTests() { IAmABus internalBus = new InternalBus(); _timeProvider = new FakeTimeProvider(); _tracer = new BrighterTracer(_timeProvider); - var builder = Sdk.CreateTracerProviderBuilder(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); var type = new CloudEventsType("io.goparamore.brighter.myevent"); - _publication = new Publication { Source = new Uri("http://localhost"), @@ -52,124 +41,87 @@ public ExternalServiceBusArchiveObservabilityTests() Topic = _routingKey, Type = type, }; - var producer = new InMemoryMessageProducer(internalBus, _publication); - - var producerRegistry = - new ProducerRegistry(new Dictionary { { new ProducerKey(_routingKey, type), producer } }); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), - null); + var producerRegistry = new ProducerRegistry(new Dictionary { { new ProducerKey(_routingKey, type), producer } }); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - - _outbox = new InMemoryOutbox(_timeProvider) { Tracer = _tracer }; - - _bus = new OutboxProducerMediator( - producerRegistry, - new ResiliencePipelineRegistry().AddBrighterDefault(), - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - _tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox, - timeProvider:_timeProvider); + _outbox = new InMemoryOutbox(_timeProvider) + { + Tracer = _tracer + }; + _bus = new OutboxProducerMediator(producerRegistry, new ResiliencePipelineRegistry().AddBrighterDefault(), messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), _tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox, timeProvider: _timeProvider); } - [Theory] - [InlineData(InstrumentationOptions.RequestInformation)] - [InlineData(InstrumentationOptions.None)] - [InlineData(InstrumentationOptions.All)] - public void When_archiving_from_the_outbox(InstrumentationOptions instrumentationOptions) + [Test] + [Arguments(InstrumentationOptions.RequestInformation)] + [Arguments(InstrumentationOptions.None)] + [Arguments(InstrumentationOptions.All)] + public async Task When_archiving_from_the_outbox(InstrumentationOptions instrumentationOptions) { + Activity.Current = null; var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - - var context = new RequestContext { Span = parentActivity }; - + var context = new RequestContext + { + Span = parentActivity + }; //add and clear message var myEvent = new MyEvent(); var myMessage = new MyEventMessageMapper().MapToMessage(myEvent, _publication); - _bus.AddToOutbox(myMessage, context); + _bus.AddToOutbox(myMessage, context); _bus.ClearOutbox([myMessage.Id], context); - //we should have an entry in the outbox - Assert.Equal(1, _outbox.EntryCount); - + await Assert.That(_outbox.EntryCount).IsEqualTo(1); //allow time to pass - _timeProvider.Advance(TimeSpan.FromSeconds(300)); - + _timeProvider.Advance(TimeSpan.FromSeconds(300)); //archive var dispatchedSince = TimeSpan.FromSeconds(100); var archiveProvider = new InMemoryArchiveProvider(); - - var archiver = new OutboxArchiver(_outbox, archiveProvider, tracer: _tracer, - instrumentationOptions: instrumentationOptions); - archiver.Archive(dispatchedSince, context); - + var archiver = new OutboxArchiver(_outbox, archiveProvider, tracer: _tracer, instrumentationOptions: instrumentationOptions); + await archiver.ArchiveAsync(dispatchedSince, context); //should be no messages in the outbox - Assert.Equal(0, _outbox.EntryCount); - + await Assert.That(_outbox.EntryCount).IsEqualTo(0); parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //We should have exported matching activities - Assert.Equal(9, _exportedActivities.Count); - - Assert.Contains(_exportedActivities, a => a.Source.Name == "Paramore.Brighter"); - + await Assert.That(_exportedActivities.Count).IsEqualTo(9); + await Assert.That(_exportedActivities).Contains(a => a.Source.Name == "Paramore.Brighter"); //there should be an archive create span for the batch var createActivity = _exportedActivities.Single(a => a.DisplayName == $"{BrighterSemanticConventions.ArchiveMessages} {CommandProcessorSpanOperation.Archive.ToSpanName()}"); - Assert.NotNull(createActivity); - Assert.Equal(parentActivity?.Id, createActivity.ParentId); - + await Assert.That(createActivity).IsNotNull(); + await Assert.That(createActivity.ParentId).IsEqualTo(parentActivity?.Id); //check for outstanding messages span - var osCheckActivity = _exportedActivities.SingleOrDefault(a => - a.DisplayName == $"{BoxDbOperation.DispatchedMessages.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); - Assert.NotNull(osCheckActivity); - Assert.Equal(createActivity.Id, osCheckActivity?.ParentId); - + var osCheckActivity = _exportedActivities.SingleOrDefault(a => a.DisplayName == $"{BoxDbOperation.DispatchedMessages.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); + await Assert.That(osCheckActivity).IsNotNull(); + await Assert.That(osCheckActivity?.ParentId).IsEqualTo(createActivity.Id); //check for delete messages span - var deleteActivity = _exportedActivities.SingleOrDefault(a => - a.DisplayName == $"{BoxDbOperation.Delete.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); - Assert.NotNull(deleteActivity); - Assert.Equal(createActivity.Id, deleteActivity?.ParentId); - + var deleteActivity = _exportedActivities.SingleOrDefault(a => a.DisplayName == $"{BoxDbOperation.Delete.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); + await Assert.That(deleteActivity).IsNotNull(); + await Assert.That(deleteActivity?.ParentId).IsEqualTo(createActivity.Id); //check the tags for the create span - if(instrumentationOptions == InstrumentationOptions.None) - Assert.Empty(createActivity.Tags); + if (instrumentationOptions == InstrumentationOptions.None) + await Assert.That(createActivity.Tags).IsEmpty(); if (instrumentationOptions.HasFlag(InstrumentationOptions.RequestInformation)) { - Assert.Contains(createActivity.TagObjects, - t => t.Key == BrighterSemanticConventions.ArchiveAge && - Math.Abs(Convert.ToDouble(t.Value) - dispatchedSince.TotalMilliseconds) < TOLERANCE); - Assert.Contains(createActivity.TagObjects, - t => t.Key == BrighterSemanticConventions.Operation && - (string)t.Value == CommandProcessorSpanOperation.Archive.ToSpanName()); - Assert.Contains(createActivity.TagObjects, - t => t.Key == BrighterSemanticConventions.MessagingOperationType && - (string)t.Value == CommandProcessorSpanOperation.Archive.ToSpanName()); + await Assert.That(createActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.ArchiveAge && Math.Abs(Convert.ToDouble(t.Value) - dispatchedSince.TotalMilliseconds) < TOLERANCE); + await Assert.That(createActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.Operation && (string)t.Value == CommandProcessorSpanOperation.Archive.ToSpanName()); + await Assert.That(createActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.MessagingOperationType && (string)t.Value == CommandProcessorSpanOperation.Archive.ToSpanName()); } else { - Assert.DoesNotContain(createActivity.TagObjects, t => t.Key == BrighterSemanticConventions.ArchiveAge); - Assert.DoesNotContain(createActivity.TagObjects, t => t.Key == BrighterSemanticConventions.Operation); - Assert.DoesNotContain(createActivity.TagObjects, t => t.Key == BrighterSemanticConventions.MessagingOperationName); + await Assert.That(createActivity.TagObjects).DoesNotContain(t => t.Key == BrighterSemanticConventions.ArchiveAge); + await Assert.That(createActivity.TagObjects).DoesNotContain(t => t.Key == BrighterSemanticConventions.Operation); + await Assert.That(createActivity.TagObjects).DoesNotContain(t => t.Key == BrighterSemanticConventions.MessagingOperationName); } - //check the tags for the outstanding messages span - Assert.True(osCheckActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.DispatchedMessages.ToSpanName())); - Assert.True(osCheckActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable)); - Assert.True(osCheckActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName())); - Assert.True(osCheckActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName)); - + await Assert.That(osCheckActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.DispatchedMessages.ToSpanName())).IsTrue(); + await Assert.That(osCheckActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable)).IsTrue(); + await Assert.That(osCheckActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName())).IsTrue(); + await Assert.That(osCheckActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName)).IsTrue(); //check the tags for the delete messages span - Assert.True(deleteActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.Delete.ToSpanName())); - Assert.True(deleteActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable)); - Assert.True(deleteActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName())); - Assert.True(deleteActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName)); - + await Assert.That(deleteActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.Delete.ToSpanName())).IsTrue(); + await Assert.That(deleteActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable)).IsTrue(); + await Assert.That(deleteActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName())).IsTrue(); + await Assert.That(deleteActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName)).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/Archive/When_archiving_from_the_outbox_async.cs b/tests/Paramore.Brighter.Core.Tests/Observability/Archive/When_archiving_from_the_outbox_async.cs index a815fe6353..c6e3f49e55 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/Archive/When_archiving_from_the_outbox_async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/Archive/When_archiving_from_the_outbox_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -13,15 +13,14 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; -// ReSharper disable ExplicitCallerInfoArgument +// ReSharper disable ExplicitCallerInfoArgument namespace Paramore.Brighter.Core.Tests.Observability.Archive; - +[NotInParallel("Observability")] public class AsyncExternalServiceBusArchiveObservabilityTests { private readonly List _exportedActivities = new(); - private readonly OutboxProducerMediator _bus; + private readonly OutboxProducerMediator _bus; private readonly Publication _publication; private readonly FakeTimeProvider _timeProvider; private readonly RoutingKey _routingKey = new("MyEvent"); @@ -29,22 +28,13 @@ public class AsyncExternalServiceBusArchiveObservabilityTests private readonly TracerProvider _traceProvider; private const double TOLERANCE = 0.000000001; private readonly BrighterTracer _tracer; - public AsyncExternalServiceBusArchiveObservabilityTests() { IAmABus internalBus = new InternalBus(); _timeProvider = new FakeTimeProvider(); _tracer = new BrighterTracer(_timeProvider); - var builder = Sdk.CreateTracerProviderBuilder(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); var type = new CloudEventsType("io.goparamore.brighter.myevent"); _publication = new Publication { @@ -53,124 +43,87 @@ public AsyncExternalServiceBusArchiveObservabilityTests() Topic = _routingKey, Type = type, }; - var producer = new InMemoryMessageProducer(internalBus, _publication); - - var producerRegistry = - new ProducerRegistry(new Dictionary { { new ProducerKey(_routingKey, type), producer } }); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), - null); + var producerRegistry = new ProducerRegistry(new Dictionary { { new ProducerKey(_routingKey, type), producer } }); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - - _outbox = new InMemoryOutbox(_timeProvider) { Tracer = _tracer }; - - _bus = new OutboxProducerMediator( - producerRegistry, - new ResiliencePipelineRegistry().AddBrighterDefault(), - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - _tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox, - timeProvider:_timeProvider); + _outbox = new InMemoryOutbox(_timeProvider) + { + Tracer = _tracer + }; + _bus = new OutboxProducerMediator(producerRegistry, new ResiliencePipelineRegistry().AddBrighterDefault(), messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), _tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox, timeProvider: _timeProvider); } - [Theory] - [InlineData(InstrumentationOptions.RequestInformation)] - [InlineData(InstrumentationOptions.None)] - [InlineData(InstrumentationOptions.All)] + [Test] + [Arguments(InstrumentationOptions.RequestInformation)] + [Arguments(InstrumentationOptions.None)] + [Arguments(InstrumentationOptions.All)] public async Task When_archiving_from_the_outbox(InstrumentationOptions instrumentationOptions) { + Activity.Current = null; var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - - var context = new RequestContext { Span = parentActivity }; - + var context = new RequestContext + { + Span = parentActivity + }; //add and clear message var myEvent = new MyEvent(); var myMessage = new MyEventMessageMapper().MapToMessage(myEvent, _publication); - await _bus.AddToOutboxAsync(myMessage, context); - await _bus.ClearOutboxAsync([myMessage.Id], context); - + await _bus.AddToOutboxAsync(myMessage, context); + await _bus.ClearOutboxAsync([myMessage.Id], context); //we should have an entry in the outbox - Assert.Equal(1, _outbox.EntryCount); - + await Assert.That(_outbox.EntryCount).IsEqualTo(1); //allow time to pass - _timeProvider.Advance(TimeSpan.FromSeconds(300)); - + _timeProvider.Advance(TimeSpan.FromSeconds(300)); //archive var dispatchedSince = TimeSpan.FromSeconds(100); var archiveProvider = new InMemoryArchiveProvider(); - - var archiver = new OutboxArchiver(_outbox, archiveProvider, tracer: _tracer, - instrumentationOptions: instrumentationOptions); + var archiver = new OutboxArchiver(_outbox, archiveProvider, tracer: _tracer, instrumentationOptions: instrumentationOptions); await archiver.ArchiveAsync(dispatchedSince, context); - - //should be no messages in the outbox - Assert.Equal(0, _outbox.EntryCount); - + //should be no messages in the outbox + await Assert.That(_outbox.EntryCount).IsEqualTo(0); parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //We should have exported matching activities - Assert.Equal(9, _exportedActivities.Count); - - Assert.Contains(_exportedActivities, a => a.Source.Name == "Paramore.Brighter"); - + await Assert.That(_exportedActivities.Count).IsEqualTo(9); + await Assert.That(_exportedActivities).Contains(a => a.Source.Name == "Paramore.Brighter"); //there should be an archive create span for the batch var createActivity = _exportedActivities.Single(a => a.DisplayName == $"{BrighterSemanticConventions.ArchiveMessages} {CommandProcessorSpanOperation.Archive.ToSpanName()}"); - Assert.NotNull(createActivity); - Assert.Equal(parentActivity?.Id, createActivity.ParentId); - + await Assert.That(createActivity).IsNotNull(); + await Assert.That(createActivity.ParentId).IsEqualTo(parentActivity?.Id); //check for outstanding messages span - var osCheckActivity = _exportedActivities.SingleOrDefault(a => - a.DisplayName == $"{BoxDbOperation.DispatchedMessages.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); - Assert.NotNull(osCheckActivity); - Assert.Equal(createActivity.Id, osCheckActivity?.ParentId); - + var osCheckActivity = _exportedActivities.SingleOrDefault(a => a.DisplayName == $"{BoxDbOperation.DispatchedMessages.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); + await Assert.That(osCheckActivity).IsNotNull(); + await Assert.That(osCheckActivity?.ParentId).IsEqualTo(createActivity.Id); //check for delete messages span - var deleteActivity = _exportedActivities.SingleOrDefault(a => - a.DisplayName == $"{BoxDbOperation.Delete.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); - Assert.NotNull(deleteActivity); - Assert.Equal(createActivity.Id, deleteActivity?.ParentId); - + var deleteActivity = _exportedActivities.SingleOrDefault(a => a.DisplayName == $"{BoxDbOperation.Delete.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); + await Assert.That(deleteActivity).IsNotNull(); + await Assert.That(deleteActivity?.ParentId).IsEqualTo(createActivity.Id); //check the tags for the create span - if(instrumentationOptions == InstrumentationOptions.None) - Assert.Empty(createActivity.Tags); - + if (instrumentationOptions == InstrumentationOptions.None) + await Assert.That(createActivity.Tags).IsEmpty(); if (instrumentationOptions.HasFlag(InstrumentationOptions.RequestInformation)) { - Assert.Contains(createActivity.TagObjects, - t => t.Key == BrighterSemanticConventions.ArchiveAge && - Math.Abs(Convert.ToDouble(t.Value) - dispatchedSince.TotalMilliseconds) < TOLERANCE); - Assert.Contains(createActivity.TagObjects, - t => t.Key == BrighterSemanticConventions.Operation && - (string)t.Value == CommandProcessorSpanOperation.Archive.ToSpanName()); - Assert.Contains(createActivity.TagObjects, - t => t.Key == BrighterSemanticConventions.MessagingOperationType && - (string)t.Value == CommandProcessorSpanOperation.Archive.ToSpanName()); + await Assert.That(createActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.ArchiveAge && Math.Abs(Convert.ToDouble(t.Value) - dispatchedSince.TotalMilliseconds) < TOLERANCE); + await Assert.That(createActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.Operation && (string)t.Value == CommandProcessorSpanOperation.Archive.ToSpanName()); + await Assert.That(createActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.MessagingOperationType && (string)t.Value == CommandProcessorSpanOperation.Archive.ToSpanName()); } else { - Assert.DoesNotContain(createActivity.TagObjects, t => t.Key == BrighterSemanticConventions.ArchiveAge); - Assert.DoesNotContain(createActivity.TagObjects, t => t.Key == BrighterSemanticConventions.Operation); - Assert.DoesNotContain(createActivity.TagObjects, t => t.Key == BrighterSemanticConventions.MessagingOperationName); + await Assert.That(createActivity.TagObjects).DoesNotContain(t => t.Key == BrighterSemanticConventions.ArchiveAge); + await Assert.That(createActivity.TagObjects).DoesNotContain(t => t.Key == BrighterSemanticConventions.Operation); + await Assert.That(createActivity.TagObjects).DoesNotContain(t => t.Key == BrighterSemanticConventions.MessagingOperationName); } //check the tags for the outstanding messages span - Assert.True(osCheckActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.DispatchedMessages.ToSpanName())); - Assert.True(osCheckActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable)); - Assert.True(osCheckActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName())); - Assert.True(osCheckActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName)); - + await Assert.That(osCheckActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.DispatchedMessages.ToSpanName())).IsTrue(); + await Assert.That(osCheckActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable)).IsTrue(); + await Assert.That(osCheckActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName())).IsTrue(); + await Assert.That(osCheckActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName)).IsTrue(); //check the tags for the delete messages span - Assert.True(deleteActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.Delete.ToSpanName())); - Assert.True(deleteActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable)); - Assert.True(deleteActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName())); - Assert.True(deleteActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName)); - + await Assert.That(deleteActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.Delete.ToSpanName())).IsTrue(); + await Assert.That(deleteActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable)).IsTrue(); + await Assert.That(deleteActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName())).IsTrue(); + await Assert.That(deleteActivity?.Tags.Any(t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName)).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_A_Message_A_Span_Is_Exported.cs b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_A_Message_A_Span_Is_Exported.cs index 1dca4f20df..81d88533c1 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_A_Message_A_Span_Is_Exported.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_A_Message_A_Span_Is_Exported.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -13,11 +13,9 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.CommandProcessor.Clear; - -[Collection("Observability")] +[NotInParallel("Observability")] public class CommandProcessorClearObservabilityTests { private readonly List _exportedActivities; @@ -25,265 +23,181 @@ public class CommandProcessorClearObservabilityTests private readonly InternalBus _internalBus = new(); private readonly FakeTimeProvider _timeProvider; private readonly RoutingKey _routingKey; - private readonly Uri publicationSource = new Uri("http://localhost"); private CloudEventsType? _publicationType; - public CommandProcessorClearObservabilityTests() { _routingKey = new RoutingKey("MyEvent"); - var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); _timeProvider = new FakeTimeProvider(); } - [Theory] - [InlineData(InstrumentationOptions.All)] - [InlineData(InstrumentationOptions.None)] - public void When_Clearing_A_Message_A_Span_Is_Exported(InstrumentationOptions options) + [Test] + [Arguments(InstrumentationOptions.All)] + [Arguments(InstrumentationOptions.None)] + public async Task When_Clearing_A_Message_A_Span_Is_Exported(InstrumentationOptions options) { //arrange var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - var @event = new MyEvent(); - var context = new RequestContext { Span = parentActivity }; + var context = new RequestContext + { + Span = parentActivity + }; var commandProcessor = CreateCommandProcessor(options); - //act var messageId = commandProcessor.DepositPost(@event, context); - //reset the parent span as deposit and clear are siblings - context.Span = parentActivity; commandProcessor.ClearOutbox([messageId], context); - parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //assert - Assert.Equal(8, _exportedActivities.Count); - Assert.Contains(_exportedActivities, a => a.Source.Name == "Paramore.Brighter"); - + await Assert.That(_exportedActivities.Count).IsEqualTo(8); + await Assert.That(_exportedActivities).Contains(a => a.Source.Name == "Paramore.Brighter"); //there should be a create span for the batch - var createActivity = _exportedActivities.Single(a => - a.DisplayName == $"{BrighterSemanticConventions.ClearMessages} {CommandProcessorSpanOperation.Create.ToSpanName()}"); - Assert.NotNull(createActivity); - Assert.Equal(parentActivity?.Id, createActivity.ParentId); - + var createActivity = _exportedActivities.Single(a => a.DisplayName == $"{BrighterSemanticConventions.ClearMessages} {CommandProcessorSpanOperation.Create.ToSpanName()}"); + await Assert.That(createActivity).IsNotNull(); + await Assert.That(createActivity.ParentId).IsEqualTo(parentActivity?.Id); var events = createActivity.Events.ToList(); - //retrieving the message batch should be an event var message = _internalBus.Stream(new RoutingKey("MyEvent")).Single(); var getEvent = events.Single(e => e.Name == BoxDbOperation.Get.ToSpanName()); - if (options == InstrumentationOptions.None) - Assert.Empty(getEvent.Tags); - + await Assert.That(getEvent.Tags).IsEmpty(); if (options.HasFlag(InstrumentationOptions.RequestBody)) - Assert.Contains(getEvent.Tags, a => a.Key == BrighterSemanticConventions.MessageBody && a.Value as string == message.Body.Value); + await Assert.That(getEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessageBody && a.Value as string == message.Body.Value); if (options.HasFlag(InstrumentationOptions.Brighter)) { - Assert.Contains(getEvent.Tags, a => a.Value != null && a.Key == BrighterSemanticConventions.OutboxSharedTransaction && (bool)a.Value == false); - Assert.Contains(getEvent.Tags, a => a.Key == BrighterSemanticConventions.OutboxType && a.Value as string == "sync"); + await Assert.That(getEvent.Tags).Contains(a => a.Value != null && a.Key == BrighterSemanticConventions.OutboxSharedTransaction && (bool)a.Value == false); + await Assert.That(getEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.OutboxType && a.Value as string == "sync"); } if (options.HasFlag(InstrumentationOptions.Messaging)) { - Assert.Contains(getEvent.Tags, a => a.Key == BrighterSemanticConventions.MessageId && a.Value as string == message.Id.Value); - Assert.Contains(getEvent.Tags, - a => a.Key == BrighterSemanticConventions.MessagingDestination && a.Value?.ToString() == message.Header.Topic.Value); - Assert.Contains(getEvent.Tags, - a => a is { Value: not null, Key: BrighterSemanticConventions.MessageBodySize } && (int)a.Value == message.Body.Bytes.Length); - Assert.Contains(getEvent.Tags, - a => a.Key == BrighterSemanticConventions.MessageType && a.Value as string == message.Header.MessageType.ToString()); - Assert.Contains(getEvent.Tags, - a => a.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && a.Value as string == message.Header.PartitionKey.Value); + await Assert.That(getEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessageId && a.Value as string == message.Id.Value); + await Assert.That(getEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessagingDestination && a.Value?.ToString() == message.Header.Topic.Value); + await Assert.That(getEvent.Tags).Contains(a => a is { Value: not null, Key: BrighterSemanticConventions.MessageBodySize } && (int)a.Value == message.Body.Bytes.Length); + await Assert.That(getEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessageType && a.Value as string == message.Header.MessageType.ToString()); + await Assert.That(getEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && a.Value as string == message.Header.PartitionKey.Value); } //there should be a clear span for each message id - var clearActivity = _exportedActivities.Single(a => - a.DisplayName == $"{BrighterSemanticConventions.ClearMessages} {CommandProcessorSpanOperation.Clear.ToSpanName()}"); - Assert.NotNull(clearActivity); + var clearActivity = _exportedActivities.Single(a => a.DisplayName == $"{BrighterSemanticConventions.ClearMessages} {CommandProcessorSpanOperation.Clear.ToSpanName()}"); + await Assert.That(clearActivity).IsNotNull(); if (options == InstrumentationOptions.None) - Assert.Empty(createActivity.Tags); + await Assert.That(createActivity.Tags).IsEmpty(); if (options.HasFlag(InstrumentationOptions.RequestInformation)) { - Assert.Contains(clearActivity.Tags, t => t is { Key: BrighterSemanticConventions.Operation, Value: "clear" }); - Assert.Contains(clearActivity.Tags, t => t is { Key: BrighterSemanticConventions.MessagingOperationType, Value: "clear" }); - Assert.Contains(clearActivity.Tags, t => t.Key == BrighterSemanticConventions.MessageId && t.Value == messageId); + await Assert.That(clearActivity.Tags).Contains(t => t is { Key: BrighterSemanticConventions.Operation, Value: "clear" }); + await Assert.That(clearActivity.Tags).Contains(t => t is { Key: BrighterSemanticConventions.MessagingOperationType, Value: "clear" }); + await Assert.That(clearActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessageId && t.Value == messageId); } else { - Assert.DoesNotContain(clearActivity.Tags, t => t.Key == BrighterSemanticConventions.Operation); - Assert.DoesNotContain(clearActivity.Tags, t => t.Key == BrighterSemanticConventions.MessagingOperationType); - Assert.DoesNotContain(clearActivity.Tags, t => t.Key == BrighterSemanticConventions.MessageId); + await Assert.That(clearActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.Operation); + await Assert.That(clearActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.MessagingOperationType); + await Assert.That(clearActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.MessageId); } if (options.HasFlag(InstrumentationOptions.DatabaseInformation)) { //there should be a span in the Db for retrieving the message - var outBoxActivity = _exportedActivities.Single(a => - a.DisplayName == $"{BoxDbOperation.Get.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); - Assert.Contains(outBoxActivity.Tags, t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.Get.ToSpanName()); - Assert.Contains(outBoxActivity.Tags, t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable); - Assert.Contains(outBoxActivity.Tags, t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName()); - Assert.Contains(outBoxActivity.Tags, t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName); + var outBoxActivity = _exportedActivities.Single(a => a.DisplayName == $"{BoxDbOperation.Get.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); + await Assert.That(outBoxActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.Get.ToSpanName()); + await Assert.That(outBoxActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable); + await Assert.That(outBoxActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName()); + await Assert.That(outBoxActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName); } //there should be a span for publishing the message via the producer var producerActivity = _exportedActivities.Single(a => a.DisplayName == $"{"MyEvent"} {CommandProcessorSpanOperation.Publish.ToSpanName()}"); - Assert.Equal(clearActivity.Id, producerActivity.ParentId); - Assert.Equal(ActivityKind.Producer, producerActivity.Kind); - + await Assert.That(producerActivity.ParentId).IsEqualTo(clearActivity.Id); + await Assert.That(producerActivity.Kind).IsEqualTo(ActivityKind.Producer); if (options == InstrumentationOptions.None) - Assert.Empty(producerActivity.Tags); - + await Assert.That(producerActivity.Tags).IsEmpty(); if (options.HasFlag(InstrumentationOptions.RequestBody)) - Assert.Contains(producerActivity.TagObjects, t => t.Key == BrighterSemanticConventions.MessageBody && t.Value as string == message.Body.Value); - + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.MessageBody && t.Value as string == message.Body.Value); if (options.HasFlag(InstrumentationOptions.Messaging)) { - Assert.Contains(producerActivity.TagObjects, t => t.Key == BrighterSemanticConventions.MessageId && t.Value as string == message.Id.Value); - Assert.Contains(producerActivity.TagObjects, - t => t.Key == BrighterSemanticConventions.MessageType && t.Value as string == message.Header.MessageType.ToString()); - Assert.Contains(producerActivity.TagObjects, - t => t is { Value: not null, Key: BrighterSemanticConventions.MessagingDestination } && t.Value.ToString() == "MyEvent"); - Assert.Contains(producerActivity.TagObjects, - t => t.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && t.Value as string == message.Header.PartitionKey.Value); - Assert.Contains(producerActivity.TagObjects, - t => t is { Value: not null, Key: BrighterSemanticConventions.MessageBodySize } && (int)t.Value == message.Body.Bytes.Length); - Assert.Contains(producerActivity.TagObjects, - t => t.Key == BrighterSemanticConventions.ConversationId && t.Value as string == message.Header.CorrelationId.Value); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.MessageId && t.Value as string == message.Id.Value); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.MessageType && t.Value as string == message.Header.MessageType.ToString()); + await Assert.That(producerActivity.TagObjects).Contains(t => t is { Value: not null, Key: BrighterSemanticConventions.MessagingDestination } && t.Value.ToString() == "MyEvent"); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && t.Value as string == message.Header.PartitionKey.Value); + await Assert.That(producerActivity.TagObjects).Contains(t => t is { Value: not null, Key: BrighterSemanticConventions.MessageBodySize } && (int)t.Value == message.Body.Bytes.Length); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.ConversationId && t.Value as string == message.Header.CorrelationId.Value); } if (options.HasFlag(InstrumentationOptions.RequestInformation)) { - Assert.Contains(producerActivity.TagObjects, - t => t.Key == BrighterSemanticConventions.MessagingOperationType && - t.Value as string == CommandProcessorSpanOperation.Publish.ToSpanName()); - Assert.Contains(producerActivity.TagObjects, t => t.Key == BrighterSemanticConventions.CeMessageId && (string)t.Value == message.Id.Value); - Assert.Contains(producerActivity.TagObjects, t => t.Key == BrighterSemanticConventions.CeSource && (Uri)t.Value == publicationSource); - Assert.Contains(producerActivity.TagObjects, t => t.Key == BrighterSemanticConventions.CeVersion && (string)t.Value == "1.0"); - Assert.Contains(producerActivity.TagObjects, t => t.Key == BrighterSemanticConventions.CeSubject && (string)t.Value == null); - Assert.Contains(producerActivity.TagObjects, t => t.Key == BrighterSemanticConventions.CeType && (string)t.Value == _publicationType); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.MessagingOperationType && t.Value as string == CommandProcessorSpanOperation.Publish.ToSpanName()); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.CeMessageId && (string)t.Value == message.Id.Value); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.CeSource && (Uri)t.Value == publicationSource); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.CeVersion && (string)t.Value == "1.0"); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.CeSubject && (string)t.Value == null); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.CeType && (string)t.Value == _publicationType); } //there should be an event in the producer for producing the message var produceEvent = producerActivity.Events.Single(e => e.Name == $"{"MyEvent"} {CommandProcessorSpanOperation.Publish.ToSpanName()}"); - if (options == InstrumentationOptions.None) - Assert.Empty(produceEvent.Tags); - + await Assert.That(produceEvent.Tags).IsEmpty(); if (options.HasFlag(InstrumentationOptions.RequestBody)) - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.MessageBody && (string)t.Value == message.Body.Value); - + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessageBody && (string)t.Value == message.Body.Value); if (options.HasFlag(InstrumentationOptions.Messaging)) { - Assert.Contains(produceEvent.Tags, - t => t.Key == BrighterSemanticConventions.MessagingOperationType && (string)t.Value == CommandProcessorSpanOperation.Publish.ToSpanName()); - Assert.Contains(produceEvent.Tags, - t => t.Key == BrighterSemanticConventions.MessagingSystem && (string)t.Value == MessagingSystem.InternalBus.ToMessagingSystemName()); - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.MessagingDestination && (RoutingKey)t.Value == "MyEvent"); - Assert.Contains(produceEvent.Tags, - t => t.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && (string)t.Value == message.Header.PartitionKey.Value); - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.MessageId && (string)t.Value == message.Id.Value); - Assert.Contains(produceEvent.Tags, - t => t.Key == BrighterSemanticConventions.MessageType && (string)t.Value == message.Header.MessageType.ToString()); - Assert.Contains(produceEvent.Tags, - t => t is { Value: not null, Key: BrighterSemanticConventions.MessageBodySize } && (int)t.Value == message.Body.Bytes.Length); - Assert.Contains(produceEvent.Tags, - t => t.Key == BrighterSemanticConventions.ConversationId && (string)t.Value == message.Header.CorrelationId.Value); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessagingOperationType && (string)t.Value == CommandProcessorSpanOperation.Publish.ToSpanName()); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessagingSystem && (string)t.Value == MessagingSystem.InternalBus.ToMessagingSystemName()); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessagingDestination && (RoutingKey)t.Value == "MyEvent"); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && (string)t.Value == message.Header.PartitionKey.Value); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessageId && (string)t.Value == message.Id.Value); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessageType && (string)t.Value == message.Header.MessageType.ToString()); + await Assert.That(produceEvent.Tags).Contains(t => t is { Value: not null, Key: BrighterSemanticConventions.MessageBodySize } && (int)t.Value == message.Body.Bytes.Length); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.ConversationId && (string)t.Value == message.Header.CorrelationId.Value); } if (options.HasFlag(InstrumentationOptions.RequestInformation)) { - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.CeMessageId && (string)t.Value == message.Id.Value); - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.CeSource && (Uri)t.Value == publicationSource); - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.CeVersion && (string)t.Value == "1.0"); - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.CeSubject && (string)t.Value == null); - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.CeType && (string)t.Value == _publicationType); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.CeMessageId && (string)t.Value == message.Id.Value); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.CeSource && (Uri)t.Value == publicationSource); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.CeVersion && (string)t.Value == "1.0"); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.CeSubject && (string)t.Value == null); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.CeType && (string)t.Value == _publicationType); } if (options.HasFlag(InstrumentationOptions.DatabaseInformation)) { //There should be a span event to mark as dispatched - var markAsDispatchedActivity = _exportedActivities.Single(a => - a.DisplayName == $"{BoxDbOperation.MarkDispatched.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); - Assert.Contains(markAsDispatchedActivity.Tags, - t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.MarkDispatched.ToSpanName()); - Assert.Contains(markAsDispatchedActivity.Tags, t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable); - Assert.Contains(markAsDispatchedActivity.Tags, t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName()); - Assert.Contains(markAsDispatchedActivity.Tags, t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName); + var markAsDispatchedActivity = _exportedActivities.Single(a => a.DisplayName == $"{BoxDbOperation.MarkDispatched.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); + await Assert.That(markAsDispatchedActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.MarkDispatched.ToSpanName()); + await Assert.That(markAsDispatchedActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable); + await Assert.That(markAsDispatchedActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName()); + await Assert.That(markAsDispatchedActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName); } } private Brighter.CommandProcessor CreateCommandProcessor(InstrumentationOptions instrumentationOptions) { _publicationType = new CloudEventsType("io.goparamore.brighter.myevent"); - - var messageProducer = new InMemoryMessageProducer( - _internalBus, - new Publication - { - Source = publicationSource, RequestType = typeof(MyEvent), Topic = _routingKey, Type = _publicationType, - }, - instrumentationOptions - ); - - + var messageProducer = new InMemoryMessageProducer(_internalBus, new Publication { Source = publicationSource, RequestType = typeof(MyEvent), Topic = _routingKey, Type = _publicationType, }, instrumentationOptions); var registry = new SubscriberRegistry(); - var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); - - var retryPolicy = Policy - .Handle() - .Retry(); - - var policyRegistry = new PolicyRegistry { { Brighter.CommandProcessor.RETRYPOLICY, retryPolicy } }; - + var retryPolicy = Policy.Handle().Retry(); + var policyRegistry = new PolicyRegistry + { + { + Brighter.CommandProcessor.RETRYPOLICY, + retryPolicy + } + }; var tracer = new BrighterTracer(_timeProvider); InMemoryOutbox outbox = new(_timeProvider); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), - null); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - var producerRegistry = new ProducerRegistry(new Dictionary { { new ProducerKey(_routingKey, _publicationType), messageProducer } }); - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - new ResiliencePipelineRegistry().AddBrighterDefault(), - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - outbox, - maxOutStandingMessages: -1, - instrumentationOptions: instrumentationOptions - ); - - return new Brighter.CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - policyRegistry, - new ResiliencePipelineRegistry(), - bus, - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: instrumentationOptions - ); + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, new ResiliencePipelineRegistry().AddBrighterDefault(), messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), outbox, maxOutStandingMessages: -1, instrumentationOptions: instrumentationOptions); + return new Brighter.CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), bus, new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: instrumentationOptions); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_A_Message_A_Span_Is_Exported_Async.cs b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_A_Message_A_Span_Is_Exported_Async.cs index b1a86083b0..a6d8952f6a 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_A_Message_A_Span_Is_Exported_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_A_Message_A_Span_Is_Exported_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -14,12 +14,10 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.CommandProcessor.Clear; - -[Collection("Observability")] -public class AsyncCommandProcessorClearObservabilityTests +[NotInParallel("Observability")] +public class AsyncCommandProcessorClearObservabilityTests { private readonly List _exportedActivities; private readonly TracerProvider _traceProvider; @@ -27,180 +25,122 @@ public class AsyncCommandProcessorClearObservabilityTests private readonly RoutingKey _topic = new("MyCommand"); private readonly InMemoryMessageProducer _messageProducer; private readonly InternalBus _internalBus = new(); - public AsyncCommandProcessorClearObservabilityTests() { var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); var registry = new SubscriberRegistry(); - - var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); - - var retryPolicy = Policy - .Handle() - .RetryAsync(); - - var policyRegistry = new PolicyRegistry {{Brighter.CommandProcessor.RETRYPOLICYASYNC, retryPolicy}}; - - var timeProvider = new FakeTimeProvider(); + var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); + var retryPolicy = Policy.Handle().RetryAsync(); + var policyRegistry = new PolicyRegistry + { + { + Brighter.CommandProcessor.RETRYPOLICYASYNC, + retryPolicy + } + }; + var timeProvider = new FakeTimeProvider(); var tracer = new BrighterTracer(timeProvider); - InMemoryOutbox outbox = new(timeProvider){Tracer = tracer}; - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); + InMemoryOutbox outbox = new(timeProvider) + { + Tracer = tracer + }; + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - var type = new CloudEventsType("io.goparamore.brighter.myevent"); - _messageProducer = new InMemoryMessageProducer(_internalBus, - new Publication - { - Source = new Uri("http://localhost"), - RequestType = typeof(MyEvent), - Topic = _topic, - Type = type, - }); - - var producerRegistry = new ProducerRegistry(new Dictionary - { - {new ProducerKey(_topic, type), _messageProducer} - }); - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - new ResiliencePipelineRegistry().AddBrighterDefault(), - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - outbox, - maxOutStandingMessages: -1 - ); - - _commandProcessor = new Brighter.CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - policyRegistry, - new ResiliencePipelineRegistry(), - bus, - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: InstrumentationOptions.All - ); + _messageProducer = new InMemoryMessageProducer(_internalBus, new Publication { Source = new Uri("http://localhost"), RequestType = typeof(MyEvent), Topic = _topic, Type = type, }); + var producerRegistry = new ProducerRegistry(new Dictionary { { new ProducerKey(_topic, type), _messageProducer } }); + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, new ResiliencePipelineRegistry().AddBrighterDefault(), messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), outbox, maxOutStandingMessages: -1); + _commandProcessor = new Brighter.CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), bus, new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: InstrumentationOptions.All); } - - [Fact] + + [Test] public async Task When_Clearing_A_Message_A_Span_Is_Exported() { //arrange var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - var @event = new MyEvent(); - var context = new RequestContext { Span = parentActivity }; - + var context = new RequestContext + { + Span = parentActivity + }; //act var messageId = await _commandProcessor.DepositPostAsync(@event, context); - //reset the parent span as deposit and clear are siblings - context.Span = parentActivity; await _commandProcessor.ClearOutboxAsync([messageId], context); - parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //assert - Assert.Equal(8, _exportedActivities.Count); - Assert.Contains(_exportedActivities, a => a.Source.Name == "Paramore.Brighter"); - + await Assert.That(_exportedActivities.Count).IsEqualTo(8); + await Assert.That(_exportedActivities).Contains(a => a.Source.Name == "Paramore.Brighter"); //there should be a create span for the batch var createActivity = _exportedActivities.Single(a => a.DisplayName == $"{BrighterSemanticConventions.ClearMessages} {CommandProcessorSpanOperation.Create.ToSpanName()}"); - Assert.NotNull(createActivity); - Assert.Equal(parentActivity?.Id, createActivity.ParentId); - Assert.Contains(createActivity.Tags, t => t is { Key: BrighterSemanticConventions.Operation, Value: "clear" }); - + await Assert.That(createActivity).IsNotNull(); + await Assert.That(createActivity.ParentId).IsEqualTo(parentActivity?.Id); + await Assert.That(createActivity.Tags).Contains(t => t is { Key: BrighterSemanticConventions.Operation, Value: "clear" }); var events = createActivity.Events.ToList(); - //retrieving the message should be an event on the batch var message = _internalBus.Stream(new RoutingKey(_topic)).Single(); var getEvent = events.Single(e => e.Name == BoxDbOperation.Get.ToSpanName()); - Assert.Contains(getEvent.Tags, a => a.Value != null && a.Key == BrighterSemanticConventions.OutboxSharedTransaction && (bool)a.Value == false); - Assert.Contains(getEvent.Tags, a => a.Key == BrighterSemanticConventions.OutboxType && a.Value as string == "async"); - Assert.Contains(getEvent.Tags, a => a.Key == BrighterSemanticConventions.MessageId && a.Value as string == message.Id.Value); - Assert.Contains(getEvent.Tags, a => a.Key == BrighterSemanticConventions.MessagingDestination && a.Value?.ToString() == message.Header.Topic.ToString()); - Assert.Contains(getEvent.Tags, a => a is { Value: not null, Key: BrighterSemanticConventions.MessageBodySize } && (int)a.Value == message.Body.Bytes.Length); - Assert.Contains(getEvent.Tags, a => a.Key == BrighterSemanticConventions.MessageBody && a.Value as string == message.Body.Value); - Assert.Contains(getEvent.Tags, a => a.Key == BrighterSemanticConventions.MessageType && a.Value as string == message.Header.MessageType.ToString()); - Assert.Contains(getEvent.Tags, a => a.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && a.Value as string == message.Header.PartitionKey.Value); - + await Assert.That(getEvent.Tags).Contains(a => a.Value != null && a.Key == BrighterSemanticConventions.OutboxSharedTransaction && (bool)a.Value == false); + await Assert.That(getEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.OutboxType && a.Value as string == "async"); + await Assert.That(getEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessageId && a.Value as string == message.Id.Value); + await Assert.That(getEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessagingDestination && a.Value?.ToString() == message.Header.Topic.ToString()); + await Assert.That(getEvent.Tags).Contains(a => a is { Value: not null, Key: BrighterSemanticConventions.MessageBodySize } && (int)a.Value == message.Body.Bytes.Length); + await Assert.That(getEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessageBody && a.Value as string == message.Body.Value); + await Assert.That(getEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessageType && a.Value as string == message.Header.MessageType.ToString()); + await Assert.That(getEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && a.Value as string == message.Header.PartitionKey.Value); //there should be a clear span for each message id var clearActivity = _exportedActivities.Single(a => a.DisplayName == $"{BrighterSemanticConventions.ClearMessages} {CommandProcessorSpanOperation.Clear.ToSpanName()}"); - Assert.NotNull(clearActivity); - Assert.Contains(clearActivity.Tags, t => t is { Key: BrighterSemanticConventions.Operation, Value: "clear" }); - Assert.Contains(clearActivity.Tags, t => t.Key == BrighterSemanticConventions.MessageId && t.Value == messageId.Value); - + await Assert.That(clearActivity).IsNotNull(); + await Assert.That(clearActivity.Tags).Contains(t => t is { Key: BrighterSemanticConventions.Operation, Value: "clear" }); + await Assert.That(clearActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessageId && t.Value == messageId.Value); //there should be a span in the Db for retrieving the message var outBoxActivity = _exportedActivities.Single(a => a.DisplayName == $"{BoxDbOperation.Get.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); - Assert.Contains(outBoxActivity.Tags, t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.Get.ToSpanName()); - Assert.Contains(outBoxActivity.Tags, t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable); - Assert.Contains(outBoxActivity.Tags, t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName()); - Assert.Contains(outBoxActivity.Tags, t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName); - + await Assert.That(outBoxActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.Get.ToSpanName()); + await Assert.That(outBoxActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable); + await Assert.That(outBoxActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName()); + await Assert.That(outBoxActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName); //there should be a span for publishing the message via the producer var producerActivity = _exportedActivities.Single(a => a.DisplayName == $"{_topic} {CommandProcessorSpanOperation.Publish.ToSpanName()}"); - Assert.Equal(clearActivity.Id, producerActivity.ParentId); - Assert.Equal(ActivityKind.Producer, producerActivity.Kind); - - Assert.Contains(producerActivity.TagObjects, t => t.Key == BrighterSemanticConventions.MessagingOperationType && t.Value as string == CommandProcessorSpanOperation.Publish.ToSpanName()); - Assert.Contains(producerActivity.TagObjects, t => t.Key == BrighterSemanticConventions.MessageId && t.Value as string == message.Id.Value); - Assert.Contains(producerActivity.TagObjects, t => t.Key == BrighterSemanticConventions.MessageType && t.Value as string == message.Header.MessageType.ToString()); - Assert.Contains(producerActivity.TagObjects, t => t is { Value: not null, Key: BrighterSemanticConventions.MessagingDestination } && t.Value.ToString() == _topic.Value); - Assert.Contains(producerActivity.TagObjects, t => t.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && t.Value as string == message.Header.PartitionKey.Value); - Assert.Contains(producerActivity.TagObjects, t => t is { Value: not null, Key: BrighterSemanticConventions.MessageBodySize } && (int)t.Value == message.Body.Bytes.Length); - Assert.Contains(producerActivity.TagObjects, t => t.Key == BrighterSemanticConventions.MessageBody && t.Value as string == message.Body.Value); - Assert.Contains(producerActivity.TagObjects, t => t.Key == BrighterSemanticConventions.ConversationId && t.Value as string == message.Header.CorrelationId.Value); - - Assert.Contains(producerActivity.TagObjects, t => t.Key == BrighterSemanticConventions.CeMessageId && t.Value as string == message.Id.Value); - Assert.Contains(producerActivity.TagObjects, t => t.Key == BrighterSemanticConventions.CeSource && t.Value as Uri == _messageProducer.Publication.Source); - Assert.Contains(producerActivity.TagObjects, t => t.Key == BrighterSemanticConventions.CeVersion && t.Value as string == "1.0"); - Assert.Contains(producerActivity.TagObjects, t => t.Key == BrighterSemanticConventions.CeSubject && t.Value as string == _messageProducer.Publication.Subject); - Assert.Contains(producerActivity.TagObjects, t => t.Key == BrighterSemanticConventions.CeType && t.Value as string == _messageProducer.Publication.Type); - + await Assert.That(producerActivity.ParentId).IsEqualTo(clearActivity.Id); + await Assert.That(producerActivity.Kind).IsEqualTo(ActivityKind.Producer); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.MessagingOperationType && t.Value as string == CommandProcessorSpanOperation.Publish.ToSpanName()); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.MessageId && t.Value as string == message.Id.Value); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.MessageType && t.Value as string == message.Header.MessageType.ToString()); + await Assert.That(producerActivity.TagObjects).Contains(t => t is { Value: not null, Key: BrighterSemanticConventions.MessagingDestination } && t.Value.ToString() == _topic.Value); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && t.Value as string == message.Header.PartitionKey.Value); + await Assert.That(producerActivity.TagObjects).Contains(t => t is { Value: not null, Key: BrighterSemanticConventions.MessageBodySize } && (int)t.Value == message.Body.Bytes.Length); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.MessageBody && t.Value as string == message.Body.Value); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.ConversationId && t.Value as string == message.Header.CorrelationId.Value); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.CeMessageId && t.Value as string == message.Id.Value); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.CeSource && t.Value as Uri == _messageProducer.Publication.Source); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.CeVersion && t.Value as string == "1.0"); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.CeSubject && t.Value as string == _messageProducer.Publication.Subject); + await Assert.That(producerActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.CeType && t.Value as string == _messageProducer.Publication.Type); //there should be an event in the producer for producing the message - var produceEvent = producerActivity.Events.Single(e => e.Name ==$"{_topic} {CommandProcessorSpanOperation.Publish.ToSpanName()}"); - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.MessagingOperationType && t.Value as string == CommandProcessorSpanOperation.Publish.ToSpanName()); - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.MessagingSystem && t.Value as string == MessagingSystem.InternalBus.ToMessagingSystemName()); - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.MessagingDestination && t.Value?.ToString() == _topic.Value); - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && t.Value as string == message.Header.PartitionKey.Value); - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.MessageId && t.Value as string == message.Id.Value); - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.MessageType && t.Value as string == message.Header.MessageType.ToString()); - Assert.Contains(produceEvent.Tags, t => t is { Value: not null, Key: BrighterSemanticConventions.MessageBodySize } && (int)t.Value == message.Body.Bytes.Length); - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.MessageBody && t.Value as string == message.Body.Value); - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.ConversationId && t.Value as string == message.Header.CorrelationId.Value); - - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.CeMessageId && t.Value as string == message.Id.Value); - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.CeSource && t.Value as Uri == _messageProducer.Publication.Source); - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.CeVersion && t.Value as string == "1.0"); - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.CeSubject && t.Value as string == _messageProducer.Publication.Subject); - Assert.Contains(produceEvent.Tags, t => t.Key == BrighterSemanticConventions.CeType && t.Value as string == _messageProducer.Publication.Type); - + var produceEvent = producerActivity.Events.Single(e => e.Name == $"{_topic} {CommandProcessorSpanOperation.Publish.ToSpanName()}"); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessagingOperationType && t.Value as string == CommandProcessorSpanOperation.Publish.ToSpanName()); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessagingSystem && t.Value as string == MessagingSystem.InternalBus.ToMessagingSystemName()); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessagingDestination && t.Value?.ToString() == _topic.Value); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && t.Value as string == message.Header.PartitionKey.Value); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessageId && t.Value as string == message.Id.Value); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessageType && t.Value as string == message.Header.MessageType.ToString()); + await Assert.That(produceEvent.Tags).Contains(t => t is { Value: not null, Key: BrighterSemanticConventions.MessageBodySize } && (int)t.Value == message.Body.Bytes.Length); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessageBody && t.Value as string == message.Body.Value); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.ConversationId && t.Value as string == message.Header.CorrelationId.Value); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.CeMessageId && t.Value as string == message.Id.Value); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.CeSource && t.Value as Uri == _messageProducer.Publication.Source); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.CeVersion && t.Value as string == "1.0"); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.CeSubject && t.Value as string == _messageProducer.Publication.Subject); + await Assert.That(produceEvent.Tags).Contains(t => t.Key == BrighterSemanticConventions.CeType && t.Value as string == _messageProducer.Publication.Type); //There should be a span event to mark as dispatched var markAsDispatchedActivity = _exportedActivities.Single(a => a.DisplayName == $"{BoxDbOperation.MarkDispatched.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); - Assert.Contains(markAsDispatchedActivity.Tags, t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.MarkDispatched.ToSpanName()); - Assert.Contains(markAsDispatchedActivity.Tags, t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable); - Assert.Contains(markAsDispatchedActivity.Tags, t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName()); - Assert.Contains(markAsDispatchedActivity.Tags, t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName); - + await Assert.That(markAsDispatchedActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.MarkDispatched.ToSpanName()); + await Assert.That(markAsDispatchedActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable); + await Assert.That(markAsDispatchedActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName()); + await Assert.That(markAsDispatchedActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_A_Message_Should_Propogate_Context.cs b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_A_Message_Should_Propogate_Context.cs index 1bebe8b107..1bfce59eb8 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_A_Message_Should_Propogate_Context.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_A_Message_Should_Propogate_Context.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -14,12 +14,11 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; using Baggage = OpenTelemetry.Baggage; namespace Paramore.Brighter.Core.Tests.Observability.CommandProcessor.Clear; - -public class MessageDispatchPropogateContextTests +[NotInParallel("Observability")] +public class MessageDispatchPropogateContextTests { private readonly List _exportedActivities = []; private readonly TracerProvider _traceProvider; @@ -27,113 +26,62 @@ public class MessageDispatchPropogateContextTests private readonly Brighter.CommandProcessor _commandProcessor; private readonly RoutingKey _routingKey; private readonly OutboxProducerMediator _mediator; - public MessageDispatchPropogateContextTests() { _routingKey = new RoutingKey("MyEvent"); - var builder = Sdk.CreateTracerProviderBuilder(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); var registry = new SubscriberRegistry(); - - var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); - - var retryPolicy = Policy - .Handle() - .Retry(); - - var policyRegistry = new PolicyRegistry {{Brighter.CommandProcessor.RETRYPOLICY, retryPolicy}}; - - var timeProvider = new FakeTimeProvider(); - var tracer = new BrighterTracer(timeProvider); - InMemoryOutbox outbox = new(timeProvider){Tracer = tracer}; - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), - null); - messageMapperRegistry.Register(); - - var cloudEventsType = new CloudEventsType("io.goparamore.brighter.myevent"); - InMemoryMessageProducer messageProducer = new(_internalBus, - new Publication + var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); + var retryPolicy = Policy.Handle().Retry(); + var policyRegistry = new PolicyRegistry + { { - Source = new Uri("http://localhost"), - RequestType = typeof(MyEvent), - Topic = _routingKey, - Type = cloudEventsType, + Brighter.CommandProcessor.RETRYPOLICY, + retryPolicy } - ); - - var producerRegistry = new ProducerRegistry(new Dictionary + }; + var timeProvider = new FakeTimeProvider(); + var tracer = new BrighterTracer(timeProvider); + InMemoryOutbox outbox = new(timeProvider) { - {new ProducerKey(_routingKey, cloudEventsType), messageProducer} - }); - - _mediator = new OutboxProducerMediator( - producerRegistry, - new ResiliencePipelineRegistry().AddBrighterDefault(), - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - outbox, - maxOutStandingMessages: -1 - ); - - _commandProcessor = new Brighter.CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - policyRegistry, - new ResiliencePipelineRegistry(), - _mediator, - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: InstrumentationOptions.All - ); - + Tracer = tracer + }; + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), null); + messageMapperRegistry.Register(); + var cloudEventsType = new CloudEventsType("io.goparamore.brighter.myevent"); + InMemoryMessageProducer messageProducer = new(_internalBus, new Publication { Source = new Uri("http://localhost"), RequestType = typeof(MyEvent), Topic = _routingKey, Type = cloudEventsType, }); + var producerRegistry = new ProducerRegistry(new Dictionary { { new ProducerKey(_routingKey, cloudEventsType), messageProducer } }); + _mediator = new OutboxProducerMediator(producerRegistry, new ResiliencePipelineRegistry().AddBrighterDefault(), messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), outbox, maxOutStandingMessages: -1); + _commandProcessor = new Brighter.CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), _mediator, new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: InstrumentationOptions.All); } - [Fact] + [Test] public async Task When_Producing_A_Message_Should_Propagate_Context() { //arrange var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("MessageDispatchPropogateContextTests"); - var @event = new MyEvent(); - var context = new RequestContext { Span = parentActivity }; - + var context = new RequestContext + { + Span = parentActivity + }; //act var messageId = _commandProcessor.DepositPost(@event, context); - //reset the parent span as deposit and clear are siblings Baggage.SetBaggage("key", "value"); Baggage.SetBaggage("key2", "value2"); - context.Span = parentActivity; _commandProcessor.ClearOutbox([messageId], context); - - await Task.Delay(3000); //allow bulk clear to run -- can make test fragile - + await Task.Delay(3000); //allow bulk clear to run -- can make test fragile parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //assert var messages = _internalBus.Stream(_routingKey); var message = messages.FirstOrDefault(m => m.Id == messageId); - Assert.NotNull(message); - Assert.NotNull(message.Header.TraceParent); - + await Assert.That(message).IsNotNull(); + await Assert.That(message.Header.TraceParent).IsNotNull(); //? What is tracestate - Assert.Equal("key=value,key2=value2", message.Header.Baggage.ToString()); + await Assert.That(message.Header.Baggage.ToString()).IsEqualTo("key=value,key2=value2"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_A_Message_Should_Propogate_Context_Asyn.cs b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_A_Message_Should_Propogate_Context_Asyn.cs index 5ec264fe71..1fc4c188fb 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_A_Message_Should_Propogate_Context_Asyn.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_A_Message_Should_Propogate_Context_Asyn.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -14,12 +14,11 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; using Baggage = OpenTelemetry.Baggage; namespace Paramore.Brighter.Core.Tests.Observability.CommandProcessor.Clear; - -public class AsyncMessageDispatchPropogateContextTests +[NotInParallel("Observability")] +public class AsyncMessageDispatchPropogateContextTests { private readonly List _exportedActivities = []; private readonly TracerProvider _traceProvider; @@ -27,82 +26,37 @@ public class AsyncMessageDispatchPropogateContextTests private readonly Brighter.CommandProcessor _commandProcessor; private readonly RoutingKey _routingKey; private readonly OutboxProducerMediator _mediator; - public AsyncMessageDispatchPropogateContextTests() { _routingKey = new RoutingKey("MyEvent"); - var builder = Sdk.CreateTracerProviderBuilder(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); var registry = new SubscriberRegistry(); - - var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); - - var retryPolicy = Policy - .Handle() - .RetryAsync(); - - var policyRegistry = new PolicyRegistry {{Brighter.CommandProcessor.RETRYPOLICYASYNC, retryPolicy}}; - - var timeProvider = new FakeTimeProvider(); - var tracer = new BrighterTracer(timeProvider); - InMemoryOutbox outbox = new(timeProvider){Tracer = tracer}; - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); - messageMapperRegistry.RegisterAsync(); - - var type = new CloudEventsType("io.goparamore.brighter.myevent"); - InMemoryMessageProducer messageProducer = new(_internalBus, - new Publication + var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); + var retryPolicy = Policy.Handle().RetryAsync(); + var policyRegistry = new PolicyRegistry + { { - Source = new Uri("http://localhost"), - RequestType = typeof(MyEvent), - Topic = _routingKey, - Type = type, + Brighter.CommandProcessor.RETRYPOLICYASYNC, + retryPolicy } - ); - - var producerRegistry = new ProducerRegistry(new Dictionary + }; + var timeProvider = new FakeTimeProvider(); + var tracer = new BrighterTracer(timeProvider); + InMemoryOutbox outbox = new(timeProvider) { - {new ProducerKey(_routingKey, type) , messageProducer} - }); - - _mediator = new OutboxProducerMediator( - producerRegistry, - new ResiliencePipelineRegistry().AddBrighterDefault(), - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - outbox, - maxOutStandingMessages: -1 - ); - - _commandProcessor = new Brighter.CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - policyRegistry, - new ResiliencePipelineRegistry(), - _mediator, - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: InstrumentationOptions.All - ); - + Tracer = tracer + }; + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); + messageMapperRegistry.RegisterAsync(); + var type = new CloudEventsType("io.goparamore.brighter.myevent"); + InMemoryMessageProducer messageProducer = new(_internalBus, new Publication { Source = new Uri("http://localhost"), RequestType = typeof(MyEvent), Topic = _routingKey, Type = type, }); + var producerRegistry = new ProducerRegistry(new Dictionary { { new ProducerKey(_routingKey, type), messageProducer } }); + _mediator = new OutboxProducerMediator(producerRegistry, new ResiliencePipelineRegistry().AddBrighterDefault(), messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), outbox, maxOutStandingMessages: -1); + _commandProcessor = new Brighter.CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), _mediator, new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: InstrumentationOptions.All); } - [Fact] + [Test] public async Task When_Producing_A_Message_Should_Propagate_Context() { //arrange @@ -110,37 +64,28 @@ public async Task When_Producing_A_Message_Should_Propagate_Context() var traceStateString = parentActivity.TraceStateString ?? ""; traceStateString += "test=value"; parentActivity.TraceStateString = traceStateString; - Baggage.SetBaggage("key", "value"); Baggage.SetBaggage("key2", "value2"); - - var @event = new MyEvent(); - var context = new RequestContext { Span = parentActivity }; - + var context = new RequestContext + { + Span = parentActivity + }; //act var messageId = await _commandProcessor.DepositPostAsync(@event, context); - //reset the parent span as deposit and clear are siblings context.Span = parentActivity; - await _commandProcessor.ClearOutboxAsync([messageId], context); - - await Task.Delay(3000); //allow bulk clear to run -- can make test fragile - + await Task.Delay(3000); //allow bulk clear to run -- can make test fragile parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //assert var messages = _internalBus.Stream(_routingKey); var message = messages.FirstOrDefault(m => m.Id == messageId); - Assert.NotNull(message); - Assert.NotNull(message.Header.TraceParent); + await Assert.That(message).IsNotNull(); + await Assert.That(message.Header.TraceParent).IsNotNull(); //? What is tracestate - Assert.Equal(traceStateString, message.Header.TraceState); - Assert.Equal("key=value,key2=value2", message.Header.Baggage.ToString()); - + await Assert.That(message.Header.TraceState?.Value).IsEqualTo(traceStateString); + await Assert.That(message.Header.Baggage.ToString()).IsEqualTo("key=value,key2=value2"); } -} - +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_Multipile_Messages_Spans_Are_Exported_Async.cs b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_Multipile_Messages_Spans_Are_Exported_Async.cs index 1519275754..701a6d6d67 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_Multipile_Messages_Spans_Are_Exported_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_Multipile_Messages_Spans_Are_Exported_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -14,137 +14,81 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.CommandProcessor.Clear; - -[Collection("Observability")] -public class AsyncCommandProcessorMultipleClearObservabilityTests +[NotInParallel("Observability")] +public class AsyncCommandProcessorMultipleClearObservabilityTests { private readonly List _exportedActivities; private readonly TracerProvider _traceProvider; private readonly Brighter.CommandProcessor _commandProcessor; private readonly string _topic; private readonly InternalBus _internalBus = new(); - public AsyncCommandProcessorMultipleClearObservabilityTests() { _topic = "MyCommand"; - var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); var registry = new SubscriberRegistry(); - - var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); - - var retryPolicy = Policy - .Handle() - .RetryAsync(); - - var policyRegistry = new PolicyRegistry {{Brighter.CommandProcessor.RETRYPOLICYASYNC, retryPolicy}}; - - var timeProvider = new FakeTimeProvider(); + var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); + var retryPolicy = Policy.Handle().RetryAsync(); + var policyRegistry = new PolicyRegistry + { + { + Brighter.CommandProcessor.RETRYPOLICYASYNC, + retryPolicy + } + }; + var timeProvider = new FakeTimeProvider(); var tracer = new BrighterTracer(timeProvider); - InMemoryOutbox outbox = new(timeProvider){Tracer = tracer}; - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); + InMemoryOutbox outbox = new(timeProvider) + { + Tracer = tracer + }; + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); messageMapperRegistry.RegisterAsync(); - var routingKey = new RoutingKey(_topic); - var type = new CloudEventsType("io.goparamore.brighter.myevent"); - InMemoryMessageProducer messageProducer = new(_internalBus, - new Publication - { - Source = new Uri("http://localhost"), - RequestType = typeof(MyEvent), - Topic = routingKey, - Type = type, - } - ); - - var producerRegistry = new ProducerRegistry(new Dictionary - { - {new ProducerKey(routingKey, type), messageProducer} - }); - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - new ResiliencePipelineRegistry().AddBrighterDefault(), - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - outbox, - maxOutStandingMessages: -1 - ); - - _commandProcessor = new Brighter.CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - policyRegistry, - new ResiliencePipelineRegistry(), - bus, - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: InstrumentationOptions.All - ); + InMemoryMessageProducer messageProducer = new(_internalBus, new Publication { Source = new Uri("http://localhost"), RequestType = typeof(MyEvent), Topic = routingKey, Type = type, }); + var producerRegistry = new ProducerRegistry(new Dictionary { { new ProducerKey(routingKey, type), messageProducer } }); + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, new ResiliencePipelineRegistry().AddBrighterDefault(), messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), outbox, maxOutStandingMessages: -1); + _commandProcessor = new Brighter.CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), bus, new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: InstrumentationOptions.All); } - - [Fact] + + [Test] public async Task When_Clearing_A_Message_A_Span_Is_Exported() { //arrange var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - var eventOne = new MyEvent(); var eventTwo = new MyEvent(); var eventThree = new MyEvent(); - var context = new RequestContext { Span = parentActivity }; - + var context = new RequestContext + { + Span = parentActivity + }; //act var messageIds = await _commandProcessor.DepositPostAsync([eventOne, eventTwo, eventThree], context); - //reset the parent span as deposit and clear are siblings - context.Span = parentActivity; await _commandProcessor.ClearOutboxAsync(messageIds, context); - parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //assert - Assert.Equal(19, _exportedActivities.Count); - Assert.Contains(_exportedActivities, a => a.Source.Name == "Paramore.Brighter"); - + await Assert.That(_exportedActivities.Count).IsEqualTo(19); + await Assert.That(_exportedActivities).Contains(a => a.Source.Name == "Paramore.Brighter"); //there should be a create span for the batch var createActivity = _exportedActivities.Single(a => a.DisplayName == $"{BrighterSemanticConventions.ClearMessages} {CommandProcessorSpanOperation.Create.ToSpanName()}"); - Assert.NotNull(createActivity); - + await Assert.That(createActivity).IsNotNull(); //there should be a clear span for each message id var clearActivity = _exportedActivities.Where(a => a.DisplayName == $"{BrighterSemanticConventions.ClearMessages} {CommandProcessorSpanOperation.Clear.ToSpanName()}"); - Assert.Equal(3, clearActivity.Count()); - + await Assert.That(clearActivity.Count()).IsEqualTo(3); //there should be a span in the Db for retrieving the batch of messages var outBoxActivity = _exportedActivities.Where(a => a.DisplayName == $"{BoxDbOperation.Get.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); - Assert.Single(outBoxActivity); - + await Assert.That(outBoxActivity).HasSingleItem(); //there should be a span for publishing the message via the producer var producerActivity = _exportedActivities.Where(a => a.DisplayName == $"{_topic} {CommandProcessorSpanOperation.Publish.ToSpanName()}"); - Assert.Equal(3, producerActivity.Count()); - + await Assert.That(producerActivity.Count()).IsEqualTo(3); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_Multiple_Messages_Spans_Are_Exported.cs b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_Multiple_Messages_Spans_Are_Exported.cs index 9cfc96192c..8cd043bbc3 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_Multiple_Messages_Spans_Are_Exported.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_Multiple_Messages_Spans_Are_Exported.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -13,135 +13,79 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.CommandProcessor.Clear; - -[Collection("Observability")] -public class CommandProcessorMultipleClearObservabilityTests +[NotInParallel("Observability")] +public class CommandProcessorMultipleClearObservabilityTests { private readonly List _exportedActivities; private readonly TracerProvider _traceProvider; private readonly Brighter.CommandProcessor _commandProcessor; private readonly InternalBus _internalBus = new(); - public CommandProcessorMultipleClearObservabilityTests() { var routingKey = new RoutingKey("MyEvent"); - var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); var registry = new SubscriberRegistry(); - - var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); - - var retryPolicy = Policy - .Handle() - .Retry(); - - var policyRegistry = new PolicyRegistry {{Brighter.CommandProcessor.RETRYPOLICY, retryPolicy}}; - - var timeProvider = new FakeTimeProvider(); - var tracer = new BrighterTracer(timeProvider); - InMemoryOutbox outbox = new(timeProvider){Tracer = tracer}; - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), - null); - messageMapperRegistry.Register(); - - - var cloudEventsType = new CloudEventsType("io.goparamore.brighter.myevent"); - InMemoryMessageProducer messageProducer = new(_internalBus, - new Publication + var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); + var retryPolicy = Policy.Handle().Retry(); + var policyRegistry = new PolicyRegistry + { { - Source = new Uri("http://localhost"), - RequestType = typeof(MyEvent), - Topic = routingKey, - Type = cloudEventsType, + Brighter.CommandProcessor.RETRYPOLICY, + retryPolicy } - ); - - var producerRegistry = new ProducerRegistry(new Dictionary + }; + var timeProvider = new FakeTimeProvider(); + var tracer = new BrighterTracer(timeProvider); + InMemoryOutbox outbox = new(timeProvider) { - {new ProducerKey(routingKey, cloudEventsType), messageProducer} - }); - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - new ResiliencePipelineRegistry().AddBrighterDefault(), - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - outbox, - maxOutStandingMessages: -1 - ); - - _commandProcessor = new Brighter.CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - policyRegistry, - new ResiliencePipelineRegistry(), - bus, - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: InstrumentationOptions.All - ); + Tracer = tracer + }; + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), null); + messageMapperRegistry.Register(); + var cloudEventsType = new CloudEventsType("io.goparamore.brighter.myevent"); + InMemoryMessageProducer messageProducer = new(_internalBus, new Publication { Source = new Uri("http://localhost"), RequestType = typeof(MyEvent), Topic = routingKey, Type = cloudEventsType, }); + var producerRegistry = new ProducerRegistry(new Dictionary { { new ProducerKey(routingKey, cloudEventsType), messageProducer } }); + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, new ResiliencePipelineRegistry().AddBrighterDefault(), messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), outbox, maxOutStandingMessages: -1); + _commandProcessor = new Brighter.CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), bus, new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: InstrumentationOptions.All); } - - [Fact] - public void When_Clearing_A_Message_A_Span_Is_Exported() + + [Test] + public async Task When_Clearing_A_Message_A_Span_Is_Exported() { //arrange var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - var eventOne = new MyEvent(); var eventTwo = new MyEvent(); var eventThree = new MyEvent(); - - var context = new RequestContext { Span = parentActivity }; - + var context = new RequestContext + { + Span = parentActivity + }; //act var messageIds = _commandProcessor.DepositPost([eventOne, eventTwo, eventThree], context); - //reset the parent span as deposit and clear are siblings - context.Span = parentActivity; _commandProcessor.ClearOutbox(messageIds, context); - parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //assert - Assert.Equal(19, _exportedActivities.Count); - Assert.Contains(_exportedActivities, a => a.Source.Name == "Paramore.Brighter"); - + await Assert.That(_exportedActivities.Count).IsEqualTo(19); + await Assert.That(_exportedActivities).Contains(a => a.Source.Name == "Paramore.Brighter"); //there should be a create span for the batch var createActivity = _exportedActivities.Single(a => a.DisplayName == $"{BrighterSemanticConventions.ClearMessages} {CommandProcessorSpanOperation.Create.ToSpanName()}"); - Assert.NotNull(createActivity); - + await Assert.That(createActivity).IsNotNull(); //there should be a clear span for each message id var clearActivity = _exportedActivities.Where(a => a.DisplayName == $"{BrighterSemanticConventions.ClearMessages} {CommandProcessorSpanOperation.Clear.ToSpanName()}"); - Assert.Equal(3, clearActivity.Count()); - + await Assert.That(clearActivity.Count()).IsEqualTo(3); //there should be a span in the Db for retrieving the batch of messages var outBoxActivity = _exportedActivities.Where(a => a.DisplayName == $"{BoxDbOperation.Get.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); - Assert.Single(outBoxActivity); - + await Assert.That(outBoxActivity).HasSingleItem(); //there should be a span for publishing the message via the producer var producerActivity = _exportedActivities.Where(a => a.DisplayName == $"{"MyEvent"} {CommandProcessorSpanOperation.Publish.ToSpanName()}"); - Assert.Equal(3, producerActivity.Count()); + await Assert.That(producerActivity.Count()).IsEqualTo(3); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_Outstanding_Messages_Spans_Are_Exported.cs b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_Outstanding_Messages_Spans_Are_Exported.cs index 21d3b9f989..b297562c3b 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_Outstanding_Messages_Spans_Are_Exported.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_Outstanding_Messages_Spans_Are_Exported.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -15,12 +15,10 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.CommandProcessor.Clear; - -[Collection("Observability")] -public class CommandProcessorClearOutstandingObservabilityTests +[NotInParallel("Observability")] +public class CommandProcessorClearOutstandingObservabilityTests { private readonly List _exportedActivities; private readonly TracerProvider _traceProvider; @@ -28,155 +26,94 @@ public class CommandProcessorClearOutstandingObservabilityTests private readonly string _topic; private readonly InternalBus _internalBus = new(); private readonly IAmAnOutboxProducerMediator _mediator; - public CommandProcessorClearOutstandingObservabilityTests() { _topic = "MyEvent"; - var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); var registry = new SubscriberRegistry(); - - var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); - - var retryPolicy = Policy - .Handle() - .Retry(); - - var policyRegistry = new PolicyRegistry {{Brighter.CommandProcessor.RETRYPOLICY, retryPolicy}}; - - var timeProvider = new FakeTimeProvider(); + var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); + var retryPolicy = Policy.Handle().Retry(); + var policyRegistry = new PolicyRegistry + { + { + Brighter.CommandProcessor.RETRYPOLICY, + retryPolicy + } + }; + var timeProvider = new FakeTimeProvider(); var tracer = new BrighterTracer(timeProvider); - InMemoryOutbox outbox = new(timeProvider){Tracer = tracer}; - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), - null); + InMemoryOutbox outbox = new(timeProvider) + { + Tracer = tracer + }; + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - var routingKey = new RoutingKey(_topic); - - InMemoryMessageProducer messageProducer = new(_internalBus, - new Publication - { - Source = new Uri("http://localhost"), - RequestType = typeof(MyEvent), - Topic = routingKey, - Type = new CloudEventsType("io.goparamore.brighter.myevent"), - }); - - var producerRegistry = new ProducerRegistry(new Dictionary - { - {routingKey, messageProducer} - }); - - _mediator = new OutboxProducerMediator( - producerRegistry, - new ResiliencePipelineRegistry().AddBrighterDefault(), - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - outbox, - maxOutStandingMessages: -1 - ); - - _commandProcessor = new Brighter.CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - policyRegistry, - new ResiliencePipelineRegistry(), - _mediator, - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: InstrumentationOptions.All - ); + InMemoryMessageProducer messageProducer = new(_internalBus, new Publication { Source = new Uri("http://localhost"), RequestType = typeof(MyEvent), Topic = routingKey, Type = new CloudEventsType("io.goparamore.brighter.myevent"), }); + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, messageProducer } }); + _mediator = new OutboxProducerMediator(producerRegistry, new ResiliencePipelineRegistry().AddBrighterDefault(), messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), outbox, maxOutStandingMessages: -1); + _commandProcessor = new Brighter.CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), _mediator, new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: InstrumentationOptions.All); } - - [Fact(Skip = "This test is fragile due to background processing")] - //[Fact] + + [Test, Skip("This test is fragile due to background processing")] + //[Test] public async Task When_Clearing_Outstanding_Messages_Spans_Are_Exported() { //arrange var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - var eventOne = new MyEvent(); var eventTwo = new MyEvent(); var eventThree = new MyEvent(); - - var context = new RequestContext { Span = parentActivity }; - + var context = new RequestContext + { + Span = parentActivity + }; //act _commandProcessor.DepositPost([eventOne, eventTwo, eventThree], context); - //reset the parent span as deposit and clear are siblings - context.Span = parentActivity; await _mediator.ClearOutstandingFromOutboxAsync(3, TimeSpan.Zero, false, context); - - await Task.Delay(3000); //allow bulk clear to run -- can make test fragile - + await Task.Delay(3000); //allow bulk clear to run -- can make test fragile parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //assert //_exportedActivities.Count.Should().Be(18); - Assert.Contains(_exportedActivities, a => a.Source.Name == "Paramore.Brighter"); - + await Assert.That(_exportedActivities).Contains(a => a.Source.Name == "Paramore.Brighter"); //there should be a create span for the batch var createActivity = _exportedActivities.Single(a => a.DisplayName == $"{BrighterSemanticConventions.ClearMessages} {CommandProcessorSpanOperation.Create.ToSpanName()}"); - Assert.NotNull(createActivity); - + await Assert.That(createActivity).IsNotNull(); //there should be a clear span for the batch of messages var clearActivity = _exportedActivities.Single(a => a.DisplayName == $"{BrighterSemanticConventions.ClearMessages} {CommandProcessorSpanOperation.Clear.ToSpanName()}"); - //retrieving the messages should be an event var events = clearActivity.Events.ToList(); var messages = _internalBus.Stream(new RoutingKey(_topic)).ToArray(); - var depositEvents = events.Where(e => e.Name == BoxDbOperation.OutStandingMessages.ToSpanName()).ToArray(); - Assert.Equal(messages.Length, depositEvents.Length); - + await Assert.That(depositEvents.Length).IsEqualTo(messages.Length); foreach (var message in messages) { var depositEvent = depositEvents.Single(e => e.Tags.Any(a => a.Key == BrighterSemanticConventions.MessageId && (string)a.Value == message.Id)); - Assert.Contains(depositEvent.Tags, a => a.Value != null && a.Key == BrighterSemanticConventions.OutboxSharedTransaction && (bool)a.Value == false); - Assert.Contains(depositEvent.Tags, a => a.Key == BrighterSemanticConventions.OutboxType && (string)a.Value == "sync"); - Assert.Contains(depositEvent.Tags, a => a.Key == BrighterSemanticConventions.MessageId && (string)a.Value == message.Id); - Assert.Contains(depositEvent.Tags, a => a.Key == BrighterSemanticConventions.MessagingDestination && (string)a.Value == message.Header.Topic); - Assert.Contains(depositEvent.Tags, a => a is { Value: not null, Key: BrighterSemanticConventions.MessageBodySize } && (int)a.Value == message.Body.Bytes.Length); - Assert.Contains(depositEvent.Tags, a => a.Key == BrighterSemanticConventions.MessageBody && (string)a.Value == message.Body.Value); - Assert.Contains(depositEvent.Tags, a => a.Key == BrighterSemanticConventions.MessageType && (string)a.Value == message.Header.MessageType.ToString()); - Assert.Contains(depositEvent.Tags, a => a.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && (string)a.Value == message.Header.PartitionKey); - Assert.Contains(depositEvent.Tags, a => a.Key == BrighterSemanticConventions.MessageHeaders && (string)a.Value == JsonSerializer.Serialize(message.Header)); + await Assert.That(depositEvent.Tags).Contains(a => a.Value != null && a.Key == BrighterSemanticConventions.OutboxSharedTransaction && (bool)a.Value == false); + await Assert.That(depositEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.OutboxType && (string)a.Value == "sync"); + await Assert.That(depositEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessageId && (string)a.Value == message.Id); + await Assert.That(depositEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessagingDestination && (string)a.Value == message.Header.Topic); + await Assert.That(depositEvent.Tags).Contains(a => a is { Value: not null, Key: BrighterSemanticConventions.MessageBodySize } && (int)a.Value == message.Body.Bytes.Length); + await Assert.That(depositEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessageBody && (string)a.Value == message.Body.Value); + await Assert.That(depositEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessageType && (string)a.Value == message.Header.MessageType.ToString()); + await Assert.That(depositEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && (string)a.Value == message.Header.PartitionKey); + await Assert.That(depositEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessageHeaders && (string)a.Value == JsonSerializer.Serialize(message.Header)); } //there should be a span in the Db for retrieving the message - var outBoxActivity = _exportedActivities - .Single(a => - a.DisplayName == $"{BoxDbOperation.OutStandingMessages.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}" - ); - Assert.Contains(outBoxActivity.Tags, t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.OutStandingMessages.ToSpanName()); - Assert.Contains(outBoxActivity.Tags, t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable); - Assert.Contains(outBoxActivity.Tags, t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName()); - Assert.Contains(outBoxActivity.Tags, t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName); - + var outBoxActivity = _exportedActivities.Single(a => a.DisplayName == $"{BoxDbOperation.OutStandingMessages.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); + await Assert.That(outBoxActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.OutStandingMessages.ToSpanName()); + await Assert.That(outBoxActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable); + await Assert.That(outBoxActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName()); + await Assert.That(outBoxActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName); //there should be a span for publishing the message via the producer - var producerActivity = _exportedActivities - .Single(a => a.DisplayName == $"{_topic} {CommandProcessorSpanOperation.Publish.ToSpanName()}"); - + var producerActivity = _exportedActivities.Single(a => a.DisplayName == $"{_topic} {CommandProcessorSpanOperation.Publish.ToSpanName()}"); var producerEvents = producerActivity.Events.ToArray(); - Assert.Equal(3, producerEvents.Length); + await Assert.That(producerEvents.Length).IsEqualTo(3); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_Outstanding_Messages_Spans_Are_Exported_Bulk.cs b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_Outstanding_Messages_Spans_Are_Exported_Bulk.cs index cc43cda55a..9313c1e866 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_Outstanding_Messages_Spans_Are_Exported_Bulk.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Clear/When_Clearing_Outstanding_Messages_Spans_Are_Exported_Bulk.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -15,12 +15,10 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.CommandProcessor.Clear; - -[Collection("Observability")] -public class AsyncCommandProcessorBulkClearOutstandingObservabilityTests +[NotInParallel("Observability")] +public class AsyncCommandProcessorBulkClearOutstandingObservabilityTests { private readonly List _exportedActivities; private readonly TracerProvider _traceProvider; @@ -28,154 +26,94 @@ public class AsyncCommandProcessorBulkClearOutstandingObservabilityTests private readonly string _topic; private readonly InternalBus _internalBus = new(); private readonly IAmAnOutboxProducerMediator _mediator; - public AsyncCommandProcessorBulkClearOutstandingObservabilityTests() { _topic = "MyEvent"; - var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); var registry = new SubscriberRegistry(); - - var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); - - var retryPolicy = Policy - .Handle() - .RetryAsync(); - - var policyRegistry = new PolicyRegistry {{Brighter.CommandProcessor.RETRYPOLICYASYNC, retryPolicy}}; - - var timeProvider = new FakeTimeProvider(); - var tracer = new BrighterTracer(timeProvider); - InMemoryOutbox outbox = new(timeProvider){Tracer = tracer}; - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); - messageMapperRegistry.RegisterAsync(); - - var routingKey = new RoutingKey(_topic); - InMemoryMessageProducer messageProducer = new(_internalBus, - new Publication + var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); + var retryPolicy = Policy.Handle().RetryAsync(); + var policyRegistry = new PolicyRegistry + { { - Source = new Uri("http://localhost"), - RequestType = typeof(MyEvent), - Topic = routingKey, - Type = new CloudEventsType("io.goparamore.brighter.myevent") + Brighter.CommandProcessor.RETRYPOLICYASYNC, + retryPolicy } - ); - - var producerRegistry = new ProducerRegistry(new Dictionary + }; + var timeProvider = new FakeTimeProvider(); + var tracer = new BrighterTracer(timeProvider); + InMemoryOutbox outbox = new(timeProvider) { - {routingKey, messageProducer} - }); - - _mediator = new OutboxProducerMediator( - producerRegistry, - new ResiliencePipelineRegistry().AddBrighterDefault(), - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - outbox, - maxOutStandingMessages: -1 - ); - - _commandProcessor = new Brighter.CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - policyRegistry, - new ResiliencePipelineRegistry(), - _mediator, - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: InstrumentationOptions.All - ); + Tracer = tracer + }; + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); + messageMapperRegistry.RegisterAsync(); + var routingKey = new RoutingKey(_topic); + InMemoryMessageProducer messageProducer = new(_internalBus, new Publication { Source = new Uri("http://localhost"), RequestType = typeof(MyEvent), Topic = routingKey, Type = new CloudEventsType("io.goparamore.brighter.myevent") }); + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, messageProducer } }); + _mediator = new OutboxProducerMediator(producerRegistry, new ResiliencePipelineRegistry().AddBrighterDefault(), messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), outbox, maxOutStandingMessages: -1); + _commandProcessor = new Brighter.CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), _mediator, new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: InstrumentationOptions.All); } - - [Fact(Skip = "This test is fragile due to background processing")] - //[Fact] + + [Test, Skip("This test is fragile due to background processing")] + //[Test] public async Task When_Clearing_Outstanding_Messages_Spans_Are_Exported() { //arrange var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - var eventOne = new MyEvent(); var eventTwo = new MyEvent(); var eventThree = new MyEvent(); - - var context = new RequestContext { Span = parentActivity }; - + var context = new RequestContext + { + Span = parentActivity + }; //act await _commandProcessor.DepositPostAsync([eventOne, eventTwo, eventThree], context); - //reset the parent span as deposit and clear are siblings - context.Span = parentActivity; await _mediator.ClearOutstandingFromOutboxAsync(3, TimeSpan.Zero, useBulk: true, requestContext: context); - - await Task.Delay(3000); //allow bulk clear to run -- can make test fragile - + await Task.Delay(3000); //allow bulk clear to run -- can make test fragile parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //assert //_exportedActivities.Count.Should().Be(18); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); //there should be a create span for the batch var createActivity = _exportedActivities.Single(a => a.DisplayName == $"{BrighterSemanticConventions.ClearMessages} {CommandProcessorSpanOperation.Create.ToSpanName()}"); - Assert.NotNull(createActivity); - + await Assert.That(createActivity).IsNotNull(); //there should be a clear span for the batch of messages var clearActivity = _exportedActivities.Single(a => a.DisplayName == $"{BrighterSemanticConventions.ClearMessages} {CommandProcessorSpanOperation.Clear.ToSpanName()}"); - //retrieving the messages should be an event var events = clearActivity.Events.ToList(); var messages = _internalBus.Stream(new RoutingKey(_topic)).ToArray(); - var depositEvents = events.Where(e => e.Name == BoxDbOperation.OutStandingMessages.ToSpanName()).ToArray(); - Assert.Equal(messages.Length, depositEvents.Length); - + await Assert.That(depositEvents.Length).IsEqualTo(messages.Length); foreach (var message in messages) { var depositEvent = depositEvents.Single(e => e.Tags.Any(a => a.Key == BrighterSemanticConventions.MessageId && (string)a.Value == message.Id)); - Assert.Contains(depositEvent.Tags, a => a.Value != null && a.Key == BrighterSemanticConventions.OutboxSharedTransaction && (bool)a.Value == false); - Assert.Contains(depositEvent.Tags, a => a.Key == BrighterSemanticConventions.OutboxType && (string)a.Value == "async"); - Assert.Contains(depositEvent.Tags, a => a.Key == BrighterSemanticConventions.MessageId && (string)a.Value == message.Id); - Assert.Contains(depositEvent.Tags, a => a.Key == BrighterSemanticConventions.MessagingDestination && (string)a.Value == message.Header.Topic); - Assert.Contains(depositEvent.Tags, a => a is { Value: not null, Key: BrighterSemanticConventions.MessageBodySize } && (int)a.Value == message.Body.Bytes.Length); - Assert.Contains(depositEvent.Tags, a => a.Key == BrighterSemanticConventions.MessageBody && (string)a.Value == message.Body.Value); - Assert.Contains(depositEvent.Tags, a => a.Key == BrighterSemanticConventions.MessageType && (string)a.Value == message.Header.MessageType.ToString()); - Assert.Contains(depositEvent.Tags, a => a.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && (string)a.Value == message.Header.PartitionKey); - Assert.Contains(depositEvent.Tags, a => a.Key == BrighterSemanticConventions.MessageHeaders && (string)a.Value == JsonSerializer.Serialize(message.Header)); + await Assert.That(depositEvent.Tags).Contains(a => a.Value != null && a.Key == BrighterSemanticConventions.OutboxSharedTransaction && (bool)a.Value == false); + await Assert.That(depositEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.OutboxType && (string)a.Value == "async"); + await Assert.That(depositEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessageId && (string)a.Value == message.Id); + await Assert.That(depositEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessagingDestination && (string)a.Value == message.Header.Topic); + await Assert.That(depositEvent.Tags).Contains(a => a is { Value: not null, Key: BrighterSemanticConventions.MessageBodySize } && (int)a.Value == message.Body.Bytes.Length); + await Assert.That(depositEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessageBody && (string)a.Value == message.Body.Value); + await Assert.That(depositEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessageType && (string)a.Value == message.Header.MessageType.ToString()); + await Assert.That(depositEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && (string)a.Value == message.Header.PartitionKey); + await Assert.That(depositEvent.Tags).Contains(a => a.Key == BrighterSemanticConventions.MessageHeaders && (string)a.Value == JsonSerializer.Serialize(message.Header)); } - //there should be a span in the Db for retrieving the message - var outBoxActivity = _exportedActivities - .Single(a => - a.DisplayName == $"{BoxDbOperation.OutStandingMessages.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}" - ); - Assert.Contains(outBoxActivity.Tags, t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.OutStandingMessages.ToSpanName()); - Assert.Contains(outBoxActivity.Tags, t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable); - Assert.Contains(outBoxActivity.Tags, t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName()); - Assert.Contains(outBoxActivity.Tags, t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName); + //there should be a span in the Db for retrieving the message + var outBoxActivity = _exportedActivities.Single(a => a.DisplayName == $"{BoxDbOperation.OutStandingMessages.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); + await Assert.That(outBoxActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.OutStandingMessages.ToSpanName()); + await Assert.That(outBoxActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable); + await Assert.That(outBoxActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName()); + await Assert.That(outBoxActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName); //there should be a span for publishing the message via the producer - var producerActivity = _exportedActivities - .Single(a => a.DisplayName == $"{_topic} {CommandProcessorSpanOperation.Publish.ToSpanName()}"); - + var producerActivity = _exportedActivities.Single(a => a.DisplayName == $"{_topic} {CommandProcessorSpanOperation.Publish.ToSpanName()}"); var producerEvents = producerActivity.Events.ToArray(); - Assert.Equal(3, producerEvents.Length); + await Assert.That(producerEvents.Length).IsEqualTo(3); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Deposit/When_Depositing_A_Request_A_Span_Is_Exported.cs b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Deposit/When_Depositing_A_Request_A_Span_Is_Exported.cs index d9d2d51795..2835ebe552 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Deposit/When_Depositing_A_Request_A_Span_Is_Exported.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Deposit/When_Depositing_A_Request_A_Span_Is_Exported.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -15,138 +15,92 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; using MyEvent = Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles.MyEvent; namespace Paramore.Brighter.Core.Tests.Observability.CommandProcessor.Deposit; - -[Collection("Observability")] -public class CommandProcessorDepositObservabilityTests +[NotInParallel("Observability")] +public class CommandProcessorDepositObservabilityTests { private readonly List _exportedActivities; private readonly TracerProvider _traceProvider; private readonly Brighter.CommandProcessor _commandProcessor; private readonly InMemoryOutbox _outbox; - public CommandProcessorDepositObservabilityTests() { var routingKey = new RoutingKey("MyEvent"); - var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); var registry = new SubscriberRegistry(); - - var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); - - var retryPolicy = Policy - .Handle() - .Retry(); - - var policyRegistry = new PolicyRegistry {{Brighter.CommandProcessor.RETRYPOLICY, retryPolicy}}; - - var timeProvider = new FakeTimeProvider(); - var tracer = new BrighterTracer(timeProvider); - _outbox = new InMemoryOutbox(timeProvider){Tracer = tracer}; - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), - null); - messageMapperRegistry.Register(); - - var producerRegistry = new ProducerRegistry(new Dictionary + var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); + var retryPolicy = Policy.Handle().Retry(); + var policyRegistry = new PolicyRegistry { { - routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyEvent)}) + Brighter.CommandProcessor.RETRYPOLICY, + retryPolicy } - }); - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - new ResiliencePipelineRegistry().AddBrighterDefault(), - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox, - maxOutStandingMessages: -1 - ); - - _commandProcessor = new Brighter.CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - policyRegistry, - new ResiliencePipelineRegistry(), - bus, - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: InstrumentationOptions.All - ); + }; + var timeProvider = new FakeTimeProvider(); + var tracer = new BrighterTracer(timeProvider); + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), null); + messageMapperRegistry.Register(); + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyEvent) }) } }); + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, new ResiliencePipelineRegistry().AddBrighterDefault(), messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox, maxOutStandingMessages: -1); + _commandProcessor = new Brighter.CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), bus, new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: InstrumentationOptions.All); } - [Fact] - public void When_Depositing_A_Request_A_Span_Is_Exported() + [Test] + public async Task When_Depositing_A_Request_A_Span_Is_Exported() { //arrange var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - var @event = new MyEvent(); - var context = new RequestContext { Span = parentActivity }; - + var context = new RequestContext + { + Span = parentActivity + }; //act _commandProcessor.DepositPost(@event, context); parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //assert - Assert.Equal(3, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); + await Assert.That(_exportedActivities.Count).IsEqualTo(3); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); var depositActivity = _exportedActivities.Single(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Deposit.ToSpanName()}"); - Assert.NotNull(depositActivity); - Assert.Equal(parentActivity?.Id, depositActivity.ParentId); - - Assert.True(depositActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)); - Assert.True(depositActivity.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })); - Assert.True(depositActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); - Assert.True(depositActivity.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "deposit" })); - + await Assert.That(depositActivity).IsNotNull(); + await Assert.That(depositActivity.ParentId).IsEqualTo(parentActivity?.Id); + await Assert.That(depositActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)).IsTrue(); + await Assert.That(depositActivity.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })).IsTrue(); + await Assert.That(depositActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(depositActivity.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "deposit" })).IsTrue(); var events = depositActivity.Events.ToList(); - Assert.Equal(2, events.Count); - + await Assert.That(events.Count).IsEqualTo(2); //mapping a message should be an event var mapperEvent = events.Single(e => e.Name == $"{nameof(MyEventMessageMapper)}"); - Assert.True(mapperEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MapperName && (string)a.Value == nameof(MyEventMessageMapper))); - Assert.True(mapperEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MapperType && (string)a.Value == "sync")); - + await Assert.That(mapperEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MapperName && (string)a.Value == nameof(MyEventMessageMapper))).IsTrue(); + await Assert.That(mapperEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MapperType && (string)a.Value == "sync")).IsTrue(); //depositing a message should be an event - var message = _outbox.OutstandingMessages(TimeSpan.Zero, context).Single(); + var message = (await _outbox.OutstandingMessagesAsync(TimeSpan.Zero, context)).Single(); var depositEvent = events.Single(e => e.Name == BoxDbOperation.Add.ToSpanName()); - Assert.True(depositEvent.Tags.Any(a => a is { Value: not null, Key: BrighterSemanticConventions.OutboxSharedTransaction } && (bool)a.Value == false)); - Assert.True(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.OutboxType && (string)a.Value == "sync" )); - Assert.True(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessageId && (string)a.Value == message.Id )); - Assert.True(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessagingDestination && (RoutingKey)a.Value == message.Header.Topic)); - Assert.True(depositEvent.Tags.Any(a => a is { Value: not null, Key: BrighterSemanticConventions.MessageBodySize } && (int)a.Value == message.Body.Bytes.Length)); - Assert.True(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessageBody && (string)a.Value == message.Body.Value)); - Assert.True(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessageType && (string)a.Value == message.Header.MessageType.ToString())); - Assert.True(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && (string)a.Value == message.Header.PartitionKey)); - Assert.True(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessageHeaders && (string)a.Value == JsonSerializer.Serialize(message.Header))); - + await Assert.That(depositEvent.Tags.Any(a => a is { Value: not null, Key: BrighterSemanticConventions.OutboxSharedTransaction } && (bool)a.Value == false)).IsTrue(); + await Assert.That(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.OutboxType && (string)a.Value == "sync")).IsTrue(); + await Assert.That(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessageId && (string)a.Value == message.Id)).IsTrue(); + await Assert.That(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessagingDestination && (RoutingKey)a.Value == message.Header.Topic)).IsTrue(); + await Assert.That(depositEvent.Tags.Any(a => a is { Value: not null, Key: BrighterSemanticConventions.MessageBodySize } && (int)a.Value == message.Body.Bytes.Length)).IsTrue(); + await Assert.That(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessageBody && (string)a.Value == message.Body.Value)).IsTrue(); + await Assert.That(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessageType && (string)a.Value == message.Header.MessageType.ToString())).IsTrue(); + await Assert.That(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && (string)a.Value == message.Header.PartitionKey)).IsTrue(); + await Assert.That(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessageHeaders && (string)a.Value == JsonSerializer.Serialize(message.Header))).IsTrue(); //-- there should be a span for the outbox itself to use for its call; even in-memory here; should use for the span name var outBoxActivity = _exportedActivities.Single(a => a.DisplayName == $"{BoxDbOperation.Add.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); - Assert.True(outBoxActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.Add.ToSpanName())); - Assert.True(outBoxActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable)); - Assert.True(outBoxActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName())); - Assert.True(outBoxActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName)); - + await Assert.That(outBoxActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.Add.ToSpanName())).IsTrue(); + await Assert.That(outBoxActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable)).IsTrue(); + await Assert.That(outBoxActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName())).IsTrue(); + await Assert.That(outBoxActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName)).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Deposit/When_Depositing_A_Request_A_Span_Is_Exported_Async.cs b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Deposit/When_Depositing_A_Request_A_Span_Is_Exported_Async.cs index 05f18504a5..13b21dad6a 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Deposit/When_Depositing_A_Request_A_Span_Is_Exported_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Deposit/When_Depositing_A_Request_A_Span_Is_Exported_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -16,139 +16,92 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; using MyEvent = Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles.MyEvent; namespace Paramore.Brighter.Core.Tests.Observability.CommandProcessor.Deposit; - -[Collection("Observability")] -public class AsyncCommandProcessorDepositObservabilityTests +[NotInParallel("Observability")] +public class AsyncCommandProcessorDepositObservabilityTests { private readonly List _exportedActivities; private readonly TracerProvider _traceProvider; private readonly Brighter.CommandProcessor _commandProcessor; private readonly InMemoryOutbox _outbox; - public AsyncCommandProcessorDepositObservabilityTests() { var routingKey = new RoutingKey("MyEvent"); - var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); var registry = new SubscriberRegistry(); - - var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); - - var retryPolicy = Policy - .Handle() - .RetryAsync(); - - var policyRegistry = new PolicyRegistry {{Brighter.CommandProcessor.RETRYPOLICYASYNC, retryPolicy}}; - - var timeProvider = new FakeTimeProvider(); - var tracer = new BrighterTracer(timeProvider); - _outbox = new InMemoryOutbox(timeProvider){Tracer = tracer}; - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync()) - ); - messageMapperRegistry.RegisterAsync(); - - var producerRegistry = new ProducerRegistry(new Dictionary + var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); + var retryPolicy = Policy.Handle().RetryAsync(); + var policyRegistry = new PolicyRegistry { { - routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyEvent)}) + Brighter.CommandProcessor.RETRYPOLICYASYNC, + retryPolicy } - }); - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - new ResiliencePipelineRegistry().AddBrighterDefault(), - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - _outbox, - maxOutStandingMessages: -1 - ); - - _commandProcessor = new Brighter.CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - policyRegistry, - new ResiliencePipelineRegistry(), - bus, - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: InstrumentationOptions.All - ); + }; + var timeProvider = new FakeTimeProvider(); + var tracer = new BrighterTracer(timeProvider); + _outbox = new InMemoryOutbox(timeProvider) + { + Tracer = tracer + }; + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); + messageMapperRegistry.RegisterAsync(); + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyEvent) }) } }); + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, new ResiliencePipelineRegistry().AddBrighterDefault(), messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), _outbox, maxOutStandingMessages: -1); + _commandProcessor = new Brighter.CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), bus, new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: InstrumentationOptions.All); } - [Fact] + [Test] public async Task When_Depositing_A_Request_A_Span_Is_Exported() { //arrange var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - var @event = new MyEvent(); - var context = new RequestContext { Span = parentActivity }; - + var context = new RequestContext + { + Span = parentActivity + }; //act await _commandProcessor.DepositPostAsync(@event, context); parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //assert - Assert.Equal(3, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); + await Assert.That(_exportedActivities.Count).IsEqualTo(3); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); var depositActivity = _exportedActivities.Single(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Deposit.ToSpanName()}"); - Assert.NotNull(depositActivity); - Assert.Equal(parentActivity?.Id, depositActivity.ParentId); - - Assert.True(depositActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)); - Assert.True(depositActivity.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })); - Assert.True(depositActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); - Assert.True(depositActivity.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "deposit" })); - + await Assert.That(depositActivity).IsNotNull(); + await Assert.That(depositActivity.ParentId).IsEqualTo(parentActivity?.Id); + await Assert.That(depositActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)).IsTrue(); + await Assert.That(depositActivity.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })).IsTrue(); + await Assert.That(depositActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(depositActivity.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "deposit" })).IsTrue(); var events = depositActivity.Events.ToList(); - Assert.Equal(2, events.Count); - + await Assert.That(events.Count).IsEqualTo(2); //mapping a message should be an event var mapperEvent = events.Single(e => e.Name == $"{nameof(MyEventMessageMapperAsync)}"); - Assert.True(mapperEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MapperName && (string)a.Value == nameof(MyEventMessageMapperAsync))); - Assert.True(mapperEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MapperType && (string)a.Value == "async")); - + await Assert.That(mapperEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MapperName && (string)a.Value == nameof(MyEventMessageMapperAsync))).IsTrue(); + await Assert.That(mapperEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MapperType && (string)a.Value == "async")).IsTrue(); //depositing a message should be an event - var message = _outbox.OutstandingMessages(TimeSpan.Zero, context).Single(); + var message = (await _outbox.OutstandingMessagesAsync(TimeSpan.Zero, context)).Single(); var depositEvent = events.Single(e => e.Name == BoxDbOperation.Add.ToSpanName()); - Assert.True(depositEvent.Tags.Any(a => a is { Value: not null, Key: BrighterSemanticConventions.OutboxSharedTransaction } && (bool)a.Value == false)); - Assert.True(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.OutboxType && (string)a.Value == "async" )); - Assert.True(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessageId && (string)a.Value == message.Id )); - Assert.True(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessagingDestination && (RoutingKey)a.Value == message.Header.Topic)); - Assert.True(depositEvent.Tags.Any(a => a is { Value: not null, Key: BrighterSemanticConventions.MessageBodySize } && (int)a.Value == message.Body.Bytes.Length)); - Assert.True(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessageBody && (string)a.Value == message.Body.Value)); - Assert.True(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessageType && (string)a.Value == message.Header.MessageType.ToString())); - Assert.True(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && (string)a.Value == message.Header.PartitionKey)); - Assert.True(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessageHeaders && (string)a.Value == JsonSerializer.Serialize(message.Header))); - + await Assert.That(depositEvent.Tags.Any(a => a is { Value: not null, Key: BrighterSemanticConventions.OutboxSharedTransaction } && (bool)a.Value == false)).IsTrue(); + await Assert.That(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.OutboxType && (string)a.Value == "async")).IsTrue(); + await Assert.That(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessageId && (string)a.Value == message.Id)).IsTrue(); + await Assert.That(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessagingDestination && (RoutingKey)a.Value == message.Header.Topic)).IsTrue(); + await Assert.That(depositEvent.Tags.Any(a => a is { Value: not null, Key: BrighterSemanticConventions.MessageBodySize } && (int)a.Value == message.Body.Bytes.Length)).IsTrue(); + await Assert.That(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessageBody && (string)a.Value == message.Body.Value)).IsTrue(); + await Assert.That(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessageType && (string)a.Value == message.Header.MessageType.ToString())).IsTrue(); + await Assert.That(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && (string)a.Value == message.Header.PartitionKey)).IsTrue(); + await Assert.That(depositEvent.Tags.Any(a => a.Key == BrighterSemanticConventions.MessageHeaders && (string)a.Value == JsonSerializer.Serialize(message.Header))).IsTrue(); //-- there should be a span for the outbox itself to use for its call; even in-memory here; should use for the span name var outBoxActivity = _exportedActivities.Single(a => a.DisplayName == $"{BoxDbOperation.Add.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); - Assert.True(outBoxActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.Add.ToSpanName())); - Assert.True(outBoxActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable)); - Assert.True(outBoxActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName())); - Assert.True(outBoxActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName)); - + await Assert.That(outBoxActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.Add.ToSpanName())).IsTrue(); + await Assert.That(outBoxActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable)).IsTrue(); + await Assert.That(outBoxActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.Brighter.ToDbName())).IsTrue(); + await Assert.That(outBoxActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName)).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Deposit/When_Depositing_Multiple_Requests_Spans_Are_Exported.cs b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Deposit/When_Depositing_Multiple_Requests_Spans_Are_Exported.cs index 4d071bac44..2ed387da5c 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Deposit/When_Depositing_Multiple_Requests_Spans_Are_Exported.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Deposit/When_Depositing_Multiple_Requests_Spans_Are_Exported.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -15,126 +15,84 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; using MyEvent = Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles.MyEvent; namespace Paramore.Brighter.Core.Tests.Observability.CommandProcessor.Deposit; - -[Collection("Observability")] +[NotInParallel("Observability")] public class CommandProcessorMultipleDepositObservabilityTests { private readonly List _exportedActivities; private readonly TracerProvider _traceProvider; private readonly Brighter.CommandProcessor _commandProcessor; - public CommandProcessorMultipleDepositObservabilityTests() { var routingKey = new RoutingKey("MyEvent"); - var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); var registry = new SubscriberRegistry(); - - var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); - - var retryPolicy = Policy - .Handle() - .Retry(); - - var policyRegistry = new PolicyRegistry {{Brighter.CommandProcessor.RETRYPOLICY, retryPolicy}}; - - var timeProvider = new FakeTimeProvider(); - var tracer = new BrighterTracer(timeProvider); - InMemoryOutbox outbox = new(timeProvider){Tracer = tracer}; - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), - null); - messageMapperRegistry.Register(); - - var producerRegistry = new ProducerRegistry(new Dictionary + var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); + var retryPolicy = Policy.Handle().Retry(); + var policyRegistry = new PolicyRegistry { { - routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyEvent)}) + Brighter.CommandProcessor.RETRYPOLICY, + retryPolicy } - }); - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - new ResiliencePipelineRegistry().AddBrighterDefault(), - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - outbox, - maxOutStandingMessages: -1 - ); - - _commandProcessor = new Brighter.CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - policyRegistry, - new ResiliencePipelineRegistry(), - bus, - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: InstrumentationOptions.All - ); + }; + var timeProvider = new FakeTimeProvider(); + var tracer = new BrighterTracer(timeProvider); + InMemoryOutbox outbox = new(timeProvider) + { + Tracer = tracer + }; + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory((_) => new MyEventMessageMapper()), null); + messageMapperRegistry.Register(); + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyEvent) }) } }); + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, new ResiliencePipelineRegistry().AddBrighterDefault(), messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), outbox, maxOutStandingMessages: -1); + _commandProcessor = new Brighter.CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), bus, new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: InstrumentationOptions.All); } - [Fact] - public void When_Depositing_A_Request_A_Span_Is_Exported() + [Test] + public async Task When_Depositing_A_Request_A_Span_Is_Exported() { //arrange var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - var eventOne = new MyEvent(); var eventTwo = new MyEvent(); var eventThree = new MyEvent(); - var events = new[] {eventOne, eventTwo, eventThree}; - - var context = new RequestContext { Span = parentActivity }; - + var events = new[] + { + eventOne, + eventTwo, + eventThree + }; + var context = new RequestContext + { + Span = parentActivity + }; //act _commandProcessor.DepositPost(events, context); parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //assert - Assert.Equal(8, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - + await Assert.That(_exportedActivities.Count).IsEqualTo(8); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); //first there should be a create activity for the bulk deposit var createActivity = _exportedActivities.Single(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Create.ToSpanName()}"); - Assert.NotNull(createActivity); - Assert.Equal(parentActivity?.Id, createActivity.ParentId); - + await Assert.That(createActivity).IsNotNull(); + await Assert.That(createActivity.ParentId).IsEqualTo(parentActivity?.Id); //Then we should see three activities for each of the deposits var depositActivities = _exportedActivities.Where(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Deposit.ToSpanName()}").ToList(); - Assert.Equal(3, depositActivities.Count); - - for(int i = 0; i < 3; i++) + await Assert.That(depositActivities.Count).IsEqualTo(3); + for (int i = 0; i < 3; i++) { var depositActivity = depositActivities.ElementAt(i); - Assert.Equal(createActivity.Id, depositActivity.ParentId); - - Assert.True(depositActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == events[i].Id)); - Assert.True(depositActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(events[i], JsonSerialisationOptions.Options))); + await Assert.That(depositActivity.ParentId).IsEqualTo(createActivity.Id); + await Assert.That(depositActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == events[i].Id)).IsTrue(); + await Assert.That(depositActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(events[i], JsonSerialisationOptions.Options))).IsTrue(); } - - //TODO: When we deposit multiple we do a bulk write to the Outbox, so we should expect to see a bulk operation at the Db level - // and not an individual operation - + //TODO: When we deposit multiple we do a bulk write to the Outbox, so we should expect to see a bulk operation at the Db level + // and not an individual operation } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Deposit/When_Depositing_Multiple_Requests_Spans_Are_Exported_Async.cs b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Deposit/When_Depositing_Multiple_Requests_Spans_Are_Exported_Async.cs index 7076c23539..edeb2e0599 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Deposit/When_Depositing_Multiple_Requests_Spans_Are_Exported_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Deposit/When_Depositing_Multiple_Requests_Spans_Are_Exported_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -16,126 +16,84 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; using MyEvent = Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles.MyEvent; namespace Paramore.Brighter.Core.Tests.Observability.CommandProcessor.Deposit; - -[Collection("Observability")] +[NotInParallel("Observability")] public class AsyncCommandProcessorMultipleDepositObservabilityTests { private readonly List _exportedActivities; private readonly TracerProvider _traceProvider; private readonly Brighter.CommandProcessor _commandProcessor; - public AsyncCommandProcessorMultipleDepositObservabilityTests() { var routingKey = new RoutingKey("MyEvent"); - var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); var registry = new SubscriberRegistry(); - - var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); - - var retryPolicy = Policy - .Handle() - .RetryAsync(); - - var policyRegistry = new PolicyRegistry {{Brighter.CommandProcessor.RETRYPOLICYASYNC, retryPolicy}}; - - var timeProvider = new FakeTimeProvider(); - var tracer = new BrighterTracer(timeProvider); - InMemoryOutbox outbox = new(timeProvider){Tracer = tracer}; - - var messageMapperRegistry = new MessageMapperRegistry( - null, - new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); - messageMapperRegistry.RegisterAsync(); - - var producerRegistry = new ProducerRegistry(new Dictionary + var handlerFactory = new PostCommandTests.EmptyHandlerFactorySync(); + var retryPolicy = Policy.Handle().RetryAsync(); + var policyRegistry = new PolicyRegistry { { - routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyEvent)}) + Brighter.CommandProcessor.RETRYPOLICYASYNC, + retryPolicy } - }); - - IAmAnOutboxProducerMediator bus = new OutboxProducerMediator( - producerRegistry, - new ResiliencePipelineRegistry().AddBrighterDefault(), - messageMapperRegistry, - new EmptyMessageTransformerFactory(), - new EmptyMessageTransformerFactoryAsync(), - tracer, - new FindPublicationByPublicationTopicOrRequestType(), - outbox, - maxOutStandingMessages: -1 - ); - - _commandProcessor = new Brighter.CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - policyRegistry, - new ResiliencePipelineRegistry(), - bus, - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: InstrumentationOptions.All - ); + }; + var timeProvider = new FakeTimeProvider(); + var tracer = new BrighterTracer(timeProvider); + InMemoryOutbox outbox = new(timeProvider) + { + Tracer = tracer + }; + var messageMapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync((_) => new MyEventMessageMapperAsync())); + messageMapperRegistry.RegisterAsync(); + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, new InMemoryMessageProducer(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyEvent) }) } }); + IAmAnOutboxProducerMediator bus = new OutboxProducerMediator(producerRegistry, new ResiliencePipelineRegistry().AddBrighterDefault(), messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), tracer, new FindPublicationByPublicationTopicOrRequestType(), outbox, maxOutStandingMessages: -1); + _commandProcessor = new Brighter.CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), bus, new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: InstrumentationOptions.All); } - [Fact] + [Test] public async Task When_Depositing_A_Request_A_Span_Is_Exported() { //arrange var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - var eventOne = new MyEvent(); var eventTwo = new MyEvent(); var eventThree = new MyEvent(); - var events = new[] {eventOne, eventTwo, eventThree}; - - var context = new RequestContext { Span = parentActivity }; - + var events = new[] + { + eventOne, + eventTwo, + eventThree + }; + var context = new RequestContext + { + Span = parentActivity + }; //act await _commandProcessor.DepositPostAsync(events, context); parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //assert - Assert.Equal(8, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - + await Assert.That(_exportedActivities.Count).IsEqualTo(8); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); //first there should be a create activity for the bulk deposit var createActivity = _exportedActivities.Single(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Create.ToSpanName()}"); - Assert.NotNull(createActivity); - Assert.Equal(parentActivity?.Id, createActivity.ParentId); - + await Assert.That(createActivity).IsNotNull(); + await Assert.That(createActivity.ParentId).IsEqualTo(parentActivity?.Id); //Then we should see three activities for each of the deposits var depositActivities = _exportedActivities.Where(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Deposit.ToSpanName()}").ToList(); - Assert.Equal(3, depositActivities.Count); - - for(int i = 0; i < 3; i++) + await Assert.That(depositActivities.Count).IsEqualTo(3); + for (int i = 0; i < 3; i++) { var depositActivity = depositActivities.ElementAt(i); - Assert.Equal(createActivity.Id, depositActivity.ParentId); - - Assert.True(depositActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == events[i].Id)); - Assert.True(depositActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(events[i], JsonSerialisationOptions.Options))); + await Assert.That(depositActivity.ParentId).IsEqualTo(createActivity.Id); + await Assert.That(depositActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == events[i].Id)).IsTrue(); + await Assert.That(depositActivity.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(events[i], JsonSerialisationOptions.Options))).IsTrue(); } - - //TODO: When we deposit multiple we do a bulk write to the Outbox, so we should expect to see a bulk operation at the Db level - // and not an individual operation - + //TODO: When we deposit multiple we do a bulk write to the Outbox, so we should expect to see a bulk operation at the Db level + // and not an individual operation } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Publish/When_Publishing_A_Request_A_Span_Is_Exported.cs b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Publish/When_Publishing_A_Request_A_Span_Is_Exported.cs index 03bca93acb..ef564f16e2 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Publish/When_Publishing_A_Request_A_Span_Is_Exported.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Publish/When_Publishing_A_Request_A_Span_Is_Exported.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -11,35 +11,23 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.CommandProcessor.Publish; - -[Collection("Observability")] -public class CommandProcessorPublishObservabilityTests +[NotInParallel("Observability")] +public class CommandProcessorPublishObservabilityTests { private readonly List _exportedActivities; private readonly TracerProvider _traceProvider; private readonly Brighter.CommandProcessor _commandProcessor; - public CommandProcessorPublishObservabilityTests() { var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); BrighterTracer tracer = new(); - - var registry = new SubscriberRegistry(); registry.Register(); registry.Register(); - var handlerFactory = new SimpleHandlerFactorySync(type => { switch (type.Name) @@ -52,81 +40,64 @@ public CommandProcessorPublishObservabilityTests() throw new ArgumentOutOfRangeException(nameof(type.Name), type.Name, null); } }); - - var retryPolicy = Policy - .Handle() - .Retry(); - - var policyRegistry = new PolicyRegistry {{Brighter.CommandProcessor.RETRYPOLICY, retryPolicy}}; - - - _commandProcessor = new Brighter.CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - policyRegistry, - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: InstrumentationOptions.All - ); + var retryPolicy = Policy.Handle().Retry(); + var policyRegistry = new PolicyRegistry + { + { + Brighter.CommandProcessor.RETRYPOLICY, + retryPolicy + } + }; + _commandProcessor = new Brighter.CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: InstrumentationOptions.All); } - [Fact] - public void When_Publishing_A_Request_With_Span_In_Context_Child_Spans_Are_Exported() + [Test] + public async Task When_Publishing_A_Request_With_Span_In_Context_Child_Spans_Are_Exported() { //arrange var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - var @event = new MyEvent(); - var context = new RequestContext { Span = parentActivity }; - + var context = new RequestContext + { + Span = parentActivity + }; //act _commandProcessor.Publish(@event, context); parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //assert - Assert.Equal(4, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); + await Assert.That(_exportedActivities.Count).IsEqualTo(4); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); var createActivity = _exportedActivities.Single(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Create.ToSpanName()}"); - Assert.NotNull(createActivity); - Assert.Equal(parentActivity?.Id, createActivity.ParentId); - + await Assert.That(createActivity).IsNotNull(); + await Assert.That(createActivity.ParentId).IsEqualTo(parentActivity?.Id); //parent span and child spans for each publish operation - Assert.Equal(2, _exportedActivities.Count(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Publish.ToSpanName()}")); - + await Assert.That(_exportedActivities.Count(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Publish.ToSpanName()}")).IsEqualTo(2); var publishActivities = _exportedActivities.Where(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Publish.ToSpanName()}").ToList(); - //--first publish var first = publishActivities.First(activity => activity.Events.Any(e => e.Name == nameof(MyEventHandler))); - Assert.Equal(createActivity.Id, first.ParentId); - Assert.True(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)); - Assert.True(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })); - Assert.True(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); - Assert.True(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })); - + await Assert.That(first.ParentId).IsEqualTo(createActivity.Id); + await Assert.That(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)).IsTrue(); + await Assert.That(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })).IsTrue(); + await Assert.That(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })).IsTrue(); var activityEvent = first.Events.Single(e => e.Name == nameof(MyEventHandler) || e.Name == nameof(MyOtherEventHandler)); - Assert.True(activityEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == activityEvent.Name)); - Assert.True(activityEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")); - Assert.True(activityEvent.Tags.Any(t => t.Value != null && t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); - + await Assert.That(activityEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == activityEvent.Name)).IsTrue(); + await Assert.That(activityEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")).IsTrue(); + await Assert.That(activityEvent.Tags.Any(t => t.Value != null && t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); //--second publish var second = publishActivities.First(activity => activity.Events.Any(e => e.Name == nameof(MyOtherEventHandler))); - Assert.Equal(createActivity.Id, second.ParentId); - Assert.True(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)); - Assert.True(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })); - Assert.True(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); - Assert.True(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })); - + await Assert.That(second.ParentId).IsEqualTo(createActivity.Id); + await Assert.That(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)).IsTrue(); + await Assert.That(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })).IsTrue(); + await Assert.That(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })).IsTrue(); activityEvent = second.Events.Single(e => e.Name == nameof(MyEventHandler) || e.Name == nameof(MyOtherEventHandler)); - Assert.True(activityEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == activityEvent.Name)); - Assert.True(activityEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")); - Assert.True(activityEvent.Tags.Any(t => t.Value != null && t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); - - //TODO: Needs adding when https://github.com/dotnet/runtime/pull/101381 is released - /* + await Assert.That(activityEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == activityEvent.Name)).IsTrue(); + await Assert.That(activityEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")).IsTrue(); + await Assert.That(activityEvent.Tags.Any(t => t.Value != null && t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); + //TODO: Needs adding when https://github.com/dotnet/runtime/pull/101381 is released + /* //--check the links first.Links.Count().Should().Be(1); first.Links.Single().Context.Should().Be(second.Context); @@ -135,64 +106,54 @@ public void When_Publishing_A_Request_With_Span_In_Context_Child_Spans_Are_Expor */ } - [Fact] - public void When_Publishing_A_Request_With_Span_In_ActivityCurrent_Child_Spans_Are_Exported() + [Test] + public async Task When_Publishing_A_Request_With_Span_In_ActivityCurrent_Child_Spans_Are_Exported() { //arrange + Activity.Current = null; var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - var @event = new MyEvent(); var context = new RequestContext(); Activity.Current = parentActivity; - //act _commandProcessor.Publish(@event, context); parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //assert - Assert.Equal(4, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); + await Assert.That(_exportedActivities.Count).IsEqualTo(4); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); var createActivity = _exportedActivities.Single(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Create.ToSpanName()}"); - Assert.NotNull(createActivity); - Assert.Equal(parentActivity?.Id, createActivity.ParentId); - + await Assert.That(createActivity).IsNotNull(); + await Assert.That(createActivity.ParentId).IsEqualTo(parentActivity?.Id); //parent span and child spans for each publish operation - Assert.Equal(2, _exportedActivities.Count(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Publish.ToSpanName()}")); - + await Assert.That(_exportedActivities.Count(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Publish.ToSpanName()}")).IsEqualTo(2); var publishActivities = _exportedActivities.Where(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Publish.ToSpanName()}").ToList(); - //--first publish var first = publishActivities.First(activity => activity.Events.Any(e => e.Name == nameof(MyEventHandler))); - Assert.Equal(createActivity.Id, first.ParentId); - Assert.True(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)); - Assert.True(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })); - Assert.True(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); - Assert.True(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })); - - Assert.Equal(1, first.Events.Count()); - Assert.Equal(nameof(MyEventHandler), first.Events.First().Name); - Assert.True(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyEventHandler))); - Assert.True(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")); - Assert.True(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); - + await Assert.That(first.ParentId).IsEqualTo(createActivity.Id); + await Assert.That(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)).IsTrue(); + await Assert.That(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })).IsTrue(); + await Assert.That(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })).IsTrue(); + await Assert.That(first.Events.Count()).IsEqualTo(1); + await Assert.That(first.Events.First().Name).IsEqualTo(nameof(MyEventHandler)); + await Assert.That(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyEventHandler))).IsTrue(); + await Assert.That(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")).IsTrue(); + await Assert.That(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); //--second publish var second = publishActivities.First(activity => activity.Events.Any(e => e.Name == nameof(MyOtherEventHandler))); - Assert.Equal(createActivity.Id, second.ParentId); - Assert.True(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)); - Assert.True(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })); - Assert.True(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); - Assert.True(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })); - - Assert.Equal(1, second.Events.Count()); - Assert.Equal(nameof(MyOtherEventHandler), second.Events.First().Name); - Assert.True(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyOtherEventHandler))); - Assert.True(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")); - Assert.True(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); - - //TODO: Needs adding when https://github.com/dotnet/runtime/pull/101381 is released - /* + await Assert.That(second.ParentId).IsEqualTo(createActivity.Id); + await Assert.That(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)).IsTrue(); + await Assert.That(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })).IsTrue(); + await Assert.That(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })).IsTrue(); + await Assert.That(second.Events.Count()).IsEqualTo(1); + await Assert.That(second.Events.First().Name).IsEqualTo(nameof(MyOtherEventHandler)); + await Assert.That(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyOtherEventHandler))).IsTrue(); + await Assert.That(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")).IsTrue(); + await Assert.That(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); + //TODO: Needs adding when https://github.com/dotnet/runtime/pull/101381 is released + /* //--check the links first.Links.Count().Should().Be(1); first.Links.Single().Context.Should().Be(second.Context); @@ -201,66 +162,56 @@ public void When_Publishing_A_Request_With_Span_In_ActivityCurrent_Child_Spans_A */ } - [Fact] - public void When_Sending_A_Request_With_No_Context_Or_Span_In_ActivityCurrent_A_Root_Span_Is_Exported() + [Test] + public async Task When_Sending_A_Request_With_No_Context_Or_Span_In_ActivityCurrent_A_Root_Span_Is_Exported() { //arrange + Activity.Current = null; var @event = new MyEvent(); var context = new RequestContext(); - //act _commandProcessor.Publish(@event, context); - _traceProvider.ForceFlush(); - //assert - Assert.Equal(3, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); + await Assert.That(_exportedActivities.Count).IsEqualTo(3); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); var createActivity = _exportedActivities.Single(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Create.ToSpanName()}"); - Assert.NotNull(createActivity); - Assert.Null(createActivity.ParentId); - + await Assert.That(createActivity).IsNotNull(); + await Assert.That(createActivity.ParentId).IsNull(); //parent span and child spans for each publish operation - Assert.Equal(2, _exportedActivities.Count(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Publish.ToSpanName()}")); - + await Assert.That(_exportedActivities.Count(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Publish.ToSpanName()}")).IsEqualTo(2); var publishActivities = _exportedActivities.Where(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Publish.ToSpanName()}").ToList(); - //--first publish var first = publishActivities.First(activity => activity.Events.Any(e => e.Name == nameof(MyEventHandler))); - Assert.Equal(createActivity.Id, first.ParentId); - Assert.True(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)); - Assert.True(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })); - Assert.True(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); - Assert.True(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })); - - Assert.Equal(1, first.Events.Count()); - Assert.Equal(nameof(MyEventHandler), first.Events.First().Name); - Assert.True(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyEventHandler))); - Assert.True(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")); - Assert.True(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); - + await Assert.That(first.ParentId).IsEqualTo(createActivity.Id); + await Assert.That(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)).IsTrue(); + await Assert.That(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })).IsTrue(); + await Assert.That(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })).IsTrue(); + await Assert.That(first.Events.Count()).IsEqualTo(1); + await Assert.That(first.Events.First().Name).IsEqualTo(nameof(MyEventHandler)); + await Assert.That(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyEventHandler))).IsTrue(); + await Assert.That(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")).IsTrue(); + await Assert.That(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); //--second publish var second = publishActivities.First(activity => activity.Events.Any(e => e.Name == nameof(MyOtherEventHandler))); - Assert.Equal(createActivity.Id, second.ParentId); - Assert.True(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)); - Assert.True(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })); - Assert.True(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); - Assert.True(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })); - - Assert.Equal(1, second.Events.Count()); - Assert.Equal(nameof(MyOtherEventHandler), second.Events.First().Name); - Assert.True(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyOtherEventHandler))); - Assert.True(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")); - Assert.True(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); - - //TODO: Needs adding when https://github.com/dotnet/runtime/pull/101381 is released - /* + await Assert.That(second.ParentId).IsEqualTo(createActivity.Id); + await Assert.That(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)).IsTrue(); + await Assert.That(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })).IsTrue(); + await Assert.That(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })).IsTrue(); + await Assert.That(second.Events.Count()).IsEqualTo(1); + await Assert.That(second.Events.First().Name).IsEqualTo(nameof(MyOtherEventHandler)); + await Assert.That(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyOtherEventHandler))).IsTrue(); + await Assert.That(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")).IsTrue(); + await Assert.That(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); + //TODO: Needs adding when https://github.com/dotnet/runtime/pull/101381 is released + /* //--check the links first.Links.Count().Should().Be(1); first.Links.Single().Context.Should().Be(second.Context); second.Links.Count().Should().Be(1); second.Links.Single().Context.Should().Be(first.Context); - */ + */ } - -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Publish/When_Publishing_A_Request_A_Span_Is_Exported_Asyn.cs b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Publish/When_Publishing_A_Request_A_Span_Is_Exported_Asyn.cs index f4260079b3..3c61af925e 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Publish/When_Publishing_A_Request_A_Span_Is_Exported_Asyn.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Publish/When_Publishing_A_Request_A_Span_Is_Exported_Asyn.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -12,34 +12,23 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.CommandProcessor.Publish; - -public class AsyncCommandProcessorPublishObservabilityTests +[NotInParallel("Observability")] +public class AsyncCommandProcessorPublishObservabilityTests { private readonly List _exportedActivities; private readonly TracerProvider _traceProvider; private readonly Brighter.CommandProcessor _commandProcessor; - public AsyncCommandProcessorPublishObservabilityTests() { var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); BrighterTracer tracer = new(); - - var registry = new SubscriberRegistry(); registry.RegisterAsync(); registry.RegisterAsync(); - var handlerFactory = new SimpleHandlerFactoryAsync(type => { switch (type.Name) @@ -52,83 +41,66 @@ public AsyncCommandProcessorPublishObservabilityTests() throw new ArgumentOutOfRangeException(nameof(type.Name), type.Name, null); } }); - - var retryPolicy = Policy - .Handle() - .RetryAsync(); - - var policyRegistry = new PolicyRegistry {{Brighter.CommandProcessor.RETRYPOLICYASYNC, retryPolicy}}; - - - _commandProcessor = new Brighter.CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - policyRegistry, - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: InstrumentationOptions.All - ); + var retryPolicy = Policy.Handle().RetryAsync(); + var policyRegistry = new PolicyRegistry + { + { + Brighter.CommandProcessor.RETRYPOLICYASYNC, + retryPolicy + } + }; + _commandProcessor = new Brighter.CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: InstrumentationOptions.All); } - [Fact] + [Test] public async Task When_Publishing_A_Request_With_Span_In_Context_Child_Spans_Are_Exported() { //arrange var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - var @event = new MyEvent(); - var context = new RequestContext { Span = parentActivity }; - + var context = new RequestContext + { + Span = parentActivity + }; //act await _commandProcessor.PublishAsync(@event, context); parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //assert - Assert.Equal(4, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); + await Assert.That(_exportedActivities.Count).IsEqualTo(4); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); var createActivity = _exportedActivities.Single(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Create.ToSpanName()}"); - Assert.NotNull(createActivity); - Assert.Equal(parentActivity?.Id, createActivity.ParentId); - + await Assert.That(createActivity).IsNotNull(); + await Assert.That(createActivity.ParentId).IsEqualTo(parentActivity?.Id); //parent span and child spans for each publish operation - Assert.Equal(2, _exportedActivities.Count(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Publish.ToSpanName()}")); - + await Assert.That(_exportedActivities.Count(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Publish.ToSpanName()}")).IsEqualTo(2); var publishActivities = _exportedActivities.Where(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Publish.ToSpanName()}").ToList(); - //--first publish var first = publishActivities.First(activity => activity.Events.Any(e => e.Name == nameof(MyEventHandlerAsync))); - Assert.Equal(createActivity.Id, first.ParentId); - Assert.True(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)); - Assert.True(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })); - Assert.True(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); - Assert.True(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })); - - Assert.Equal(1, first.Events.Count()); - Assert.Equal(nameof(MyEventHandlerAsync), first.Events.First().Name); - Assert.True(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyEventHandlerAsync))); - Assert.True(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")); - Assert.True(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); - + await Assert.That(first.ParentId).IsEqualTo(createActivity.Id); + await Assert.That(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)).IsTrue(); + await Assert.That(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })).IsTrue(); + await Assert.That(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })).IsTrue(); + await Assert.That(first.Events.Count()).IsEqualTo(1); + await Assert.That(first.Events.First().Name).IsEqualTo(nameof(MyEventHandlerAsync)); + await Assert.That(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyEventHandlerAsync))).IsTrue(); + await Assert.That(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")).IsTrue(); + await Assert.That(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); //--second publish var second = publishActivities.First(activity => activity.Events.Any(e => e.Name == nameof(MyOtherEventHandlerAsync))); - Assert.Equal(createActivity.Id, second.ParentId); - Assert.True(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)); - Assert.True(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })); - Assert.True(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); - Assert.True(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })); - - Assert.Equal(1, second.Events.Count()); - Assert.Equal(nameof(MyOtherEventHandlerAsync), second.Events.First().Name); - Assert.True(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyOtherEventHandlerAsync))); - Assert.True(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")); - Assert.True(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); - - //TODO: Needs adding when https://github.com/dotnet/runtime/pull/101381 is released - /* + await Assert.That(second.ParentId).IsEqualTo(createActivity.Id); + await Assert.That(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)).IsTrue(); + await Assert.That(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })).IsTrue(); + await Assert.That(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })).IsTrue(); + await Assert.That(second.Events.Count()).IsEqualTo(1); + await Assert.That(second.Events.First().Name).IsEqualTo(nameof(MyOtherEventHandlerAsync)); + await Assert.That(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyOtherEventHandlerAsync))).IsTrue(); + await Assert.That(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")).IsTrue(); + await Assert.That(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); + //TODO: Needs adding when https://github.com/dotnet/runtime/pull/101381 is released + /* //--check the links first.Links.Count().Should().Be(1); first.Links.Single().Context.Should().Be(second.Context); @@ -137,64 +109,54 @@ public async Task When_Publishing_A_Request_With_Span_In_Context_Child_Spans_Are */ } - [Fact] + [Test] public async Task When_Publishing_A_Request_With_Span_In_ActivityCurrent_Child_Spans_Are_Exported() { //arrange + Activity.Current = null; var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - var @event = new MyEvent(); var context = new RequestContext(); Activity.Current = parentActivity; - //act await _commandProcessor.PublishAsync(@event, context); parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //assert - Assert.Equal(4, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); + await Assert.That(_exportedActivities.Count).IsEqualTo(4); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); var createActivity = _exportedActivities.Single(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Create.ToSpanName()}"); - Assert.NotNull(createActivity); - Assert.Equal(parentActivity?.Id, createActivity.ParentId); - + await Assert.That(createActivity).IsNotNull(); + await Assert.That(createActivity.ParentId).IsEqualTo(parentActivity?.Id); //parent span and child spans for each publish operation - Assert.Equal(2, _exportedActivities.Count(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Publish.ToSpanName()}")); - + await Assert.That(_exportedActivities.Count(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Publish.ToSpanName()}")).IsEqualTo(2); var publishActivities = _exportedActivities.Where(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Publish.ToSpanName()}").ToList(); - //--first publish var first = publishActivities.First(activity => activity.Events.Any(e => e.Name == nameof(MyEventHandlerAsync))); - Assert.Equal(createActivity.Id, first.ParentId); - Assert.True(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)); - Assert.True(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })); - Assert.True(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); - Assert.True(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })); - - Assert.Equal(1, first.Events.Count()); - Assert.Equal(nameof(MyEventHandlerAsync), first.Events.First().Name); - Assert.True(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyEventHandlerAsync))); - Assert.True(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")); - Assert.True(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); - + await Assert.That(first.ParentId).IsEqualTo(createActivity.Id); + await Assert.That(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)).IsTrue(); + await Assert.That(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })).IsTrue(); + await Assert.That(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })).IsTrue(); + await Assert.That(first.Events.Count()).IsEqualTo(1); + await Assert.That(first.Events.First().Name).IsEqualTo(nameof(MyEventHandlerAsync)); + await Assert.That(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyEventHandlerAsync))).IsTrue(); + await Assert.That(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")).IsTrue(); + await Assert.That(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); //--second publish var second = publishActivities.First(activity => activity.Events.Any(e => e.Name == nameof(MyOtherEventHandlerAsync))); - Assert.Equal(createActivity.Id, second.ParentId); - Assert.True(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)); - Assert.True(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })); - Assert.True(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); - Assert.True(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })); - - Assert.Equal(1, second.Events.Count()); - Assert.Equal(nameof(MyOtherEventHandlerAsync), second.Events.First().Name); - Assert.True(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyOtherEventHandlerAsync))); - Assert.True(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")); - Assert.True(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); - - //TODO: Needs adding when https://github.com/dotnet/runtime/pull/101381 is released - /* + await Assert.That(second.ParentId).IsEqualTo(createActivity.Id); + await Assert.That(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)).IsTrue(); + await Assert.That(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })).IsTrue(); + await Assert.That(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })).IsTrue(); + await Assert.That(second.Events.Count()).IsEqualTo(1); + await Assert.That(second.Events.First().Name).IsEqualTo(nameof(MyOtherEventHandlerAsync)); + await Assert.That(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyOtherEventHandlerAsync))).IsTrue(); + await Assert.That(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")).IsTrue(); + await Assert.That(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); + //TODO: Needs adding when https://github.com/dotnet/runtime/pull/101381 is released + /* //--check the links first.Links.Count().Should().Be(1); first.Links.Single().Context.Should().Be(second.Context); @@ -203,66 +165,56 @@ public async Task When_Publishing_A_Request_With_Span_In_ActivityCurrent_Child_S */ } - [Fact] + [Test] public async Task When_Sending_A_Request_With_No_Context_Or_Span_In_ActivityCurrent_A_Root_Span_Is_Exported() { //arrange + Activity.Current = null; var @event = new MyEvent(); var context = new RequestContext(); - //act await _commandProcessor.PublishAsync(@event, context); - _traceProvider.ForceFlush(); - //assert - Assert.Equal(3, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); + await Assert.That(_exportedActivities.Count).IsEqualTo(3); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); var createActivity = _exportedActivities.Single(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Create.ToSpanName()}"); - Assert.NotNull(createActivity); - Assert.Null(createActivity.ParentId); - + await Assert.That(createActivity).IsNotNull(); + await Assert.That(createActivity.ParentId).IsNull(); //parent span and child spans for each publish operation - Assert.Equal(2, _exportedActivities.Count(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Publish.ToSpanName()}")); - + await Assert.That(_exportedActivities.Count(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Publish.ToSpanName()}")).IsEqualTo(2); var publishActivities = _exportedActivities.Where(a => a.DisplayName == $"{nameof(MyEvent)} {CommandProcessorSpanOperation.Publish.ToSpanName()}").ToList(); - //--first publish var first = publishActivities.First(activity => activity.Events.Any(e => e.Name == nameof(MyEventHandlerAsync))); - Assert.Equal(createActivity.Id, first.ParentId); - Assert.True(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)); - Assert.True(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })); - Assert.True(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); - Assert.True(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })); - - Assert.Equal(1, first.Events.Count()); - Assert.Equal(nameof(MyEventHandlerAsync), first.Events.First().Name); - Assert.True(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyEventHandlerAsync))); - Assert.True(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")); - Assert.True(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); - + await Assert.That(first.ParentId).IsEqualTo(createActivity.Id); + await Assert.That(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)).IsTrue(); + await Assert.That(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })).IsTrue(); + await Assert.That(first.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(first.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })).IsTrue(); + await Assert.That(first.Events.Count()).IsEqualTo(1); + await Assert.That(first.Events.First().Name).IsEqualTo(nameof(MyEventHandlerAsync)); + await Assert.That(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyEventHandlerAsync))).IsTrue(); + await Assert.That(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")).IsTrue(); + await Assert.That(first.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); //--second publish var second = publishActivities.First(activity => activity.Events.Any(e => e.Name == nameof(MyOtherEventHandlerAsync))); - Assert.Equal(createActivity.Id, second.ParentId); - Assert.True(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)); - Assert.True(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })); - Assert.True(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))); - Assert.True(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })); - - Assert.Equal(1, second.Events.Count()); - Assert.Equal(nameof(MyOtherEventHandlerAsync), second.Events.First().Name); - Assert.True(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyOtherEventHandlerAsync))); - Assert.True(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")); - Assert.True(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); - - //TODO: Needs adding when https://github.com/dotnet/runtime/pull/101381 is released - /* + await Assert.That(second.ParentId).IsEqualTo(createActivity.Id); + await Assert.That(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == @event.Id)).IsTrue(); + await Assert.That(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyEvent) })).IsTrue(); + await Assert.That(second.Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(@event, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(second.Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })).IsTrue(); + await Assert.That(second.Events.Count()).IsEqualTo(1); + await Assert.That(second.Events.First().Name).IsEqualTo(nameof(MyOtherEventHandlerAsync)); + await Assert.That(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyOtherEventHandlerAsync))).IsTrue(); + await Assert.That(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")).IsTrue(); + await Assert.That(second.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); + //TODO: Needs adding when https://github.com/dotnet/runtime/pull/101381 is released + /* //--check the links first.Links.Count().Should().Be(1); first.Links.Single().Context.Should().Be(second.Context); second.Links.Count().Should().Be(1); second.Links.Single().Context.Should().Be(first.Context); - */ + */ } - -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Scheduler/When_Scheduling_A_Request_A_Span_Is_Exported.cs b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Scheduler/When_Scheduling_A_Request_A_Span_Is_Exported.cs index d6e6bc55ae..998f46bd51 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Scheduler/When_Scheduling_A_Request_A_Span_Is_Exported.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Scheduler/When_Scheduling_A_Request_A_Span_Is_Exported.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -14,177 +14,143 @@ using Paramore.Brighter.Scheduler.Handlers; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.CommandProcessor.Scheduler; - -[Collection("Observability")] -public class CommandProcessorSchedulerObservabilityTests +[NotInParallel("Observability")] +public class CommandProcessorSchedulerObservabilityTests { private readonly List _exportedActivities; private readonly TracerProvider _traceProvider; private readonly Brighter.CommandProcessor _commandProcessor; private readonly FakeTimeProvider _timeProvider; - public CommandProcessorSchedulerObservabilityTests() { - PipelineBuilder.ClearPipelineCache(); - _timeProvider = new FakeTimeProvider(DateTimeOffset.Now); - var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); BrighterTracer tracer = new(); - - var registry = new SubscriberRegistry(); registry.Register(); registry.RegisterAsync(); - var handlerFactory = new SimpleHandlerFactory(_ => new MyCommandHandler(new Dictionary()), _ => new FireSchedulerRequestHandler(_commandProcessor!)); - - var policyRegistry = new PolicyRegistry + var policyRegistry = new PolicyRegistry { - {Brighter.CommandProcessor.RETRYPOLICY, Policy.Handle().Retry()}, - {Brighter.CommandProcessor.RETRYPOLICYASYNC, Policy.Handle().RetryAsync()}, - + { + Brighter.CommandProcessor.RETRYPOLICY, + Policy.Handle().Retry() + }, + { + Brighter.CommandProcessor.RETRYPOLICYASYNC, + Policy.Handle().RetryAsync() + }, }; - - - _commandProcessor = new Brighter.CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - policyRegistry, - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory{TimeProvider = _timeProvider}, - tracer: tracer, - instrumentationOptions: InstrumentationOptions.All - ); + _commandProcessor = new Brighter.CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory { TimeProvider = _timeProvider }, tracer: tracer, instrumentationOptions: InstrumentationOptions.All); } - [Fact] - public void When_Scheduling_A_Sending_A_Request_With_Span_In_Context_A_Child_Span_Is_Exported() + [Test] + public async Task When_Scheduling_A_Sending_A_Request_With_Span_In_Context_A_Child_Span_Is_Exported() { //arrange var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - - var command = new MyCommand{ Value = "My Test String" }; - var context = new RequestContext { Span = parentActivity }; - + var command = new MyCommand + { + Value = "My Test String" + }; + var context = new RequestContext + { + Span = parentActivity + }; //act _commandProcessor.Send(TimeSpan.FromSeconds(1), command, context); - parentActivity?.Stop(); - _traceProvider.ForceFlush(); - - Assert.Equal(2, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - Assert.True(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Scheduler.ToSpanName()}")); - Assert.Equal(parentActivity?.Id, _exportedActivities.First().ParentId); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "scheduler" })); - Assert.Equal(0, _exportedActivities.First().Events.Count()); - + await Assert.That(_exportedActivities.Count).IsEqualTo(2); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Scheduler.ToSpanName()}")).IsTrue(); + await Assert.That(_exportedActivities.First().ParentId).IsEqualTo(parentActivity?.Id); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "scheduler" })).IsTrue(); + await Assert.That(_exportedActivities.First().Events.Count()).IsEqualTo(0); _exportedActivities.Clear(); - parentActivity?.Start(); _timeProvider.Advance(TimeSpan.FromSeconds(10)); - parentActivity?.Stop(); _traceProvider.ForceFlush(); - - Assert.Equal(2, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - Assert.True(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Send.ToSpanName()}")); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" })); - - Assert.Equal(nameof(MyCommandHandler), _exportedActivities.First().Events.First().Name); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyCommandHandler))); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); - - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - Assert.True(_exportedActivities.Any(a => a.DisplayName == $"{nameof(FireSchedulerRequest)} {CommandProcessorSpanOperation.Send.ToSpanName()}")); - Assert.True(_exportedActivities[1].Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(FireSchedulerRequest) })); - Assert.True(_exportedActivities[1].Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && !string.IsNullOrEmpty(t.Value))); - Assert.True(_exportedActivities[1].Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" })); - - Assert.Equal(nameof(FireSchedulerRequestHandler), _exportedActivities[1].Events.First().Name); - Assert.True(_exportedActivities[1].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(FireSchedulerRequestHandler))); - Assert.True(_exportedActivities[1].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")); - Assert.True(_exportedActivities[1].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); + await Assert.That(_exportedActivities.Count).IsEqualTo(2); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Send.ToSpanName()}")).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" })).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Name).IsEqualTo(nameof(MyCommandHandler)); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyCommandHandler))).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.DisplayName == $"{nameof(FireSchedulerRequest)} {CommandProcessorSpanOperation.Send.ToSpanName()}")).IsTrue(); + await Assert.That(_exportedActivities[1].Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(FireSchedulerRequest) })).IsTrue(); + await Assert.That(_exportedActivities[1].Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && !string.IsNullOrEmpty(t.Value))).IsTrue(); + await Assert.That(_exportedActivities[1].Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" })).IsTrue(); + await Assert.That(_exportedActivities[1].Events.First().Name).IsEqualTo(nameof(FireSchedulerRequestHandler)); + await Assert.That(_exportedActivities[1].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(FireSchedulerRequestHandler))).IsTrue(); + await Assert.That(_exportedActivities[1].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")).IsTrue(); + await Assert.That(_exportedActivities[1].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); } - - [Fact] - public void When_Scheduling_A_Publish_A_Request_With_Span_In_Context_A_Child_Span_Is_Exported() + + [Test] + public async Task When_Scheduling_A_Publish_A_Request_With_Span_In_Context_A_Child_Span_Is_Exported() { //arrange var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - - var command = new MyCommand{ Value = "My Test String" }; - var context = new RequestContext { Span = parentActivity }; - + var command = new MyCommand + { + Value = "My Test String" + }; + var context = new RequestContext + { + Span = parentActivity + }; //act _commandProcessor.Publish(TimeSpan.FromSeconds(1), command, context); - parentActivity?.Stop(); - _traceProvider.ForceFlush(); - - Assert.Equal(2, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - Assert.True(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Scheduler.ToSpanName()}")); - Assert.Equal(parentActivity?.Id, _exportedActivities.First().ParentId); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "scheduler" })); - Assert.Equal(0, _exportedActivities.First().Events.Count()); - + await Assert.That(_exportedActivities.Count).IsEqualTo(2); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Scheduler.ToSpanName()}")).IsTrue(); + await Assert.That(_exportedActivities.First().ParentId).IsEqualTo(parentActivity?.Id); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "scheduler" })).IsTrue(); + await Assert.That(_exportedActivities.First().Events.Count()).IsEqualTo(0); _exportedActivities.Clear(); - parentActivity?.Start(); _timeProvider.Advance(TimeSpan.FromSeconds(10)); - parentActivity?.Stop(); _traceProvider.ForceFlush(); - - Assert.Equal(3, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - Assert.True(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Publish.ToSpanName()}")); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })); - - Assert.Equal(nameof(MyCommandHandler), _exportedActivities.First().Events.First().Name); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyCommandHandler))); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); - - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - Assert.True(_exportedActivities.Any(a => a.DisplayName == $"{nameof(FireSchedulerRequest)} {CommandProcessorSpanOperation.Send.ToSpanName()}")); - Assert.True(_exportedActivities[2].Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(FireSchedulerRequest) })); - Assert.True(_exportedActivities[2].Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && !string.IsNullOrEmpty(t.Value))); - Assert.True(_exportedActivities[2].Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" })); - - Assert.Equal(nameof(FireSchedulerRequestHandler), _exportedActivities[2].Events.First().Name); - Assert.True(_exportedActivities[2].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(FireSchedulerRequestHandler))); - Assert.True(_exportedActivities[2].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")); - Assert.True(_exportedActivities[2].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); + await Assert.That(_exportedActivities.Count).IsEqualTo(3); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Publish.ToSpanName()}")).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Name).IsEqualTo(nameof(MyCommandHandler)); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyCommandHandler))).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.DisplayName == $"{nameof(FireSchedulerRequest)} {CommandProcessorSpanOperation.Send.ToSpanName()}")).IsTrue(); + await Assert.That(_exportedActivities[2].Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(FireSchedulerRequest) })).IsTrue(); + await Assert.That(_exportedActivities[2].Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && !string.IsNullOrEmpty(t.Value))).IsTrue(); + await Assert.That(_exportedActivities[2].Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" })).IsTrue(); + await Assert.That(_exportedActivities[2].Events.First().Name).IsEqualTo(nameof(FireSchedulerRequestHandler)); + await Assert.That(_exportedActivities[2].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(FireSchedulerRequestHandler))).IsTrue(); + await Assert.That(_exportedActivities[2].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")).IsTrue(); + await Assert.That(_exportedActivities[2].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Scheduler/When_Scheduling_A_Request_A_Span_Is_Exported_Async.cs b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Scheduler/When_Scheduling_A_Request_A_Span_Is_Exported_Async.cs index 46ff28597e..4cd54ea869 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Scheduler/When_Scheduling_A_Request_A_Span_Is_Exported_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Scheduler/When_Scheduling_A_Request_A_Span_Is_Exported_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -15,40 +15,25 @@ using Paramore.Brighter.Scheduler.Handlers; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.CommandProcessor.Scheduler; - -[Collection("Observability")] -public class CommandProcessorSchedulerObservabilityAsyncTests +[NotInParallel("Observability")] +public class CommandProcessorSchedulerObservabilityAsyncTests { private readonly List _exportedActivities; private readonly TracerProvider _traceProvider; private readonly Brighter.CommandProcessor _commandProcessor; private readonly FakeTimeProvider _timeProvider; - public CommandProcessorSchedulerObservabilityAsyncTests() { - PipelineBuilder.ClearPipelineCache(); - _timeProvider = new FakeTimeProvider(DateTimeOffset.Now); - var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); BrighterTracer tracer = new(); - - var registry = new SubscriberRegistry(); registry.RegisterAsync(); registry.RegisterAsync(); - var handlerFactory = new SimpleHandlerFactory(_ => null!, type => { if (type == typeof(FireSchedulerRequestHandler)) @@ -58,142 +43,119 @@ public CommandProcessorSchedulerObservabilityAsyncTests() return new MyCommandHandlerAsync(new Dictionary()); }); - - var policyRegistry = new PolicyRegistry + var policyRegistry = new PolicyRegistry { - {Brighter.CommandProcessor.RETRYPOLICYASYNC, Policy.Handle().RetryAsync()}, - + { + Brighter.CommandProcessor.RETRYPOLICYASYNC, + Policy.Handle().RetryAsync() + }, }; - - - _commandProcessor = new Brighter.CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - policyRegistry, - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory{TimeProvider = _timeProvider}, - tracer: tracer, - instrumentationOptions: InstrumentationOptions.All - ); + _commandProcessor = new Brighter.CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory { TimeProvider = _timeProvider }, tracer: tracer, instrumentationOptions: InstrumentationOptions.All); } - [Fact] + [Test] public async Task When_Scheduling_A_Sending_A_Request_With_Span_In_Context_A_Child_Span_Is_Exported_Async() { //arrange var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - - var command = new MyCommand{ Value = "My Test String" }; - var context = new RequestContext { Span = parentActivity }; - + var command = new MyCommand + { + Value = "My Test String" + }; + var context = new RequestContext + { + Span = parentActivity + }; //act await _commandProcessor.SendAsync(TimeSpan.FromSeconds(1), command, context); - parentActivity?.Stop(); - _traceProvider.ForceFlush(); - - Assert.Equal(2, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - Assert.True(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Scheduler.ToSpanName()}")); - Assert.Equal(parentActivity?.Id, _exportedActivities.First().ParentId); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "scheduler" })); - Assert.Equal(0, _exportedActivities.First().Events.Count()); - + await Assert.That(_exportedActivities.Count).IsEqualTo(2); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Scheduler.ToSpanName()}")).IsTrue(); + await Assert.That(_exportedActivities.First().ParentId).IsEqualTo(parentActivity?.Id); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "scheduler" })).IsTrue(); + await Assert.That(_exportedActivities.First().Events.Count()).IsEqualTo(0); _exportedActivities.Clear(); - parentActivity?.Start(); _timeProvider.Advance(TimeSpan.FromSeconds(10)); - parentActivity?.Stop(); _traceProvider.ForceFlush(); - - Assert.Equal(2, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - Assert.True(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Send.ToSpanName()}")); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" })); - - Assert.Equal(nameof(MyCommandHandlerAsync), _exportedActivities.First().Events.First().Name); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyCommandHandlerAsync))); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); - - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - Assert.True(_exportedActivities.Any(a => a.DisplayName == $"{nameof(FireSchedulerRequest)} {CommandProcessorSpanOperation.Send.ToSpanName()}")); - Assert.True(_exportedActivities[1].Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(FireSchedulerRequest) })); - Assert.True(_exportedActivities[1].Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && !string.IsNullOrEmpty(t.Value))); - Assert.True(_exportedActivities[1].Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" })); - - Assert.Equal(nameof(FireSchedulerRequestHandler), _exportedActivities[1].Events.First().Name); - Assert.True(_exportedActivities[1].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(FireSchedulerRequestHandler))); - Assert.True(_exportedActivities[1].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")); - Assert.True(_exportedActivities[1].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); + await Assert.That(_exportedActivities.Count).IsEqualTo(2); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Send.ToSpanName()}")).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" })).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Name).IsEqualTo(nameof(MyCommandHandlerAsync)); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyCommandHandlerAsync))).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.DisplayName == $"{nameof(FireSchedulerRequest)} {CommandProcessorSpanOperation.Send.ToSpanName()}")).IsTrue(); + await Assert.That(_exportedActivities[1].Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(FireSchedulerRequest) })).IsTrue(); + await Assert.That(_exportedActivities[1].Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && !string.IsNullOrEmpty(t.Value))).IsTrue(); + await Assert.That(_exportedActivities[1].Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" })).IsTrue(); + await Assert.That(_exportedActivities[1].Events.First().Name).IsEqualTo(nameof(FireSchedulerRequestHandler)); + await Assert.That(_exportedActivities[1].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(FireSchedulerRequestHandler))).IsTrue(); + await Assert.That(_exportedActivities[1].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")).IsTrue(); + await Assert.That(_exportedActivities[1].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); } - - [Fact] + + [Test] public async Task When_Scheduling_A_Publish_A_Request_With_Span_In_Context_A_Child_Span_Is_Exported_Async() { //arrange var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - - var command = new MyCommand{ Value = "My Test String" }; - var context = new RequestContext { Span = parentActivity }; - + var command = new MyCommand + { + Value = "My Test String" + }; + var context = new RequestContext + { + Span = parentActivity + }; //act await _commandProcessor.PublishAsync(TimeSpan.FromSeconds(1), command, context); - parentActivity?.Stop(); - _traceProvider.ForceFlush(); - - Assert.Equal(2, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - Assert.True(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Scheduler.ToSpanName()}")); - Assert.Equal(parentActivity?.Id, _exportedActivities.First().ParentId); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "scheduler" })); - Assert.Equal(0, _exportedActivities.First().Events.Count()); - + await Assert.That(_exportedActivities.Count).IsEqualTo(2); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Scheduler.ToSpanName()}")).IsTrue(); + await Assert.That(_exportedActivities.First().ParentId).IsEqualTo(parentActivity?.Id); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "scheduler" })).IsTrue(); + await Assert.That(_exportedActivities.First().Events.Count()).IsEqualTo(0); _exportedActivities.Clear(); - parentActivity?.Start(); _timeProvider.Advance(TimeSpan.FromSeconds(10)); - parentActivity?.Stop(); _traceProvider.ForceFlush(); - - Assert.Equal(3, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - Assert.True(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Publish.ToSpanName()}")); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })); - - Assert.Equal(nameof(MyCommandHandlerAsync), _exportedActivities.First().Events.First().Name); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyCommandHandlerAsync))); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); - - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - Assert.True(_exportedActivities.Any(a => a.DisplayName == $"{nameof(FireSchedulerRequest)} {CommandProcessorSpanOperation.Send.ToSpanName()}")); - Assert.True(_exportedActivities[2].Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(FireSchedulerRequest) })); - Assert.True(_exportedActivities[2].Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && !string.IsNullOrEmpty(t.Value))); - Assert.True(_exportedActivities[2].Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" })); - - Assert.Equal(nameof(FireSchedulerRequestHandler), _exportedActivities[2].Events.First().Name); - Assert.True(_exportedActivities[2].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(FireSchedulerRequestHandler))); - Assert.True(_exportedActivities[2].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")); - Assert.True(_exportedActivities[2].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); + await Assert.That(_exportedActivities.Count).IsEqualTo(3); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Publish.ToSpanName()}")).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "publish" })).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Name).IsEqualTo(nameof(MyCommandHandlerAsync)); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyCommandHandlerAsync))).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.DisplayName == $"{nameof(FireSchedulerRequest)} {CommandProcessorSpanOperation.Send.ToSpanName()}")).IsTrue(); + await Assert.That(_exportedActivities[2].Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(FireSchedulerRequest) })).IsTrue(); + await Assert.That(_exportedActivities[2].Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && !string.IsNullOrEmpty(t.Value))).IsTrue(); + await Assert.That(_exportedActivities[2].Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" })).IsTrue(); + await Assert.That(_exportedActivities[2].Events.First().Name).IsEqualTo(nameof(FireSchedulerRequestHandler)); + await Assert.That(_exportedActivities[2].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(FireSchedulerRequestHandler))).IsTrue(); + await Assert.That(_exportedActivities[2].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")).IsTrue(); + await Assert.That(_exportedActivities[2].Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); } -} - +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Send/When_Sending_A_Request_A_Span_Is_Exported.cs b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Send/When_Sending_A_Request_A_Span_Is_Exported.cs index d965fb7353..d4e4337fe8 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Send/When_Sending_A_Request_A_Span_Is_Exported.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Send/When_Sending_A_Request_A_Span_Is_Exported.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -11,175 +11,149 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.CommandProcessor.Send; - -[Collection("Observability")] -public class CommandProcessorSendObservabilityTests +[NotInParallel("Observability")] +public class CommandProcessorSendObservabilityTests { private readonly List _exportedActivities; private readonly TracerProvider _traceProvider; - public CommandProcessorSendObservabilityTests() { - PipelineBuilder.ClearPipelineCache(); - var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); } - - [Theory] - [InlineData(InstrumentationOptions.All)] - [InlineData(InstrumentationOptions.None)] - [InlineData(InstrumentationOptions.RequestBody)] - [InlineData(InstrumentationOptions.RequestContext)] - [InlineData(InstrumentationOptions.RequestInformation)] - public void When_Sending_A_Request_With_Span_In_Context_A_Child_Span_Is_Exported(InstrumentationOptions instrumentationOptions) + [Test] + [Arguments(InstrumentationOptions.All)] + [Arguments(InstrumentationOptions.None)] + [Arguments(InstrumentationOptions.RequestBody)] + [Arguments(InstrumentationOptions.RequestContext)] + [Arguments(InstrumentationOptions.RequestInformation)] + public async Task When_Sending_A_Request_With_Span_In_Context_A_Child_Span_Is_Exported(InstrumentationOptions instrumentationOptions) { //arrange var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - - var command = new MyCommand{Value = "My Test String"}; - var context = new RequestContext { Span = parentActivity }; - + var command = new MyCommand + { + Value = "My Test String" + }; + var context = new RequestContext + { + Span = parentActivity + }; //act CreateCommandProcessor(instrumentationOptions).Send(command, context); parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //assert - Assert.Equal(2, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - Assert.True(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Send.ToSpanName()}")); - + await Assert.That(_exportedActivities.Count).IsEqualTo(2); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Send.ToSpanName()}")).IsTrue(); var firstActivity = _exportedActivities.First(); - - Assert.Equal(parentActivity?.Id, firstActivity.ParentId); - if(instrumentationOptions == InstrumentationOptions.None) - Assert.Empty(firstActivity.Tags); + await Assert.That(firstActivity.ParentId).IsEqualTo(parentActivity?.Id); + if (instrumentationOptions == InstrumentationOptions.None) + await Assert.That(firstActivity.Tags).IsEmpty(); if (instrumentationOptions.HasFlag(InstrumentationOptions.RequestInformation)) { - Assert.Contains(firstActivity.Tags, t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id); - Assert.Contains(firstActivity.Tags, t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) }); - Assert.Contains(firstActivity.Tags, t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" }); + await Assert.That(firstActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id); + await Assert.That(firstActivity.Tags).Contains(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) }); + await Assert.That(firstActivity.Tags).Contains(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" }); } else { - Assert.DoesNotContain(firstActivity.Tags, t => t.Key == BrighterSemanticConventions.RequestId); - Assert.DoesNotContain(firstActivity.Tags, t => t.Key == BrighterSemanticConventions.RequestType); - Assert.DoesNotContain(firstActivity.Tags, t => t.Key == BrighterSemanticConventions.Operation); + await Assert.That(firstActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.RequestId); + await Assert.That(firstActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.RequestType); + await Assert.That(firstActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.Operation); } - - if(instrumentationOptions.HasFlag(InstrumentationOptions.RequestBody)) - Assert.Contains(firstActivity.Tags, t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options)); + + if (instrumentationOptions.HasFlag(InstrumentationOptions.RequestBody)) + await Assert.That(firstActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options)); else - Assert.DoesNotContain(firstActivity.Tags, t => t.Key == BrighterSemanticConventions.RequestBody); - - - Assert.Equal(1, firstActivity.Events.Count()); - Assert.Equal(nameof(MyCommandHandler), firstActivity.Events.First().Name); - Assert.True(firstActivity.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyCommandHandler))); - Assert.True(firstActivity.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")); - Assert.True(firstActivity.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); + await Assert.That(firstActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.RequestBody); + await Assert.That(firstActivity.Events.Count()).IsEqualTo(1); + await Assert.That(firstActivity.Events.First().Name).IsEqualTo(nameof(MyCommandHandler)); + await Assert.That(firstActivity.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyCommandHandler))).IsTrue(); + await Assert.That(firstActivity.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")).IsTrue(); + await Assert.That(firstActivity.Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); } - - [Fact] - public void When_Sending_A_Request_With_Span_In_ActivityCurrent_A_Child_Span_Is_Exported() + + [Test] + public async Task When_Sending_A_Request_With_Span_In_ActivityCurrent_A_Child_Span_Is_Exported() { //arrange + Activity.Current = null; var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - - var command = new MyCommand{Value = "My Test String"}; + var command = new MyCommand + { + Value = "My Test String" + }; var context = new RequestContext(); Activity.Current = parentActivity; - //act CreateCommandProcessor(InstrumentationOptions.All).Send(command, context); parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //assert - Assert.Equal(2, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - Assert.True(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Send.ToSpanName()}")); - Assert.Equal(parentActivity?.Id, _exportedActivities.First().ParentId); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" })); - - Assert.Equal(1, _exportedActivities.First().Events.Count()); - Assert.Equal(nameof(MyCommandHandler), _exportedActivities.First().Events.First().Name); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyCommandHandler))); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); + await Assert.That(_exportedActivities.Count).IsEqualTo(2); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Send.ToSpanName()}")).IsTrue(); + await Assert.That(_exportedActivities.First().ParentId).IsEqualTo(parentActivity?.Id); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" })).IsTrue(); + await Assert.That(_exportedActivities.First().Events.Count()).IsEqualTo(1); + await Assert.That(_exportedActivities.First().Events.First().Name).IsEqualTo(nameof(MyCommandHandler)); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyCommandHandler))).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); } - - [Fact] - public void When_Sending_A_Request_With_No_Context_Or_Span_In_ActivityCurrent_A_Root_Span_Is_Exported() + + [Test] + public async Task When_Sending_A_Request_With_No_Context_Or_Span_In_ActivityCurrent_A_Root_Span_Is_Exported() { //arrange - var command = new MyCommand{Value = "My Test String"}; + Activity.Current = null; + var command = new MyCommand + { + Value = "My Test String" + }; var context = new RequestContext(); - //act CreateCommandProcessor(InstrumentationOptions.All).Send(command, context); - _traceProvider.ForceFlush(); - //assert - Assert.Equal(1, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - Assert.True(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Send.ToSpanName()}")); - Assert.Null(_exportedActivities.First().ParentId); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" })); - - Assert.Equal(1, _exportedActivities.First().Events.Count()); - Assert.Equal(nameof(MyCommandHandler), _exportedActivities.First().Events.First().Name); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyCommandHandler))); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); + await Assert.That(_exportedActivities.Count).IsEqualTo(1); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Send.ToSpanName()}")).IsTrue(); + await Assert.That(_exportedActivities.First().ParentId).IsNull(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" })).IsTrue(); + await Assert.That(_exportedActivities.First().Events.Count()).IsEqualTo(1); + await Assert.That(_exportedActivities.First().Events.First().Name).IsEqualTo(nameof(MyCommandHandler)); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyCommandHandler))).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "sync")).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); } private IAmACommandProcessor CreateCommandProcessor(InstrumentationOptions instrumentationOptions) { BrighterTracer tracer = new(); - - var registry = new SubscriberRegistry(); registry.Register(); - var handlerFactory = new SimpleHandlerFactorySync(_ => new MyCommandHandler(new Dictionary())); - - var retryPolicy = Policy - .Handle() - .Retry(); - - var policyRegistry = new PolicyRegistry {{Brighter.CommandProcessor.RETRYPOLICY, retryPolicy}}; - - - return new Brighter.CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - policyRegistry, - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: instrumentationOptions - ); + var retryPolicy = Policy.Handle().Retry(); + var policyRegistry = new PolicyRegistry + { + { + Brighter.CommandProcessor.RETRYPOLICY, + retryPolicy + } + }; + return new Brighter.CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: instrumentationOptions); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Send/When_Sending_A_Request_A_Span_Is_Exported_Async.cs b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Send/When_Sending_A_Request_A_Span_Is_Exported_Async.cs index adc496eafa..695038f3c6 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Send/When_Sending_A_Request_A_Span_Is_Exported_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/CommandProcessor/Send/When_Sending_A_Request_A_Span_Is_Exported_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -13,178 +13,154 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.CommandProcessor.Send; - -[Collection("Observability")] -public class AsyncCommandProcessorSendObservabilityTests +[NotInParallel("Observability")] +public class AsyncCommandProcessorSendObservabilityTests { private readonly List _exportedActivities; private readonly TracerProvider _traceProvider; private readonly Brighter.CommandProcessor _commandProcessor; - public AsyncCommandProcessorSendObservabilityTests() { var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); _commandProcessor = CreateCommandProcessor(InstrumentationOptions.All); } - [Theory] - [InlineData(InstrumentationOptions.All)] - [InlineData(InstrumentationOptions.None)] - [InlineData(InstrumentationOptions.RequestBody)] - [InlineData(InstrumentationOptions.RequestContext)] - [InlineData(InstrumentationOptions.RequestInformation)] + [Test] + [Arguments(InstrumentationOptions.All)] + [Arguments(InstrumentationOptions.None)] + [Arguments(InstrumentationOptions.RequestBody)] + [Arguments(InstrumentationOptions.RequestContext)] + [Arguments(InstrumentationOptions.RequestInformation)] public async Task When_Sending_A_Request_With_Span_In_Context_A_Child_Span_Is_Exported(InstrumentationOptions instrumentationOptions) { //arrange var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - - var command = new MyCommand{Value = "My Test String"}; - var context = new RequestContext { Span = parentActivity }; - + var command = new MyCommand + { + Value = "My Test String" + }; + var context = new RequestContext + { + Span = parentActivity + }; //act await CreateCommandProcessor(instrumentationOptions).SendAsync(command, context, true); parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //assert - Assert.Equal(2, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - + await Assert.That(_exportedActivities.Count).IsEqualTo(2); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); var firstActivity = _exportedActivities.First(); - if(instrumentationOptions == InstrumentationOptions.None) - Assert.Empty(firstActivity.Tags); + if (instrumentationOptions == InstrumentationOptions.None) + await Assert.That(firstActivity.Tags).IsEmpty(); if (instrumentationOptions.HasFlag(InstrumentationOptions.RequestInformation)) { - Assert.Contains(firstActivity.Tags, t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id); - Assert.Contains(firstActivity.Tags, t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) }); - Assert.Contains(firstActivity.Tags, t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" }); - Assert.Contains(firstActivity.Tags, t => t is { Key: BrighterSemanticConventions.MessagingOperationType, Value: "send" }); + await Assert.That(firstActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id); + await Assert.That(firstActivity.Tags).Contains(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) }); + await Assert.That(firstActivity.Tags).Contains(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" }); + await Assert.That(firstActivity.Tags).Contains(t => t is { Key: BrighterSemanticConventions.MessagingOperationType, Value: "send" }); } else { - Assert.DoesNotContain(firstActivity.Tags, t => t.Key == BrighterSemanticConventions.RequestId); - Assert.DoesNotContain(firstActivity.Tags, t => t.Key == BrighterSemanticConventions.RequestType); - Assert.DoesNotContain(firstActivity.Tags, t => t.Key == BrighterSemanticConventions.Operation); - Assert.DoesNotContain(firstActivity.Tags, t => t.Key == BrighterSemanticConventions.MessagingOperationType); + await Assert.That(firstActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.RequestId); + await Assert.That(firstActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.RequestType); + await Assert.That(firstActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.Operation); + await Assert.That(firstActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.MessagingOperationType); } - - if(instrumentationOptions.HasFlag(InstrumentationOptions.RequestBody)) - Assert.Contains(firstActivity.Tags, t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options)); + + if (instrumentationOptions.HasFlag(InstrumentationOptions.RequestBody)) + await Assert.That(firstActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options)); else - Assert.DoesNotContain(firstActivity.Tags, t => t.Key == BrighterSemanticConventions.RequestBody); - - Assert.True(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Send.ToSpanName()}")); - Assert.Equal(parentActivity.Id, _exportedActivities.First().ParentId); - - Assert.Equal(1, _exportedActivities.First().Events.Count()); - Assert.Equal(nameof(MyCommandHandlerAsync), _exportedActivities.First().Events.First().Name); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyCommandHandlerAsync))); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); + await Assert.That(firstActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.RequestBody); + await Assert.That(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Send.ToSpanName()}")).IsTrue(); + await Assert.That(_exportedActivities.First().ParentId).IsEqualTo(parentActivity.Id); + await Assert.That(_exportedActivities.First().Events.Count()).IsEqualTo(1); + await Assert.That(_exportedActivities.First().Events.First().Name).IsEqualTo(nameof(MyCommandHandlerAsync)); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyCommandHandlerAsync))).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); } - - [Fact] + + [Test] public async Task When_Sending_A_Request_With_Span_In_ActivityCurrent_A_Child_Span_Is_Exported() { //arrange + Activity.Current = null; var parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - - var command = new MyCommand{Value = "My Test String"}; + var command = new MyCommand + { + Value = "My Test String" + }; var context = new RequestContext(); Activity.Current = parentActivity; - //act await _commandProcessor.SendAsync(command, context, true, new CancellationToken()); parentActivity?.Stop(); - _traceProvider.ForceFlush(); - //assert - Assert.Equal(2, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - Assert.True(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Send.ToSpanName()}")); - Assert.Equal(parentActivity.Id, _exportedActivities.First().ParentId); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" })); - - Assert.Equal(1, _exportedActivities.First().Events.Count()); - Assert.Equal(nameof(MyCommandHandlerAsync), _exportedActivities.First().Events.First().Name); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyCommandHandlerAsync))); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); + await Assert.That(_exportedActivities.Count).IsEqualTo(2); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Send.ToSpanName()}")).IsTrue(); + await Assert.That(_exportedActivities.First().ParentId).IsEqualTo(parentActivity.Id); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" })).IsTrue(); + await Assert.That(_exportedActivities.First().Events.Count()).IsEqualTo(1); + await Assert.That(_exportedActivities.First().Events.First().Name).IsEqualTo(nameof(MyCommandHandlerAsync)); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyCommandHandlerAsync))).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); } - - [Fact] + + [Test] public async Task When_Sending_A_Request_With_No_Context_Or_Span_In_ActivityCurrent_A_Root_Span_Is_Exported() { //arrange - var command = new MyCommand{Value = "My Test String"}; + Activity.Current = null; + var command = new MyCommand + { + Value = "My Test String" + }; var context = new RequestContext(); - //act await _commandProcessor.SendAsync(command, context, true, new CancellationToken()); - _traceProvider.ForceFlush(); - //assert - Assert.Equal(1, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - Assert.True(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Send.ToSpanName()}")); - Assert.Null(_exportedActivities.First().ParentId); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })); - Assert.True(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))); - Assert.True(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" })); - - Assert.Equal(1, _exportedActivities.First().Events.Count()); - Assert.Equal(nameof(MyCommandHandlerAsync), _exportedActivities.First().Events.First().Name); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyCommandHandlerAsync))); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")); - Assert.True(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)); + await Assert.That(_exportedActivities.Count).IsEqualTo(1); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); + await Assert.That(_exportedActivities.Any(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Send.ToSpanName()}")).IsTrue(); + await Assert.That(_exportedActivities.First().ParentId).IsNull(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestId && t.Value == command.Id)).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.RequestType, Value: nameof(MyCommand) })).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t.Key == BrighterSemanticConventions.RequestBody && t.Value == JsonSerializer.Serialize(command, JsonSerialisationOptions.Options))).IsTrue(); + await Assert.That(_exportedActivities.First().Tags.Any(t => t is { Key: BrighterSemanticConventions.Operation, Value: "send" })).IsTrue(); + await Assert.That(_exportedActivities.First().Events.Count()).IsEqualTo(1); + await Assert.That(_exportedActivities.First().Events.First().Name).IsEqualTo(nameof(MyCommandHandlerAsync)); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerName && (string)t.Value == nameof(MyCommandHandlerAsync))).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.HandlerType && (string)t.Value == "async")).IsTrue(); + await Assert.That(_exportedActivities.First().Events.First().Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value)).IsTrue(); } private Brighter.CommandProcessor CreateCommandProcessor(InstrumentationOptions options) { BrighterTracer tracer = new(); - - var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var receivedMessages = new Dictionary(); var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyCommandHandlerAsync(receivedMessages)); - - var retryPolicy = Policy - .Handle() - .RetryAsync(); - - var policyRegistry = new PolicyRegistry {{Brighter.CommandProcessor.RETRYPOLICYASYNC, retryPolicy}}; - - - return new Brighter.CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - policyRegistry, - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: options - ); + var retryPolicy = Policy.Handle().RetryAsync(); + var policyRegistry = new PolicyRegistry + { + { + Brighter.CommandProcessor.RETRYPOLICYASYNC, + retryPolicy + } + }; + return new Brighter.CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), policyRegistry, new ResiliencePipelineRegistry(), new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: options); } - -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_A_Db_Span_Add_Brighter_Semantic_Conventions.cs b/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_A_Db_Span_Add_Brighter_Semantic_Conventions.cs index 1585a182a0..22bb41be3d 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_A_Db_Span_Add_Brighter_Semantic_Conventions.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_A_Db_Span_Add_Brighter_Semantic_Conventions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -6,10 +6,9 @@ using OpenTelemetry.Resources; using OpenTelemetry.Trace; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.Common; - +[NotInParallel("Observability")] public class BrighterSemanticConventionsDbSpanTests { private const string DbStatement = "INSERT INTO outbox (id, topic, message_id, message_body, message_type, time_to_live, created_at_utc) VALUES (@id, @topic, @message_id, @message_body, @message_type, @time_to_live, @created_at_utc)"; @@ -17,129 +16,95 @@ public class BrighterSemanticConventionsDbSpanTests private readonly TracerProvider _traceProvider; private readonly Activity _parentActivity; private readonly BrighterTracer _tracer; - public BrighterSemanticConventionsDbSpanTests() { var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); _tracer = new BrighterTracer(); - _parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterSemanticConventionsDbSpanTests"); + _parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterSemanticConventionsDbSpanTests"); } - - [Theory] - [InlineData(InstrumentationOptions.All)] - [InlineData(InstrumentationOptions.DatabaseInformation)] - [InlineData(InstrumentationOptions.None)] - public void When_Creating_A_Db_Span_Add_Brighter_Semantic_Conventions(InstrumentationOptions options) + + [Test] + [Arguments(InstrumentationOptions.All)] + [Arguments(InstrumentationOptions.DatabaseInformation)] + [Arguments(InstrumentationOptions.None)] + public async Task When_Creating_A_Db_Span_Add_Brighter_Semantic_Conventions(InstrumentationOptions options) { //arrange - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), new("MyTopic"), MessageType.MT_COMMAND), - new MessageBody("test content") - ); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), new("MyTopic"), MessageType.MT_COMMAND), new MessageBody("test content")); //act var dbInstanceId = Guid.NewGuid().ToString(); - var childActivity = _tracer.CreateDbSpan( - new BoxSpanInfo( - dbSystem: DbSystem.MySql, - dbName: InMemoryAttributes.OutboxDbName, - dbOperation: BoxDbOperation.Add, - dbTable: InMemoryAttributes.DbTable, - serverPort:3306, - dbInstanceId: dbInstanceId, - dbStatement: DbStatement, - dbUser: "sa", - networkPeerAddress: "10.1.2.80", - networkPeerPort: 3306, - serverAddress: "http://localhost:3306" - ), - _parentActivity, - options: options - ); - + var childActivity = _tracer.CreateDbSpan(new BoxSpanInfo(dbSystem: DbSystem.MySql, dbName: InMemoryAttributes.OutboxDbName, dbOperation: BoxDbOperation.Add, dbTable: InMemoryAttributes.DbTable, serverPort: 3306, dbInstanceId: dbInstanceId, dbStatement: DbStatement, dbUser: "sa", networkPeerAddress: "10.1.2.80", networkPeerPort: 3306, serverAddress: "http://localhost:3306"), _parentActivity, options: options); childActivity.Stop(); _parentActivity.Stop(); - var flushed = _traceProvider.ForceFlush(); - - //assert - Assert.True(flushed); - + await Assert.That(flushed).IsTrue(); //check the created activity - Assert.Equal(_parentActivity.Id, childActivity.ParentId); - Assert.Equal($"{BoxDbOperation.Add.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}", childActivity.DisplayName); - if(options == InstrumentationOptions.None) - Assert.Empty(childActivity.Tags); + await Assert.That(childActivity.ParentId).IsEqualTo(_parentActivity.Id); + await Assert.That(childActivity.DisplayName).IsEqualTo($"{BoxDbOperation.Add.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); + if (options == InstrumentationOptions.None) + await Assert.That(childActivity.Tags).IsEmpty(); if (options.HasFlag(InstrumentationOptions.DatabaseInformation)) { - Assert.Contains(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbInstanceId && t.Value == dbInstanceId); - Assert.Contains(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName); - Assert.Contains(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.Add.ToSpanName()); - Assert.Contains(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable); - Assert.Contains(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.MySql.ToDbName()); - Assert.Contains(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbStatement && t.Value == DbStatement); - Assert.Contains(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbUser && t.Value == "sa"); - Assert.Contains(childActivity.Tags, t => t.Key == BrighterSemanticConventions.NetworkPeerAddress && t.Value == "10.1.2.80"); - Assert.Contains(childActivity.Tags, t => t.Key == BrighterSemanticConventions.ServerAddress && t.Value == "http://localhost:3306"); - Assert.Contains(childActivity.TagObjects, t => t.Key == BrighterSemanticConventions.NetworkPeerPort && (int)t.Value == 3306); - Assert.Contains(childActivity.TagObjects, t => t.Key == BrighterSemanticConventions.ServerPort && (int)t.Value == 3306); - + await Assert.That(childActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbInstanceId && t.Value == dbInstanceId); + await Assert.That(childActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName); + await Assert.That(childActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.Add.ToSpanName()); + await Assert.That(childActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable); + await Assert.That(childActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.MySql.ToDbName()); + await Assert.That(childActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbStatement && t.Value == DbStatement); + await Assert.That(childActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbUser && t.Value == "sa"); + await Assert.That(childActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.NetworkPeerAddress && t.Value == "10.1.2.80"); + await Assert.That(childActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.ServerAddress && t.Value == "http://localhost:3306"); + await Assert.That(childActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.NetworkPeerPort && (int)t.Value == 3306); + await Assert.That(childActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.ServerPort && (int)t.Value == 3306); } else { - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbInstanceId); - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbName); - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbOperation); - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbTable); - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbSystem); - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbStatement); - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbUser); - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.NetworkPeerAddress); - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.ServerAddress); - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.NetworkPeerPort); - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.ServerPort); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbInstanceId); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbName); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbOperation); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbTable); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbSystem); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbStatement); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbUser); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.NetworkPeerAddress); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.ServerAddress); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.NetworkPeerPort); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.ServerPort); } //check via the exporter as well - Assert.Equal(2, _exportedActivities.Count); - Assert.Contains(_exportedActivities, a => a.Source.Name == BrighterSemanticConventions.SourceName); + await Assert.That(_exportedActivities.Count).IsEqualTo(2); + await Assert.That(_exportedActivities).Contains(a => a.Source.Name == BrighterSemanticConventions.SourceName); var childSpan = _exportedActivities.First(a => a.DisplayName == $"{BoxDbOperation.Add.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); - Assert.NotNull(childSpan); - + await Assert.That(childSpan).IsNotNull(); if (options.HasFlag(InstrumentationOptions.DatabaseInformation)) { - Assert.Contains(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbInstanceId && t.Value == dbInstanceId); - Assert.Contains(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.Add.ToSpanName()); - Assert.Contains(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable); - Assert.Contains(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.MySql.ToDbName()); - Assert.Contains(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbStatement && t.Value == DbStatement); - Assert.Contains(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbUser && t.Value == "sa"); - Assert.Contains(childSpan.Tags, t => t.Key == BrighterSemanticConventions.NetworkPeerAddress && t.Value == "10.1.2.80"); - Assert.Contains(childSpan.Tags, t => t.Key == BrighterSemanticConventions.ServerAddress && t.Value == "http://localhost:3306"); - Assert.Contains(childSpan.TagObjects, t => t.Key == BrighterSemanticConventions.ServerPort && (int)t.Value == 3306); - Assert.Contains(childSpan.TagObjects, t => t.Key == BrighterSemanticConventions.NetworkPeerPort && (int)t.Value == 3306); + await Assert.That(childSpan.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbInstanceId && t.Value == dbInstanceId); + await Assert.That(childSpan.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.Add.ToSpanName()); + await Assert.That(childSpan.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable); + await Assert.That(childSpan.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == DbSystem.MySql.ToDbName()); + await Assert.That(childSpan.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbStatement && t.Value == DbStatement); + await Assert.That(childSpan.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbUser && t.Value == "sa"); + await Assert.That(childSpan.Tags).Contains(t => t.Key == BrighterSemanticConventions.NetworkPeerAddress && t.Value == "10.1.2.80"); + await Assert.That(childSpan.Tags).Contains(t => t.Key == BrighterSemanticConventions.ServerAddress && t.Value == "http://localhost:3306"); + await Assert.That(childSpan.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.ServerPort && (int)t.Value == 3306); + await Assert.That(childSpan.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.NetworkPeerPort && (int)t.Value == 3306); } else { - Assert.DoesNotContain(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbInstanceId); - Assert.DoesNotContain(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbOperation); - Assert.DoesNotContain(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbTable); - Assert.DoesNotContain(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbSystem); - Assert.DoesNotContain(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbStatement); - Assert.DoesNotContain(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbUser); - Assert.DoesNotContain(childSpan.Tags, t => t.Key == BrighterSemanticConventions.NetworkPeerAddress); - Assert.DoesNotContain(childSpan.Tags, t => t.Key == BrighterSemanticConventions.ServerAddress); - Assert.DoesNotContain(childSpan.Tags, t => t.Key == BrighterSemanticConventions.ServerPort); - Assert.DoesNotContain(childSpan.Tags, t => t.Key == BrighterSemanticConventions.NetworkPeerPort); + await Assert.That(childSpan.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbInstanceId); + await Assert.That(childSpan.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbOperation); + await Assert.That(childSpan.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbTable); + await Assert.That(childSpan.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbSystem); + await Assert.That(childSpan.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbStatement); + await Assert.That(childSpan.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbUser); + await Assert.That(childSpan.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.NetworkPeerAddress); + await Assert.That(childSpan.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.ServerAddress); + await Assert.That(childSpan.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.ServerPort); + await Assert.That(childSpan.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.NetworkPeerPort); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_A_Db_Span_With_Custom_Database_Name_Add_Brighter_Semantic_Conventions.cs b/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_A_Db_Span_With_Custom_Database_Name_Add_Brighter_Semantic_Conventions.cs index b2692aadaf..1cb784ff19 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_A_Db_Span_With_Custom_Database_Name_Add_Brighter_Semantic_Conventions.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_A_Db_Span_With_Custom_Database_Name_Add_Brighter_Semantic_Conventions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -6,10 +6,9 @@ using OpenTelemetry.Resources; using OpenTelemetry.Trace; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.Common; - +[NotInParallel("Observability")] public class BrighterSemanticConventionsDbSpanWithCustomNameTests { private const string DbStatement = "INSERT INTO outbox (id, topic, message_id, message_body, message_type, time_to_live, created_at_utc) VALUES (@id, @topic, @message_id, @message_body, @message_type, @time_to_live, @created_at_utc)"; @@ -17,130 +16,96 @@ public class BrighterSemanticConventionsDbSpanWithCustomNameTests private readonly TracerProvider _traceProvider; private readonly Activity _parentActivity; private readonly BrighterTracer _tracer; - public BrighterSemanticConventionsDbSpanWithCustomNameTests() { var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); _tracer = new BrighterTracer(); - _parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterSemanticConventionsDbSpanTests"); + _parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterSemanticConventionsDbSpanTests"); } - - [Theory] - [InlineData(InstrumentationOptions.All)] - [InlineData(InstrumentationOptions.DatabaseInformation)] - [InlineData(InstrumentationOptions.None)] - public void When_Creating_A_Db_Span_With_Custom_Name_Add_Brighter_Semantic_Conventions(InstrumentationOptions options) + + [Test] + [Arguments(InstrumentationOptions.All)] + [Arguments(InstrumentationOptions.DatabaseInformation)] + [Arguments(InstrumentationOptions.None)] + public async Task When_Creating_A_Db_Span_With_Custom_Name_Add_Brighter_Semantic_Conventions(InstrumentationOptions options) { //arrange const string databaseSystemName = "some-datatabase"; - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), new("MyTopic"), MessageType.MT_COMMAND), - new MessageBody("test content") - ); - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), new("MyTopic"), MessageType.MT_COMMAND), new MessageBody("test content")); //act var dbInstanceId = Guid.NewGuid().ToString(); - var childActivity = _tracer.CreateDbSpan( - new BoxSpanInfo( - dbSystemName: databaseSystemName, - dbName: InMemoryAttributes.OutboxDbName, - dbOperation: BoxDbOperation.Add, - dbTable: InMemoryAttributes.DbTable, - serverPort:3306, - dbInstanceId: dbInstanceId, - dbStatement: DbStatement, - dbUser: "sa", - networkPeerAddress: "10.1.2.80", - networkPeerPort: 3306, - serverAddress: "http://localhost:3306" - ), - _parentActivity, - options: options - ); - + var childActivity = _tracer.CreateDbSpan(new BoxSpanInfo(dbSystemName: databaseSystemName, dbName: InMemoryAttributes.OutboxDbName, dbOperation: BoxDbOperation.Add, dbTable: InMemoryAttributes.DbTable, serverPort: 3306, dbInstanceId: dbInstanceId, dbStatement: DbStatement, dbUser: "sa", networkPeerAddress: "10.1.2.80", networkPeerPort: 3306, serverAddress: "http://localhost:3306"), _parentActivity, options: options); childActivity.Stop(); _parentActivity.Stop(); - var flushed = _traceProvider.ForceFlush(); - - //assert - Assert.True(flushed); - + await Assert.That(flushed).IsTrue(); //check the created activity - Assert.Equal(_parentActivity.Id, childActivity.ParentId); - Assert.Equal($"{BoxDbOperation.Add.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}", childActivity.DisplayName); - if(options == InstrumentationOptions.None) - Assert.Empty(childActivity.Tags); + await Assert.That(childActivity.ParentId).IsEqualTo(_parentActivity.Id); + await Assert.That(childActivity.DisplayName).IsEqualTo($"{BoxDbOperation.Add.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); + if (options == InstrumentationOptions.None) + await Assert.That(childActivity.Tags).IsEmpty(); if (options.HasFlag(InstrumentationOptions.DatabaseInformation)) { - Assert.Contains(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbInstanceId && t.Value == dbInstanceId); - Assert.Contains(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName); - Assert.Contains(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.Add.ToSpanName()); - Assert.Contains(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable); - Assert.Contains(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == databaseSystemName); - Assert.Contains(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbStatement && t.Value == DbStatement); - Assert.Contains(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbUser && t.Value == "sa"); - Assert.Contains(childActivity.Tags, t => t.Key == BrighterSemanticConventions.NetworkPeerAddress && t.Value == "10.1.2.80"); - Assert.Contains(childActivity.Tags, t => t.Key == BrighterSemanticConventions.ServerAddress && t.Value == "http://localhost:3306"); - Assert.Contains(childActivity.TagObjects, t => t.Key == BrighterSemanticConventions.NetworkPeerPort && (int)t.Value == 3306); - Assert.Contains(childActivity.TagObjects, t => t.Key == BrighterSemanticConventions.ServerPort && (int)t.Value == 3306); - + await Assert.That(childActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbInstanceId && t.Value == dbInstanceId); + await Assert.That(childActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbName && t.Value == InMemoryAttributes.OutboxDbName); + await Assert.That(childActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.Add.ToSpanName()); + await Assert.That(childActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable); + await Assert.That(childActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == databaseSystemName); + await Assert.That(childActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbStatement && t.Value == DbStatement); + await Assert.That(childActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbUser && t.Value == "sa"); + await Assert.That(childActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.NetworkPeerAddress && t.Value == "10.1.2.80"); + await Assert.That(childActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.ServerAddress && t.Value == "http://localhost:3306"); + await Assert.That(childActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.NetworkPeerPort && (int)t.Value == 3306); + await Assert.That(childActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.ServerPort && (int)t.Value == 3306); } else { - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbInstanceId); - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbName); - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbOperation); - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbTable); - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbSystem); - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbStatement); - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.DbUser); - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.NetworkPeerAddress); - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.ServerAddress); - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.NetworkPeerPort); - Assert.DoesNotContain(childActivity.Tags, t => t.Key == BrighterSemanticConventions.ServerPort); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbInstanceId); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbName); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbOperation); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbTable); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbSystem); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbStatement); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbUser); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.NetworkPeerAddress); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.ServerAddress); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.NetworkPeerPort); + await Assert.That(childActivity.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.ServerPort); } //check via the exporter as well - Assert.Equal(2, _exportedActivities.Count); - Assert.Contains(_exportedActivities, a => a.Source.Name == BrighterSemanticConventions.SourceName); + await Assert.That(_exportedActivities.Count).IsEqualTo(2); + await Assert.That(_exportedActivities).Contains(a => a.Source.Name == BrighterSemanticConventions.SourceName); var childSpan = _exportedActivities.First(a => a.DisplayName == $"{BoxDbOperation.Add.ToSpanName()} {InMemoryAttributes.OutboxDbName} {InMemoryAttributes.DbTable}"); - Assert.NotNull(childSpan); - + await Assert.That(childSpan).IsNotNull(); if (options.HasFlag(InstrumentationOptions.DatabaseInformation)) { - Assert.Contains(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbInstanceId && t.Value == dbInstanceId); - Assert.Contains(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.Add.ToSpanName()); - Assert.Contains(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable); - Assert.Contains(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == databaseSystemName); - Assert.Contains(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbStatement && t.Value == DbStatement); - Assert.Contains(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbUser && t.Value == "sa"); - Assert.Contains(childSpan.Tags, t => t.Key == BrighterSemanticConventions.NetworkPeerAddress && t.Value == "10.1.2.80"); - Assert.Contains(childSpan.Tags, t => t.Key == BrighterSemanticConventions.ServerAddress && t.Value == "http://localhost:3306"); - Assert.Contains(childSpan.TagObjects, t => t.Key == BrighterSemanticConventions.ServerPort && (int)t.Value == 3306); - Assert.Contains(childSpan.TagObjects, t => t.Key == BrighterSemanticConventions.NetworkPeerPort && (int)t.Value == 3306); + await Assert.That(childSpan.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbInstanceId && t.Value == dbInstanceId); + await Assert.That(childSpan.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbOperation && t.Value == BoxDbOperation.Add.ToSpanName()); + await Assert.That(childSpan.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbTable && t.Value == InMemoryAttributes.DbTable); + await Assert.That(childSpan.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbSystem && t.Value == databaseSystemName); + await Assert.That(childSpan.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbStatement && t.Value == DbStatement); + await Assert.That(childSpan.Tags).Contains(t => t.Key == BrighterSemanticConventions.DbUser && t.Value == "sa"); + await Assert.That(childSpan.Tags).Contains(t => t.Key == BrighterSemanticConventions.NetworkPeerAddress && t.Value == "10.1.2.80"); + await Assert.That(childSpan.Tags).Contains(t => t.Key == BrighterSemanticConventions.ServerAddress && t.Value == "http://localhost:3306"); + await Assert.That(childSpan.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.ServerPort && (int)t.Value == 3306); + await Assert.That(childSpan.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.NetworkPeerPort && (int)t.Value == 3306); } else { - Assert.DoesNotContain(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbInstanceId); - Assert.DoesNotContain(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbOperation); - Assert.DoesNotContain(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbTable); - Assert.DoesNotContain(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbSystem); - Assert.DoesNotContain(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbStatement); - Assert.DoesNotContain(childSpan.Tags, t => t.Key == BrighterSemanticConventions.DbUser); - Assert.DoesNotContain(childSpan.Tags, t => t.Key == BrighterSemanticConventions.NetworkPeerAddress); - Assert.DoesNotContain(childSpan.Tags, t => t.Key == BrighterSemanticConventions.ServerAddress); - Assert.DoesNotContain(childSpan.Tags, t => t.Key == BrighterSemanticConventions.ServerPort); - Assert.DoesNotContain(childSpan.Tags, t => t.Key == BrighterSemanticConventions.NetworkPeerPort); + await Assert.That(childSpan.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbInstanceId); + await Assert.That(childSpan.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbOperation); + await Assert.That(childSpan.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbTable); + await Assert.That(childSpan.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbSystem); + await Assert.That(childSpan.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbStatement); + await Assert.That(childSpan.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.DbUser); + await Assert.That(childSpan.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.NetworkPeerAddress); + await Assert.That(childSpan.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.ServerAddress); + await Assert.That(childSpan.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.ServerPort); + await Assert.That(childSpan.Tags).DoesNotContain(t => t.Key == BrighterSemanticConventions.NetworkPeerPort); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_A_Handler_Event_Add_Brighter_SemanticConventions.cs b/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_A_Handler_Event_Add_Brighter_SemanticConventions.cs index 65adc6c760..fcf994c357 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_A_Handler_Event_Add_Brighter_SemanticConventions.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_A_Handler_Event_Add_Brighter_SemanticConventions.cs @@ -1,55 +1,45 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Diagnostics; using System.Linq; using OpenTelemetry; using OpenTelemetry.Resources; using OpenTelemetry.Trace; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.Common; - -public class BrighterSemanticConventionsEventTests +[NotInParallel("Observability")] +public class BrighterSemanticConventionsEventTests { private readonly ICollection _exportedActivities; private readonly TracerProvider _traceProvider; private readonly Activity _parentActivity; - public BrighterSemanticConventionsEventTests() { var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); BrighterTracer tracer = new(); - _parentActivity = tracer.ActivitySource.StartActivity("BrighterSemanticConventionsEventTests"); + _parentActivity = tracer.ActivitySource.StartActivity("BrighterSemanticConventionsEventTests"); } - [Fact] - public void When_Creating_A_Handler_Event_Add_Brighter_SemanticConventions() + + [Test] + public async Task When_Creating_A_Handler_Event_Add_Brighter_SemanticConventions() { //act BrighterTracer.WriteHandlerEvent(_parentActivity, "MyCommandHandler", false, InstrumentationOptions.All, true); - _parentActivity.Stop(); var flushed = _traceProvider.ForceFlush(); - //assert //check the created activity var childActivity = _exportedActivities.First(a => a.DisplayName == "BrighterSemanticConventionsEventTests"); - Assert.NotNull(childActivity); + await Assert.That(childActivity).IsNotNull(); var childEvent = childActivity.Events.First(e => e.Name == "MyCommandHandler"); - Assert.Contains(BrighterSemanticConventions.HandlerName, childEvent.Tags.ToDictionary()); + await Assert.That(childEvent.Tags.ToDictionary().Keys).Contains(BrighterSemanticConventions.HandlerName); var eventDictionary = childEvent.Tags.ToDictionary(pair => pair.Key, pair => pair.Value); - Assert.Equal("MyCommandHandler", eventDictionary[BrighterSemanticConventions.HandlerName]); - Assert.Contains(BrighterSemanticConventions.HandlerType, childEvent.Tags.ToDictionary()); - Assert.Equal("sync", eventDictionary[BrighterSemanticConventions.HandlerType]); - Assert.Contains(BrighterSemanticConventions.IsSink, childEvent.Tags.ToDictionary()); - Assert.Equal(true, eventDictionary[BrighterSemanticConventions.IsSink]); - + await Assert.That(eventDictionary[BrighterSemanticConventions.HandlerName]).IsEqualTo("MyCommandHandler"); + await Assert.That(childEvent.Tags.ToDictionary().Keys).Contains(BrighterSemanticConventions.HandlerType); + await Assert.That(eventDictionary[BrighterSemanticConventions.HandlerType]).IsEqualTo("sync"); + await Assert.That(childEvent.Tags.ToDictionary().Keys).Contains(BrighterSemanticConventions.IsSink); + await Assert.That(eventDictionary[BrighterSemanticConventions.IsSink]).IsEqualTo(true); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_A_Message_Mapper_Add_Brighter_Semantic_Conventions.cs b/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_A_Message_Mapper_Add_Brighter_Semantic_Conventions.cs index 7f1e4afd4d..6b4bd308de 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_A_Message_Mapper_Add_Brighter_Semantic_Conventions.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_A_Message_Mapper_Add_Brighter_Semantic_Conventions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -8,67 +8,53 @@ using OpenTelemetry.Trace; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.Common; - +[NotInParallel("Observability")] public class BrighterSemanticConventionsMessageMapperTests { private readonly ICollection _exportedActivities; private readonly TracerProvider _traceProvider; private readonly Activity _parentActivity; private readonly BrighterTracer _tracer; - public BrighterSemanticConventionsMessageMapperTests() { var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); _tracer = new BrighterTracer(); _parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterSemanticConventionsMessageMapperTests"); } - - [Fact] - public void When_Creating_A_Message_Mapper_Add_Brighter_Semantic_Conventions() + + [Test] + public async Task When_Creating_A_Message_Mapper_Add_Brighter_Semantic_Conventions() { //arrange const string paritionKey = "MyPartitionKey"; var routingKey = new RoutingKey("MyTopic"); - - var message = new Message( - new MessageHeader(Guid.NewGuid().ToString(), routingKey, MessageType.MT_COMMAND, partitionKey: paritionKey), - new MessageBody("test content") - ); - - var publication = new Publication() { Topic = routingKey }; - + var message = new Message(new MessageHeader(Guid.NewGuid().ToString(), routingKey, MessageType.MT_COMMAND, partitionKey: paritionKey), new MessageBody("test content")); + var publication = new Publication() + { + Topic = routingKey + }; //act BrighterTracer.WriteMapperEvent(message, publication, _parentActivity, "MyMessageMapper", false, InstrumentationOptions.All, true); - _parentActivity.Stop(); var flushed = _traceProvider.ForceFlush(); - //assert //check the created activity var childActivity = _exportedActivities.First(a => a.DisplayName == "BrighterSemanticConventionsMessageMapperTests"); - Assert.NotNull(childActivity); + await Assert.That(childActivity).IsNotNull(); var childEvent = childActivity.Events.First(e => e.Name == "MyMessageMapper"); - //assert - Assert.True(childEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.MapperName && (string)t.Value == "MyMessageMapper")); - Assert.True(childEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.MapperType && (string)t.Value == "sync")); - Assert.True(childEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value == true)); - Assert.True(childEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.MessagingDestination && t.Value?.ToString() == "MyTopic".ToString())); - Assert.True(childEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.MessageId && (string)t.Value == message.Id.Value)); - Assert.True(childEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && (string)t.Value == paritionKey)); - Assert.True(childEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.MessageBody && (string)t.Value == message.Body.Value)); - Assert.True(childEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.MessageBodySize && (int)t.Value == message.Body.Value.Length)); - Assert.True(childEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.MessageHeaders && (string)t.Value == JsonSerializer.Serialize(message.Header, JsonSerialisationOptions.Options))); + await Assert.That(childEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.MapperName && (string)t.Value == "MyMessageMapper")).IsTrue(); + await Assert.That(childEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.MapperType && (string)t.Value == "sync")).IsTrue(); + await Assert.That(childEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.IsSink && (bool)t.Value == true)).IsTrue(); + await Assert.That(childEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.MessagingDestination && t.Value?.ToString() == "MyTopic".ToString())).IsTrue(); + await Assert.That(childEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.MessageId && (string)t.Value == message.Id.Value)).IsTrue(); + await Assert.That(childEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && (string)t.Value == paritionKey)).IsTrue(); + await Assert.That(childEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.MessageBody && (string)t.Value == message.Body.Value)).IsTrue(); + await Assert.That(childEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.MessageBodySize && (int)t.Value == message.Body.Value.Length)).IsTrue(); + await Assert.That(childEvent.Tags.Any(t => t.Key == BrighterSemanticConventions.MessageHeaders && (string)t.Value == JsonSerializer.Serialize(message.Header, JsonSerialisationOptions.Options))).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_A_Span_Add_Brighter_Semantic_Conventions.cs b/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_A_Span_Add_Brighter_Semantic_Conventions.cs index 0b7f453517..a3f99216b7 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_A_Span_Add_Brighter_Semantic_Conventions.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_A_Span_Add_Brighter_Semantic_Conventions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -8,84 +8,68 @@ using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.Common; - -public class BrighterTracerSpanTests : IDisposable +[NotInParallel("Observability")] +public class BrighterTracerSpanTests { private readonly ICollection _exportedActivities; private readonly TracerProvider _traceProvider; private readonly BrighterTracer _tracer; private readonly Activity _parentActivity; - public BrighterTracerSpanTests() { - var builder = Sdk.CreateTracerProviderBuilder(); + var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); _tracer = new BrighterTracer(); _parentActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("BrighterTracerSpanTests"); - } + } - [Fact] - public void When_Creating_A_Span_Add_Brighter_Semantic_Conventions() + [Test] + public async Task When_Creating_A_Span_Add_Brighter_Semantic_Conventions() { //arrange - var command = new MyCommand { Value = "My Test String" }; - + var command = new MyCommand + { + Value = "My Test String" + }; //act - var childActivity = _tracer.CreateSpan( - CommandProcessorSpanOperation.Send, - command, - _parentActivity, - options: InstrumentationOptions.All - ); - + var childActivity = _tracer.CreateSpan(CommandProcessorSpanOperation.Send, command, _parentActivity, options: InstrumentationOptions.All); childActivity.Stop(); _parentActivity.Stop(); - - var flushed = _traceProvider.ForceFlush(); - + var flushed = _traceProvider.ForceFlush(); //assert - Assert.True(flushed); - + await Assert.That(flushed).IsTrue(); //check the created activity - Assert.Equal(_parentActivity.Id, childActivity.ParentId); - Assert.Equal($"{nameof(MyCommand)} {CommandProcessorSpanOperation.Send.ToSpanName()}", childActivity.DisplayName); - Assert.Equal(BrighterSemanticConventions.SourceName, childActivity.Source.Name); + await Assert.That(childActivity.ParentId).IsEqualTo(_parentActivity.Id); + await Assert.That(childActivity.DisplayName).IsEqualTo($"{nameof(MyCommand)} {CommandProcessorSpanOperation.Send.ToSpanName()}"); + await Assert.That(childActivity.Source.Name).IsEqualTo(BrighterSemanticConventions.SourceName); var tagDictionary = childActivity.Tags.ToDictionary(pair => pair.Key, pair => pair.Value); - Assert.Contains(BrighterSemanticConventions.RequestId, tagDictionary.Keys); - Assert.Equal(command.Id.ToString(), tagDictionary[BrighterSemanticConventions.RequestId]); - Assert.Contains(BrighterSemanticConventions.RequestType, tagDictionary.Keys); - Assert.Equal(command.GetType().Name, tagDictionary[BrighterSemanticConventions.RequestType]); - Assert.Contains(BrighterSemanticConventions.RequestBody, tagDictionary.Keys); - Assert.Equal(System.Text.Json.JsonSerializer.Serialize(command, JsonSerialisationOptions.Options), tagDictionary[BrighterSemanticConventions.RequestBody]); - Assert.Contains(BrighterSemanticConventions.Operation, tagDictionary.Keys); - Assert.Equal(CommandProcessorSpanOperation.Send.ToSpanName(), tagDictionary[BrighterSemanticConventions.Operation]); - - + await Assert.That(tagDictionary.Keys).Contains(BrighterSemanticConventions.RequestId); + await Assert.That(tagDictionary[BrighterSemanticConventions.RequestId]).IsEqualTo(command.Id.ToString()); + await Assert.That(tagDictionary.Keys).Contains(BrighterSemanticConventions.RequestType); + await Assert.That(tagDictionary[BrighterSemanticConventions.RequestType]).IsEqualTo(command.GetType().Name); + await Assert.That(tagDictionary.Keys).Contains(BrighterSemanticConventions.RequestBody); + await Assert.That(tagDictionary[BrighterSemanticConventions.RequestBody]).IsEqualTo(System.Text.Json.JsonSerializer.Serialize(command, JsonSerialisationOptions.Options)); + await Assert.That(tagDictionary.Keys).Contains(BrighterSemanticConventions.Operation); + await Assert.That(tagDictionary[BrighterSemanticConventions.Operation]).IsEqualTo(CommandProcessorSpanOperation.Send.ToSpanName()); //check via the exporter as well - Assert.Equal(2, _exportedActivities.Count); - Assert.Contains(_exportedActivities, a => a.Source.Name == BrighterSemanticConventions.SourceName); - var childSpan = _exportedActivities.First(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Send.ToSpanName()}"); - Assert.NotNull(childSpan); - Assert.Equal(_parentActivity.Id, childSpan.ParentId); - Assert.Contains(childSpan.Tags, t => t.Key == BrighterSemanticConventions.RequestId && (string)t.Value == command.Id.ToString()); - Assert.Contains(childSpan.Tags, t => t.Key == BrighterSemanticConventions.RequestType && (string)t.Value == command.GetType().Name); - Assert.Contains(childSpan.Tags, t => t.Key == BrighterSemanticConventions.RequestBody && (string)t.Value == System.Text.Json.JsonSerializer.Serialize(command, JsonSerialisationOptions.Options)); - Assert.Contains(childSpan.Tags, t => t.Key == BrighterSemanticConventions.Operation && (string)t.Value == CommandProcessorSpanOperation.Send.ToSpanName()); + await Assert.That(_exportedActivities.Count).IsEqualTo(2); + await Assert.That(_exportedActivities).Contains(a => a.Source.Name == BrighterSemanticConventions.SourceName); + var childSpan = _exportedActivities.First(a => a.DisplayName == $"{nameof(MyCommand)} {CommandProcessorSpanOperation.Send.ToSpanName()}"); + await Assert.That(childSpan).IsNotNull(); + await Assert.That(childSpan.ParentId).IsEqualTo(_parentActivity.Id); + await Assert.That(childSpan.Tags).Contains(t => t.Key == BrighterSemanticConventions.RequestId && (string)t.Value == command.Id.ToString()); + await Assert.That(childSpan.Tags).Contains(t => t.Key == BrighterSemanticConventions.RequestType && (string)t.Value == command.GetType().Name); + await Assert.That(childSpan.Tags).Contains(t => t.Key == BrighterSemanticConventions.RequestBody && (string)t.Value == System.Text.Json.JsonSerializer.Serialize(command, JsonSerialisationOptions.Options)); + await Assert.That(childSpan.Tags).Contains(t => t.Key == BrighterSemanticConventions.Operation && (string)t.Value == CommandProcessorSpanOperation.Send.ToSpanName()); } + [After(Test)] public void Dispose() { _parentActivity.Dispose(); _traceProvider.Dispose(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_An_Activity_Source_Use_Lib_Name_And_Version.cs b/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_An_Activity_Source_Use_Lib_Name_And_Version.cs index 653b9b0306..c1ab01367f 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_An_Activity_Source_Use_Lib_Name_And_Version.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/Common/When_Creating_An_Activity_Source_Use_Lib_Name_And_Version.cs @@ -1,23 +1,19 @@ -using Paramore.Brighter.Observability; -using Xunit; +using Paramore.Brighter.Observability; namespace Paramore.Brighter.Core.Tests.Observability.Common; - -public class BrighterActivitySourceTests +public class BrighterActivitySourceTests { - [Fact] - public void When_creating_an_activity_source_use_lib_name_and_version() + [Test] + public async Task When_creating_an_activity_source_use_lib_name_and_version() { //arrange var assemblyName = typeof(BrighterTracer).Assembly.GetName(); var sourceName = assemblyName.Name; - var version = assemblyName.Version?.ToString(); - + var version = assemblyName.Version?.ToString(); //act var activitySource = new BrighterTracer().ActivitySource; - //assert - Assert.Equal(sourceName, activitySource.Name); - Assert.Equal(version, activitySource.Version); + await Assert.That(activitySource.Name).IsEqualTo(sourceName); + await Assert.That(activitySource.Version).IsEqualTo(version); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_A_Message_Is_Dispatched_It_Should_Begin_A_Span.cs b/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_A_Message_Is_Dispatched_It_Should_Begin_A_Span.cs index e9ebc158d1..57a05c2381 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_A_Message_Is_Dispatched_It_Should_Begin_A_Span.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_A_Message_Is_Dispatched_It_Should_Begin_A_Span.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright � 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the �Software�), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED �AS IS�, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Collections.Generic; using System.Diagnostics; @@ -36,11 +34,11 @@ THE SOFTWARE. */ using Paramore.Brighter.Observability; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; using Baggage = OpenTelemetry.Baggage; namespace Paramore.Brighter.Core.Tests.Observability.MessageDispatch { + [NotInParallel("Observability")] public class MessagePumpDispatchObservabilityTests { private const string ChannelName = "myChannel"; @@ -53,112 +51,66 @@ public class MessagePumpDispatchObservabilityTests private readonly List _exportedActivities; private readonly TracerProvider _traceProvider; private readonly Message _message; - public MessagePumpDispatchObservabilityTests() { var builder = Sdk.CreateTracerProviderBuilder(); _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - - + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); var subscriberRegistry = new SubscriberRegistry(); subscriberRegistry.Register(); - var handlerFactory = new SimpleHandlerFactorySync(_ => new MyEventHandler(_receivedMessages)); - - var timeProvider = new FakeTimeProvider(); + var timeProvider = new FakeTimeProvider(); var tracer = new BrighterTracer(timeProvider); var instrumentationOptions = InstrumentationOptions.All; - - var commandProcessor = new Brighter.CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: instrumentationOptions); - - PipelineBuilder.ClearPipelineCache(); - - var channel = new Channel( - new(ChannelName),_routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory( - _ => new MyEventMessageMapper()), - null); + var commandProcessor = new Brighter.CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: instrumentationOptions); + var channel = new Channel(new(ChannelName), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), null); messageMapperRegistry.Register(); - - _messagePump = new Reactor(commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel, tracer, instrumentationOptions) + _messagePump = new Reactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel, tracer, instrumentationOptions) { - Channel = channel, TimeOut = TimeSpan.FromMilliseconds(5000) + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(5000) }; - var externalActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("MessagePumpSpanTests"); - Baggage.SetBaggage( "mykey", "myvalue" ); - - _message = new Message( - new MessageHeader(_myEvent.Id, _routingKey, MessageType.MT_EVENT, replyTo: new RoutingKey("io.paramorebrighter.myevent")), - new MessageBody(JsonSerializer.Serialize(_myEvent, JsonSerialisationOptions.Options)) - ); - + Baggage.SetBaggage("mykey", "myvalue"); + _message = new Message(new MessageHeader(_myEvent.Id, _routingKey, MessageType.MT_EVENT, replyTo: new RoutingKey("io.paramorebrighter.myevent")), new MessageBody(JsonSerializer.Serialize(_myEvent, JsonSerialisationOptions.Options))); var contextPropogator = new TextContextPropogator(); contextPropogator.PropogateContext(externalActivity?.Context, _message); - externalActivity?.Stop(); - - channel.Enqueue(_message); var quitMessage = MessageFactory.CreateQuitMessage(new RoutingKey("MyTopic")); channel.Enqueue(quitMessage); - } - [Fact] - public void When_a_message_is_dispatched_it_should_begin_a_span() + [Test] + public async Task When_a_message_is_dispatched_it_should_begin_a_span() { _messagePump.Run(); - _traceProvider.ForceFlush(); - - Assert.Equal(6, _exportedActivities.Count); - Assert.Contains(_exportedActivities, a => a.Source.Name == "Paramore.Brighter"); - + await Assert.That(_exportedActivities.Count).IsEqualTo(6); + await Assert.That(_exportedActivities).Contains(a => a.Source.Name == "Paramore.Brighter"); //there should be a span for each message received by a pump - var createActivity = _exportedActivities.FirstOrDefault(a => - a.DisplayName == $"{_message.Header.Topic} {MessagePumpSpanOperation.Receive.ToSpanName()}" - && a.TagObjects.Any(to => to is { Value: not null, Key: BrighterSemanticConventions.MessageType } && Enum.Parse(to.Value.ToString() ?? string.Empty) == MessageType.MT_EVENT) - ); - Assert.NotNull(createActivity); - Assert.Equal(_message.Header.TraceParent?.Value, createActivity!.ParentId); - Assert.Contains(Baggage.Current.GetBaggage(), b => b.Key == "mykey" && b.Value == "myvalue"); - Assert.Contains(createActivity.Tags, t => t is { Key: BrighterSemanticConventions.MessagingOperationType, Value: "receive" }); - Assert.Contains(createActivity.TagObjects, t => t.Key == BrighterSemanticConventions.MessagingDestination && t.Value == _message.Header.Topic); - Assert.Contains(createActivity.Tags, t => t.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && t.Value == _message.Header.PartitionKey.Value); - Assert.Contains(createActivity.Tags, t => t.Key == BrighterSemanticConventions.MessageId && t.Value == _message.Id.Value); - Assert.Contains(createActivity.Tags, t => t.Key == BrighterSemanticConventions.MessageType && t.Value == _message.Header.MessageType.ToString()); - Assert.Contains(createActivity.TagObjects, t => t.Value != null && t.Key == BrighterSemanticConventions.MessageBodySize && Convert.ToInt32(t.Value) == _message.Body.Bytes.Length); - Assert.Contains(createActivity.Tags, t => t.Key == BrighterSemanticConventions.MessageBody && t.Value == _message.Body.Value); - Assert.Contains(createActivity.Tags, t => t.Key == BrighterSemanticConventions.MessageHeaders && t.Value == JsonSerializer.Serialize(_message.Header, JsonSerialisationOptions.Options)); - Assert.Contains(createActivity.Tags, t => t.Key == BrighterSemanticConventions.ConversationId && t.Value == _message.Header.CorrelationId.Value); - Assert.Contains(createActivity.Tags, t => t.Key == BrighterSemanticConventions.MessagingSystem && t.Value == MessagingSystem.InternalBus.ToMessagingSystemName()); - Assert.Contains(createActivity.TagObjects, t => t.Value != null && t.Key == BrighterSemanticConventions.CeSource && ((Uri)(t.Value)) == _message.Header.Source); - Assert.Contains(createActivity.Tags, t => t.Key == BrighterSemanticConventions.CeSubject && t.Value == _message.Header.Subject); - Assert.Contains(createActivity.Tags, t => t.Key == BrighterSemanticConventions.CeVersion && t.Value == "1.0"); - Assert.Contains(createActivity.Tags, t => t.Key == BrighterSemanticConventions.CeType && t.Value == _message.Header.Type); - Assert.Contains(createActivity.Tags, t => t.Key == BrighterSemanticConventions.CeMessageId && t.Value == _message.Id.Value); - Assert.Contains(createActivity.TagObjects, t => t.Key == BrighterSemanticConventions.HandledCount && Convert.ToInt32(t.Value) == _message.Header.HandledCount); - Assert.Contains(createActivity.Tags, t => t.Key == BrighterSemanticConventions.ReplyTo && t.Value == _message.Header.ReplyTo?.Value); + var createActivity = _exportedActivities.FirstOrDefault(a => a.DisplayName == $"{_message.Header.Topic} {MessagePumpSpanOperation.Receive.ToSpanName()}" && a.TagObjects.Any(to => to is { Value: not null, Key: BrighterSemanticConventions.MessageType } && Enum.Parse(to.Value.ToString() ?? string.Empty) == MessageType.MT_EVENT)); + await Assert.That(createActivity).IsNotNull(); + await Assert.That(createActivity!.ParentId).IsEqualTo(_message.Header.TraceParent?.Value); + await Assert.That(Baggage.Current.GetBaggage()).Contains(b => b.Key == "mykey" && b.Value == "myvalue"); + await Assert.That(createActivity.Tags).Contains(t => t is { Key: BrighterSemanticConventions.MessagingOperationType, Value: "receive" }); + await Assert.That(createActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.MessagingDestination && t.Value == _message.Header.Topic); + await Assert.That(createActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessagingDestinationPartitionId && t.Value == _message.Header.PartitionKey.Value); + await Assert.That(createActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessageId && t.Value == _message.Id.Value); + await Assert.That(createActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessageType && t.Value == _message.Header.MessageType.ToString()); + await Assert.That(createActivity.TagObjects).Contains(t => t.Value != null && t.Key == BrighterSemanticConventions.MessageBodySize && Convert.ToInt32(t.Value) == _message.Body.Bytes.Length); + await Assert.That(createActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessageBody && t.Value == _message.Body.Value); + await Assert.That(createActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessageHeaders && t.Value == JsonSerializer.Serialize(_message.Header, JsonSerialisationOptions.Options)); + await Assert.That(createActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.ConversationId && t.Value == _message.Header.CorrelationId.Value); + await Assert.That(createActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.MessagingSystem && t.Value == MessagingSystem.InternalBus.ToMessagingSystemName()); + await Assert.That(createActivity.TagObjects).Contains(t => t.Value != null && t.Key == BrighterSemanticConventions.CeSource && ((Uri)(t.Value)) == _message.Header.Source); + await Assert.That(createActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.CeSubject && t.Value == _message.Header.Subject); + await Assert.That(createActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.CeVersion && t.Value == "1.0"); + await Assert.That(createActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.CeType && t.Value == _message.Header.Type); + await Assert.That(createActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.CeMessageId && t.Value == _message.Id.Value); + await Assert.That(createActivity.TagObjects).Contains(t => t.Key == BrighterSemanticConventions.HandledCount && Convert.ToInt32(t.Value) == _message.Header.HandledCount); + await Assert.That(createActivity.Tags).Contains(t => t.Key == BrighterSemanticConventions.ReplyTo && t.Value == _message.Header.ReplyTo?.Value); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_There_Are_No_Messages_Close_The_Span.cs b/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_There_Are_No_Messages_Close_The_Span.cs index 67c3ffa991..61f51a9051 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_There_Are_No_Messages_Close_The_Span.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_There_Are_No_Messages_Close_The_Span.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -10,10 +10,9 @@ using Paramore.Brighter.Observability; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.MessageDispatch; - +[NotInParallel("Observability")] public class MessagePumpEmptyQueueOberservabilityTests { private const string Topic = "MyTopic"; @@ -26,83 +25,44 @@ public class MessagePumpEmptyQueueOberservabilityTests private readonly List _exportedActivities; private readonly TracerProvider _traceProvider; private readonly Message _message; - public MessagePumpEmptyQueueOberservabilityTests() { var builder = Sdk.CreateTracerProviderBuilder(); - _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - - - var subscriberRegistry = new SubscriberRegistry(); - subscriberRegistry.Register(); - - var handlerFactory = new SimpleHandlerFactorySync(_ => new MyEventHandler(_receivedMessages)); - - var timeProvider = new FakeTimeProvider(); - var tracer = new BrighterTracer(timeProvider); - var instrumentationOptions = InstrumentationOptions.All; - - var commandProcessor = new Brighter.CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: instrumentationOptions); - - PipelineBuilder.ClearPipelineCache(); - - Channel channel = new(new(ChannelName),_routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory( - _ => new MyEventMessageMapper()), - null); - messageMapperRegistry.Register(); - - _messagePump = new Reactor(commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel, tracer, instrumentationOptions) - { - Channel = channel, TimeOut = TimeSpan.FromMilliseconds(5000), EmptyChannelDelay = TimeSpan.FromMilliseconds(1000) - }; - - //in theory the message pump should see this from the consumer when the queue is empty - //we are just forcing this to run exactly once, before we quit. - _message = MessageFactory.CreateEmptyMessage(_routingKey); - - channel.Enqueue(_message); - - var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); - channel.Enqueue(quitMessage); + _exportedActivities = new List(); + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); + var subscriberRegistry = new SubscriberRegistry(); + subscriberRegistry.Register(); + var handlerFactory = new SimpleHandlerFactorySync(_ => new MyEventHandler(_receivedMessages)); + var timeProvider = new FakeTimeProvider(); + var tracer = new BrighterTracer(timeProvider); + var instrumentationOptions = InstrumentationOptions.All; + var commandProcessor = new Brighter.CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: instrumentationOptions); + Channel channel = new(new(ChannelName), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), null); + messageMapperRegistry.Register(); + _messagePump = new Reactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel, tracer, instrumentationOptions) + { + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + EmptyChannelDelay = TimeSpan.FromMilliseconds(1000) + }; + //in theory the message pump should see this from the consumer when the queue is empty + //we are just forcing this to run exactly once, before we quit. + _message = MessageFactory.CreateEmptyMessage(_routingKey); + channel.Enqueue(_message); + var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); + channel.Enqueue(quitMessage); } - [Fact] - public void When_There_Are_No_Messages_Close_The_Span() + [Test] + public async Task When_There_Are_No_Messages_Close_The_Span() { _messagePump.Run(); - _traceProvider.ForceFlush(); - - Assert.Equal(3, _exportedActivities.Count); - Assert.Contains(_exportedActivities, a => a.Source.Name == "Paramore.Brighter"); - - var emptyMessageActivity = _exportedActivities.FirstOrDefault(a => - a.DisplayName == $"{_message.Header.Topic} {MessagePumpSpanOperation.Receive.ToSpanName()}" - && a.TagObjects.Any(t => - t is { Value: not null, Key: BrighterSemanticConventions.MessageType } - && Enum.Parse(t.Value.ToString()) == MessageType.MT_NONE - ) - ); - - Assert.NotNull(emptyMessageActivity); - Assert.Equal(ActivityStatusCode.Ok, emptyMessageActivity!.Status); - + await Assert.That(_exportedActivities.Count).IsEqualTo(3); + await Assert.That(_exportedActivities).Contains(a => a.Source.Name == "Paramore.Brighter"); + var emptyMessageActivity = _exportedActivities.FirstOrDefault(a => a.DisplayName == $"{_message.Header.Topic} {MessagePumpSpanOperation.Receive.ToSpanName()}" && a.TagObjects.Any(t => t is { Value: not null, Key: BrighterSemanticConventions.MessageType } && Enum.Parse(t.Value.ToString()) == MessageType.MT_NONE)); + await Assert.That(emptyMessageActivity).IsNotNull(); + await Assert.That(emptyMessageActivity!.Status).IsEqualTo(ActivityStatusCode.Ok); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_There_Is_A_BrokenCircuit_Channel_Failure_Close_The_Span.cs b/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_There_Is_A_BrokenCircuit_Channel_Failure_Close_The_Span.cs index 25a2839c95..83c2dfc09a 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_There_Is_A_BrokenCircuit_Channel_Failure_Close_The_Span.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_There_Is_A_BrokenCircuit_Channel_Failure_Close_The_Span.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -14,10 +14,9 @@ using Paramore.Brighter.Observability; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.MessageDispatch; - +[NotInParallel("Observability")] public class MessagePumpBrokenCircuitChannelFailureOberservabilityTests { private const string ChannelName = "myChannel"; @@ -30,93 +29,46 @@ public class MessagePumpBrokenCircuitChannelFailureOberservabilityTests private readonly TracerProvider _traceProvider; private readonly MyEvent _myEvent = new(); private readonly Message _message; - public MessagePumpBrokenCircuitChannelFailureOberservabilityTests() { var builder = Sdk.CreateTracerProviderBuilder(); - _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - - - var subscriberRegistry = new SubscriberRegistry(); - subscriberRegistry.Register(); - - var handlerFactory = new SimpleHandlerFactorySync(_ => new MyEventHandler(_receivedMessages)); - - var timeProvider = new FakeTimeProvider(); - var tracer = new BrighterTracer(timeProvider); - var instrumentationOptions = InstrumentationOptions.All; - - var commandProcessor = new Brighter.CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: instrumentationOptions); - - PipelineBuilder.ClearPipelineCache(); - - FailingChannel channel = new( - new (ChannelName), - _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), - brokenCircuit: true); - - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory( - _ => new MyEventMessageMapper()), - null); - messageMapperRegistry.Register(); - - _messagePump = new Reactor(commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel, tracer, instrumentationOptions) - { - Channel = channel, TimeOut = TimeSpan.FromMilliseconds(5000), EmptyChannelDelay = TimeSpan.FromMilliseconds(1000) - }; - - var externalActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("MessagePumpSpanTests"); - - _message = new Message( - new MessageHeader(_myEvent.Id, _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize(_myEvent, JsonSerialisationOptions.Options)) - ); - - var contextPropogator = new TextContextPropogator(); - contextPropogator.PropogateContext(externalActivity?.Context, _message); - - externalActivity?.Stop(); - - channel.Enqueue(_message); - - var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); - channel.Enqueue(quitMessage); - + _exportedActivities = new List(); + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); + var subscriberRegistry = new SubscriberRegistry(); + subscriberRegistry.Register(); + var handlerFactory = new SimpleHandlerFactorySync(_ => new MyEventHandler(_receivedMessages)); + var timeProvider = new FakeTimeProvider(); + var tracer = new BrighterTracer(timeProvider); + var instrumentationOptions = InstrumentationOptions.All; + var commandProcessor = new Brighter.CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: instrumentationOptions); + FailingChannel channel = new(new(ChannelName), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), brokenCircuit: true); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), null); + messageMapperRegistry.Register(); + _messagePump = new Reactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel, tracer, instrumentationOptions) + { + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + EmptyChannelDelay = TimeSpan.FromMilliseconds(1000) + }; + var externalActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("MessagePumpSpanTests"); + _message = new Message(new MessageHeader(_myEvent.Id, _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(_myEvent, JsonSerialisationOptions.Options))); + var contextPropogator = new TextContextPropogator(); + contextPropogator.PropogateContext(externalActivity?.Context, _message); + externalActivity?.Stop(); + channel.Enqueue(_message); + var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); + channel.Enqueue(quitMessage); } - [Fact] - public void When_There_Is_A_BrokenCircuit_Channel_Failure_Close_The_Span() + [Test] + public async Task When_There_Is_A_BrokenCircuit_Channel_Failure_Close_The_Span() { _messagePump.Run(); - _traceProvider.ForceFlush(); - - Assert.Equal(7, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - - var errorMessageActivity = _exportedActivities.FirstOrDefault(a => - a.DisplayName == $"{_message.Header.Topic} {MessagePumpSpanOperation.Receive.ToSpanName()}" - && a.Status == ActivityStatusCode.Error - ); - - Assert.NotNull(errorMessageActivity); - Assert.Equal(ActivityStatusCode.Error, errorMessageActivity?.Status); + await Assert.That(_exportedActivities.Count).IsEqualTo(7); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); + var errorMessageActivity = _exportedActivities.FirstOrDefault(a => a.DisplayName == $"{_message.Header.Topic} {MessagePumpSpanOperation.Receive.ToSpanName()}" && a.Status == ActivityStatusCode.Error); + await Assert.That(errorMessageActivity).IsNotNull(); + await Assert.That(errorMessageActivity?.Status).IsEqualTo(ActivityStatusCode.Error); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_There_Is_A_Channel_Failure_Close_The_Span.cs b/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_There_Is_A_Channel_Failure_Close_The_Span.cs index 7e4d53d022..de25bceddc 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_There_Is_A_Channel_Failure_Close_The_Span.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_There_Is_A_Channel_Failure_Close_The_Span.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -14,10 +14,9 @@ using Paramore.Brighter.Observability; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.MessageDispatch; - +[NotInParallel("Observability")] public class MessagePumpChannelFailureOberservabilityTests { private const string ChannelName = "myChannel"; @@ -30,90 +29,44 @@ public class MessagePumpChannelFailureOberservabilityTests private readonly TracerProvider _traceProvider; private readonly MyEvent _myEvent = new(); private readonly Message _message; - public MessagePumpChannelFailureOberservabilityTests() { var builder = Sdk.CreateTracerProviderBuilder(); - _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - - - var subscriberRegistry = new SubscriberRegistry(); - subscriberRegistry.Register(); - - var handlerFactory = new SimpleHandlerFactorySync(_ => new MyEventHandler(_receivedMessages)); - - var timeProvider = new FakeTimeProvider(); - var tracer = new BrighterTracer(timeProvider); - var instrumentationOptions = InstrumentationOptions.All; - - var commandProcessor = new Brighter.CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: instrumentationOptions); - - PipelineBuilder.ClearPipelineCache(); - - FailingChannel channel = new( - new (ChannelName), - _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), - brokenCircuit: false); - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory( - _ => new MyEventMessageMapper()), - null); - messageMapperRegistry.Register(); - - _messagePump = new Reactor(commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, new EmptyMessageTransformerFactory(), - new InMemoryRequestContextFactory(), channel, tracer, instrumentationOptions) - { - Channel = channel, TimeOut = TimeSpan.FromMilliseconds(5000), EmptyChannelDelay = TimeSpan.FromMilliseconds(1000) - }; - - var externalActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("MessagePumpSpanTests"); - - _message = new Message( - new MessageHeader(_myEvent.Id, _routingKey, MessageType.MT_EVENT), - new MessageBody(JsonSerializer.Serialize(_myEvent, JsonSerialisationOptions.Options)) - ); - - externalActivity?.Stop(); - - channel.Enqueue(_message); - - var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); - channel.Enqueue(quitMessage); - + _exportedActivities = new List(); + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); + var subscriberRegistry = new SubscriberRegistry(); + subscriberRegistry.Register(); + var handlerFactory = new SimpleHandlerFactorySync(_ => new MyEventHandler(_receivedMessages)); + var timeProvider = new FakeTimeProvider(); + var tracer = new BrighterTracer(timeProvider); + var instrumentationOptions = InstrumentationOptions.All; + var commandProcessor = new Brighter.CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: instrumentationOptions); + FailingChannel channel = new(new(ChannelName), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)), brokenCircuit: false); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), null); + messageMapperRegistry.Register(); + _messagePump = new Reactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel, tracer, instrumentationOptions) + { + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + EmptyChannelDelay = TimeSpan.FromMilliseconds(1000) + }; + var externalActivity = new ActivitySource("Paramore.Brighter.Tests").StartActivity("MessagePumpSpanTests"); + _message = new Message(new MessageHeader(_myEvent.Id, _routingKey, MessageType.MT_EVENT), new MessageBody(JsonSerializer.Serialize(_myEvent, JsonSerialisationOptions.Options))); + externalActivity?.Stop(); + channel.Enqueue(_message); + var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); + channel.Enqueue(quitMessage); } - [Fact] - public void When_There_Is_A_Channel_Failure_Close_The_Span() + [Test] + public async Task When_There_Is_A_Channel_Failure_Close_The_Span() { _messagePump.Run(); - _traceProvider.ForceFlush(); - - Assert.Equal(7, _exportedActivities.Count); - Assert.Contains(_exportedActivities, a => a.Source.Name == "Paramore.Brighter"); - - var errorMessageActivity = _exportedActivities.FirstOrDefault(a => - a.DisplayName == $"{_message.Header.Topic} {MessagePumpSpanOperation.Receive.ToSpanName()}" - && a.Status == ActivityStatusCode.Error - ); - - Assert.NotNull(errorMessageActivity); - Assert.Equal(ActivityStatusCode.Error, errorMessageActivity.Status); + await Assert.That(_exportedActivities.Count).IsEqualTo(7); + await Assert.That(_exportedActivities).Contains(a => a.Source.Name == "Paramore.Brighter"); + var errorMessageActivity = _exportedActivities.FirstOrDefault(a => a.DisplayName == $"{_message.Header.Topic} {MessagePumpSpanOperation.Receive.ToSpanName()}" && a.Status == ActivityStatusCode.Error); + await Assert.That(errorMessageActivity).IsNotNull(); + await Assert.That(errorMessageActivity.Status).IsEqualTo(ActivityStatusCode.Error); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_There_Is_A_Quit_Message_Close_The_Span.cs b/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_There_Is_A_Quit_Message_Close_The_Span.cs index 8ae12f1bd4..9407df4ed3 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_There_Is_A_Quit_Message_Close_The_Span.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_There_Is_A_Quit_Message_Close_The_Span.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -10,10 +10,9 @@ using Paramore.Brighter.Observability; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.MessageDispatch; - +[NotInParallel("Observability")] public class MessagePumpQuitOberservabilityTests { private const string Topic = "MyTopic"; @@ -25,81 +24,40 @@ public class MessagePumpQuitOberservabilityTests private readonly IDictionary _receivedMessages = new Dictionary(); private readonly List _exportedActivities; private readonly TracerProvider _traceProvider; - public MessagePumpQuitOberservabilityTests() { var builder = Sdk.CreateTracerProviderBuilder(); - _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - - - var subscriberRegistry = new SubscriberRegistry(); - subscriberRegistry.Register(); - - var handlerFactory = new SimpleHandlerFactorySync(_ => new MyEventHandler(_receivedMessages)); - - var timeProvider = new FakeTimeProvider(); - var tracer = new BrighterTracer(timeProvider); - var instrumentationOptions = InstrumentationOptions.All; - - var commandProcessor = new Brighter.CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: instrumentationOptions); - - PipelineBuilder.ClearPipelineCache(); - - Channel channel = new( - new (Channel), _routingKey, - new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)) - ); - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory( - _ => new MyEventMessageMapper()), - null); - messageMapperRegistry.Register(); - - _messagePump = new Reactor(commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), - channel, tracer, instrumentationOptions) - { - Channel = channel, TimeOut= TimeSpan.FromMilliseconds(5000), EmptyChannelDelay = TimeSpan.FromMilliseconds(1000) - }; - - var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); - channel.Enqueue(quitMessage); + _exportedActivities = new List(); + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); + var subscriberRegistry = new SubscriberRegistry(); + subscriberRegistry.Register(); + var handlerFactory = new SimpleHandlerFactorySync(_ => new MyEventHandler(_receivedMessages)); + var timeProvider = new FakeTimeProvider(); + var tracer = new BrighterTracer(timeProvider); + var instrumentationOptions = InstrumentationOptions.All; + var commandProcessor = new Brighter.CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: instrumentationOptions); + Channel channel = new(new(Channel), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), null); + messageMapperRegistry.Register(); + _messagePump = new Reactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), channel, tracer, instrumentationOptions) + { + Channel = channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + EmptyChannelDelay = TimeSpan.FromMilliseconds(1000) + }; + var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); + channel.Enqueue(quitMessage); } - [Fact] - public void When_There_Is_A_Quit_Message_Close_The_Span() + [Test] + public async Task When_There_Is_A_Quit_Message_Close_The_Span() { _messagePump.Run(); - _traceProvider.ForceFlush(); - - Assert.Equal(2, _exportedActivities.Count); - Assert.True(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")); - - var emptyMessageActivity = _exportedActivities.FirstOrDefault(a => - a.DisplayName == $"{_routingKey} {MessagePumpSpanOperation.Receive.ToSpanName()}" - && a.TagObjects.Any(t => - t is { Value: not null, Key: BrighterSemanticConventions.MessageType } - && Enum.Parse(t.Value.ToString()) == MessageType.MT_QUIT - ) - ); - - Assert.NotNull(emptyMessageActivity); - Assert.Equal(ActivityStatusCode.Ok, emptyMessageActivity!.Status); - + await Assert.That(_exportedActivities.Count).IsEqualTo(2); + await Assert.That(_exportedActivities.Any(a => a.Source.Name == "Paramore.Brighter")).IsTrue(); + var emptyMessageActivity = _exportedActivities.FirstOrDefault(a => a.DisplayName == $"{_routingKey} {MessagePumpSpanOperation.Receive.ToSpanName()}" && a.TagObjects.Any(t => t is { Value: not null, Key: BrighterSemanticConventions.MessageType } && Enum.Parse(t.Value.ToString()) == MessageType.MT_QUIT)); + await Assert.That(emptyMessageActivity).IsNotNull(); + await Assert.That(emptyMessageActivity!.Status).IsEqualTo(ActivityStatusCode.Ok); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_There_Is_An_Unacceptable_Messages_Close_The_Span.cs b/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_There_Is_An_Unacceptable_Messages_Close_The_Span.cs index c43cec0dd6..a49c918f2c 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_There_Is_An_Unacceptable_Messages_Close_The_Span.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/MessageDispatch/When_There_Is_An_Unacceptable_Messages_Close_The_Span.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -10,10 +10,9 @@ using Paramore.Brighter.Observability; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Observability.MessageDispatch; - +[NotInParallel("Observability")] public class MessagePumpUnacceptableMessageOberservabilityTests { private const string Topic = "MyTopic"; @@ -27,86 +26,45 @@ public class MessagePumpUnacceptableMessageOberservabilityTests private readonly TracerProvider _traceProvider; private readonly Message _message; private readonly Channel _channel; - public MessagePumpUnacceptableMessageOberservabilityTests() { - var builder = Sdk.CreateTracerProviderBuilder(); - _exportedActivities = new List(); - - _traceProvider = builder - .AddSource("Paramore.Brighter.Tests", "Paramore.Brighter") - .ConfigureResource(r => r.AddService("in-memory-tracer")) - .AddInMemoryExporter(_exportedActivities) - .Build(); - - - var subscriberRegistry = new SubscriberRegistry(); - subscriberRegistry.Register(); - - var handlerFactory = new SimpleHandlerFactorySync(_ => new MyEventHandler(_receivedMessages)); - - var timeProvider = new FakeTimeProvider(); - var tracer = new BrighterTracer(timeProvider); - var instrumentationOptions = InstrumentationOptions.All; - - var commandProcessor = new Brighter.CommandProcessor( - subscriberRegistry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory(), - tracer: tracer, - instrumentationOptions: instrumentationOptions); - - PipelineBuilder.ClearPipelineCache(); - - _channel = new Channel(new(ChannelName), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); - var messageMapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory( - _ => new MyEventMessageMapper()), - null); - messageMapperRegistry.Register(); - - _messagePump = new Reactor(commandProcessor, (message) => typeof(MyEvent), - messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), _channel, tracer, instrumentationOptions) - { - Channel = _channel, TimeOut = TimeSpan.FromMilliseconds(5000), EmptyChannelDelay = TimeSpan.FromMilliseconds(1000) - }; - - //in theory the message pump should see this from the consumer when the queue is empty - //we are just forcing this to run exactly once, before we quit. - _message = new Message( - new MessageHeader(Guid.Empty.ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), - new MessageBody(string.Empty) - ); - - _channel.Enqueue(_message); - - var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); - _channel.Enqueue(quitMessage); + var builder = Sdk.CreateTracerProviderBuilder(); + _exportedActivities = new List(); + _traceProvider = builder.AddSource("Paramore.Brighter.Tests", "Paramore.Brighter").ConfigureResource(r => r.AddService("in-memory-tracer")).AddInMemoryExporter(_exportedActivities).Build(); + var subscriberRegistry = new SubscriberRegistry(); + subscriberRegistry.Register(); + var handlerFactory = new SimpleHandlerFactorySync(_ => new MyEventHandler(_receivedMessages)); + var timeProvider = new FakeTimeProvider(); + var tracer = new BrighterTracer(timeProvider); + var instrumentationOptions = InstrumentationOptions.All; + var commandProcessor = new Brighter.CommandProcessor(subscriberRegistry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory(), tracer: tracer, instrumentationOptions: instrumentationOptions); + _channel = new Channel(new(ChannelName), _routingKey, new InMemoryMessageConsumer(_routingKey, _bus, _timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000))); + var messageMapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => new MyEventMessageMapper()), null); + messageMapperRegistry.Register(); + _messagePump = new Reactor(commandProcessor, (message) => typeof(MyEvent), messageMapperRegistry, new EmptyMessageTransformerFactory(), new InMemoryRequestContextFactory(), _channel, tracer, instrumentationOptions) + { + Channel = _channel, + TimeOut = TimeSpan.FromMilliseconds(5000), + EmptyChannelDelay = TimeSpan.FromMilliseconds(1000) + }; + //in theory the message pump should see this from the consumer when the queue is empty + //we are just forcing this to run exactly once, before we quit. + _message = new Message(new MessageHeader(Guid.Empty.ToString(), _routingKey, MessageType.MT_UNACCEPTABLE), new MessageBody(string.Empty)); + _channel.Enqueue(_message); + var quitMessage = MessageFactory.CreateQuitMessage(_routingKey); + _channel.Enqueue(quitMessage); } - [Fact] - public void When_There_Are_No_Messages_Close_The_Span() + [Test] + public async Task When_There_Are_No_Messages_Close_The_Span() { _messagePump.Run(); - _traceProvider.ForceFlush(); - - Assert.Equal(3, _exportedActivities.Count); - Assert.Contains(_exportedActivities, a => a.Source.Name == "Paramore.Brighter"); - - var emptyMessageActivity = _exportedActivities.FirstOrDefault(a => - a.DisplayName == $"{_message.Header.Topic} {MessagePumpSpanOperation.Receive.ToSpanName()}" - && a.TagObjects.Any(t => - t is { Value: not null, Key: BrighterSemanticConventions.MessageType } - && Enum.Parse(t.Value.ToString()) == MessageType.MT_UNACCEPTABLE - ) - ); - - Assert.NotNull(emptyMessageActivity); - Assert.Equal(ActivityStatusCode.Error, emptyMessageActivity!.Status); - Assert.Contains($"MessagePump: Failed to parse a message from the incoming message with id {_message.Id} from {_channel.Name}", emptyMessageActivity.StatusDescription); + await Assert.That(_exportedActivities.Count).IsEqualTo(3); + await Assert.That(_exportedActivities).Contains(a => a.Source.Name == "Paramore.Brighter"); + var emptyMessageActivity = _exportedActivities.FirstOrDefault(a => a.DisplayName == $"{_message.Header.Topic} {MessagePumpSpanOperation.Receive.ToSpanName()}" && a.TagObjects.Any(t => t is { Value: not null, Key: BrighterSemanticConventions.MessageType } && Enum.Parse(t.Value.ToString()) == MessageType.MT_UNACCEPTABLE)); + await Assert.That(emptyMessageActivity).IsNotNull(); + await Assert.That(emptyMessageActivity!.Status).IsEqualTo(ActivityStatusCode.Error); + await Assert.That(emptyMessageActivity.StatusDescription).Contains($"MessagePump: Failed to parse a message from the incoming message with id {_message.Id} from {_channel.Name}"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Observability/TraceState/When_Adding_TraceState.cs b/tests/Paramore.Brighter.Core.Tests/Observability/TraceState/When_Adding_TraceState.cs index f37b1d038d..65e5848d4a 100644 --- a/tests/Paramore.Brighter.Core.Tests/Observability/TraceState/When_Adding_TraceState.cs +++ b/tests/Paramore.Brighter.Core.Tests/Observability/TraceState/When_Adding_TraceState.cs @@ -1,60 +1,48 @@ -using Paramore.Brighter.Observability; -using Xunit; +using System.Threading.Tasks; +using Paramore.Brighter.Observability; namespace Paramore.Brighter.Core.Tests.Observability.Trace; - -public class TraceStateTests +public class TraceStateTests { - [Fact] - public void When_Adding_TraceState() + [Test] + public async Task When_Adding_TraceState() { // Arrange var traceState = new Baggage(); - //act traceState.Add("key1", "value1"); traceState.Add("key2", "value2"); - // Assert - Assert.Equal("key1=value1,key2=value2", traceState.ToString()); + await Assert.That(traceState.ToString()).IsEqualTo("key1=value1,key2=value2"); } - [Fact] - public void When_Adding_TraceState_From_Baggage() + [Test] + public async Task When_Adding_TraceState_From_Baggage() { //Arrange var traceState = new Baggage(); var baggage = "key1=value1,key2=value2"; - //Act traceState.Add("key3", "value3"); traceState.LoadBaggage(baggage); - //Assert - Assert.Equal("key3=value3,key1=value1,key2=value2", traceState.ToString()); + await Assert.That(traceState.ToString()).IsEqualTo("key3=value3,key1=value1,key2=value2"); } - [Fact] - public void When_Enumerating_TraceState() + [Test] + public async Task When_Enumerating_TraceState() { //Arrange var traceState = new Baggage(); traceState.Add("key1", "value1"); traceState.Add("key2", "value2"); - //Act - //Assert - Assert.Collection(traceState, - entry => - { - Assert.Equal("key1", entry.Key); - Assert.Equal("value1", entry.Value); - }, - entry => - { - Assert.Equal("key2", entry.Key); - Assert.Equal("value2", entry.Value); - }); + var entries = traceState.ToList(); + await Assert.That(entries).Count().IsEqualTo(2); + await Assert.That(entries[0].Key).IsEqualTo("key1"); + await Assert.That(entries[0].Value).IsEqualTo("value1"); + await Assert.That(entries[1].Key).IsEqualTo("key2"); + await Assert.That(entries[1].Value).IsEqualTo("value2"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Inbox_Enabled.cs b/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Inbox_Enabled.cs index c610c0d686..c748384b26 100644 --- a/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Inbox_Enabled.cs +++ b/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Inbox_Enabled.cs @@ -1,4 +1,4 @@ -using System; +using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.OnceOnly.TestDoubles; using Paramore.Brighter.Inbox.Exceptions; @@ -6,46 +6,39 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; using Paramore.Brighter.Inbox.Handlers; namespace Paramore.Brighter.Core.Tests.OnceOnly { - public class OnceOnlyAttributeTests + public class OnceOnlyAttributeTests { private readonly MyCommand _command; private readonly IAmAnInboxSync _inbox; private readonly IAmACommandProcessor _commandProcessor; - public OnceOnlyAttributeTests() { _inbox = new InMemoryInbox(new FakeTimeProvider()); - var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddSingleton(_inbox); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _command = new MyCommand {Value = "My Test String"}; - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); + _command = new MyCommand + { + Value = "My Test String" + }; + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void When_Handling_A_Command_Only_Once() + [Test] + public async Task When_Handling_A_Command_Only_Once() { _commandProcessor.Send(_command); - - Exception ex = Assert.Throws(() => _commandProcessor.Send(_command)); - - Assert.Equal($"A command with id {_command.Id} has already been handled", ex.Message); + var ex = await Assert.That(() => _commandProcessor.Send(_command)).ThrowsExactly(); + await Assert.That(ex!.Message).IsEqualTo($"A command with id {_command.Id} has already been handled"); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Inbox_Enabled_Async.cs b/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Inbox_Enabled_Async.cs index 0781484897..0528077cb5 100644 --- a/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Inbox_Enabled_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Inbox_Enabled_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.OnceOnly.TestDoubles; @@ -7,49 +7,39 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; using Paramore.Brighter.Inbox.Handlers; namespace Paramore.Brighter.Core.Tests.OnceOnly { - public class OnceOnlyAttributeAsyncTests { private readonly MyCommand _command; private readonly IAmAnInboxAsync _inbox; private readonly IAmACommandProcessor _commandProcessor; - public OnceOnlyAttributeAsyncTests() { _inbox = new InMemoryInbox(new FakeTimeProvider()); - var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddSingleton(_inbox); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _command = new MyCommand {Value = "My Test String"}; - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); + _command = new MyCommand + { + Value = "My Test String" + }; + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task When_Handling_A_Command_Only_Once() { await _commandProcessor.SendAsync(_command); - - Exception ex = await Assert.ThrowsAsync(() => _commandProcessor.SendAsync(_command)); - - Assert.Equal($"A command with id {_command.Id} has already been handled", ex.Message); - + var ex = await Assert.That(() => _commandProcessor.SendAsync(_command)).ThrowsExactly(); + await Assert.That(ex!.Message).IsEqualTo($"A command with id {_command.Id} has already been handled"); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Throw_Enabled.cs b/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Throw_Enabled.cs index 5dab5c465c..1d74ec3272 100644 --- a/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Throw_Enabled.cs +++ b/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Throw_Enabled.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright � 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the �Software�), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED �AS IS�, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.OnceOnly.TestDoubles; @@ -30,7 +28,6 @@ THE SOFTWARE. */ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; using Paramore.Brighter.Inbox.Handlers; namespace Paramore.Brighter.Core.Tests.OnceOnly @@ -40,36 +37,30 @@ public class OnceOnlyAttributeWithThrowExceptionTests private readonly MyCommand _command; private readonly IAmAnInboxSync _inbox; private readonly IAmACommandProcessor _commandProcessor; - public OnceOnlyAttributeWithThrowExceptionTests() { _inbox = new InMemoryInbox(new FakeTimeProvider()); - var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddSingleton(_inbox); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _command = new MyCommand {Value = "My Test String"}; - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); + _command = new MyCommand + { + Value = "My Test String" + }; + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void When_Handling_A_Command_Once_Only_With_Throw_Enabled() + [Test] + public async Task When_Handling_A_Command_Once_Only_With_Throw_Enabled() { _commandProcessor.Send(_command); - - Exception ex = Assert.Throws(() => _commandProcessor.Send(_command)); - - Assert.Equal($"A command with id {_command.Id} has already been handled", ex.Message); + var ex = await Assert.That(() => _commandProcessor.Send(_command)).ThrowsExactly(); + await Assert.That(ex!.Message).IsEqualTo($"A command with id {_command.Id} has already been handled"); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Throw_Enabled_Async.cs b/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Throw_Enabled_Async.cs index c4c2e2d77b..85ec8cb480 100644 --- a/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Throw_Enabled_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Throw_Enabled_Async.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright � 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the �Software�), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED �AS IS�, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; @@ -32,7 +30,6 @@ THE SOFTWARE. */ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.OnceOnly { @@ -41,36 +38,30 @@ public class OnceOnlyAttributeWithThrowExceptionAsyncTests private readonly MyCommand _command; private readonly IAmAnInboxAsync _inbox; private readonly IAmACommandProcessor _commandProcessor; - public OnceOnlyAttributeWithThrowExceptionAsyncTests() { _inbox = new InMemoryInbox(new FakeTimeProvider()); - var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient>(); container.AddTransient(); container.AddSingleton(_inbox); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _command = new MyCommand {Value = "My Test String"}; - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); + _command = new MyCommand + { + Value = "My Test String" + }; + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task When_Handling_A_Command_Once_Only_With_Throw_Enabled() { await _commandProcessor.SendAsync(_command); - - Exception ex = await Assert.ThrowsAsync(() => _commandProcessor.SendAsync(_command)); - - Assert.Equal($"A command with id {_command.Id} has already been handled", ex.Message); + var ex = await Assert.That(() => _commandProcessor.SendAsync(_command)).ThrowsExactly(); + await Assert.That(ex!.Message).IsEqualTo($"A command with id {_command.Id} has already been handled"); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Warn_Enabled.cs b/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Warn_Enabled.cs index fabb69a042..f779745891 100644 --- a/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Warn_Enabled.cs +++ b/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Warn_Enabled.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.OnceOnly.TestDoubles; @@ -29,7 +27,6 @@ THE SOFTWARE. */ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; using Paramore.Brighter.Inbox.Handlers; namespace Paramore.Brighter.Core.Tests.OnceOnly @@ -39,35 +36,30 @@ public class OnceOnlyAttributeWithWarnExceptionTests private readonly MyCommand _command; private readonly IAmAnInboxSync _inbox; private readonly IAmACommandProcessor _commandProcessor; - public OnceOnlyAttributeWithWarnExceptionTests() { _inbox = new InMemoryInbox(new FakeTimeProvider()); - var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddSingleton(_inbox); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _command = new MyCommand {Value = "My Test String"}; - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); + _command = new MyCommand + { + Value = "My Test String" + }; + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void When_Handling_A_Command_Once_Only_With_Warn_Enabled() + [Test] + public async Task When_Handling_A_Command_Once_Only_With_Warn_Enabled() { - _commandProcessor.Send(_command); _commandProcessor.Send(_command); - - Assert.Equal(1, MyStoredCommandToWarnHandler.ReceivedCount); + _commandProcessor.Send(_command); + await Assert.That(MyStoredCommandToWarnHandler.ReceivedCount).IsEqualTo(1); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Warn_Enabled_Async.cs b/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Warn_Enabled_Async.cs index c1dedfe6a7..979f1f34e1 100644 --- a/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Warn_Enabled_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_Once_Only_With_Warn_Enabled_Async.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; @@ -30,7 +28,6 @@ THE SOFTWARE. */ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; using Paramore.Brighter.Inbox.Handlers; namespace Paramore.Brighter.Core.Tests.OnceOnly @@ -39,35 +36,30 @@ public class OnceOnlyAttributeWithWarnExceptionAsyncTests { private readonly MyCommand _command; private readonly IAmACommandProcessor _commandProcessor; - public OnceOnlyAttributeWithWarnExceptionAsyncTests() { IAmAnInboxAsync inbox = new InMemoryInbox(new FakeTimeProvider()); - var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddSingleton(inbox); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _command = new MyCommand {Value = "My Test String"}; - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); + _command = new MyCommand + { + Value = "My Test String" + }; + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task When_Handling_A_Command_Once_Only_With_Warn_Enabled() { await _commandProcessor.SendAsync(_command); await _commandProcessor.SendAsync(_command); - - Assert.Equal(1, MyStoredCommandToWarnHandlerAsync.ReceivedCount); + await Assert.That(MyStoredCommandToWarnHandlerAsync.ReceivedCount).IsEqualTo(1); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_With_A_Inbox_Enabled.cs b/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_With_A_Inbox_Enabled.cs index b3b7d60b8f..d905d33f5b 100644 --- a/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_With_A_Inbox_Enabled.cs +++ b/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_With_A_Inbox_Enabled.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2015 Ian Cooper +Copyright 2015 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,16 +12,14 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.OnceOnly.TestDoubles; @@ -29,7 +27,6 @@ THE SOFTWARE. */ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; using Paramore.Brighter.Inbox.Handlers; namespace Paramore.Brighter.Core.Tests.OnceOnly @@ -40,50 +37,42 @@ public class CommandProcessorUsingInboxTests private readonly IAmAnInboxSync _inbox; private readonly IAmACommandProcessor _commandProcessor; private readonly string _contextKey; - public CommandProcessorUsingInboxTests() { _inbox = new InMemoryInbox(new FakeTimeProvider()); - var registry = new SubscriberRegistry(); registry.Register(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient(); container.AddSingleton(_inbox); container.AddTransient>(); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _command = new MyCommand {Value = "My Test String"}; - + _command = new MyCommand + { + Value = "My Test String" + }; _contextKey = typeof(MyStoredCommandHandler).FullName; - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); - + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void When_Handling_A_Command_With_A_Inbox_Enabled() + [Test] + public async Task When_Handling_A_Command_With_A_Inbox_Enabled() { _commandProcessor.Send(_command); - //should_store_the_command_to_the_inbox - Assert.Equal(_command.Value, _inbox.Get(_command.Id, _contextKey, null).Value); + await Assert.That(_inbox.Get(_command.Id, _contextKey, null).Value).IsEqualTo(_command.Value); } - [Fact] - public void Command_Is_Not_Stored_If_The_Handler_Is_Not_Successful() + [Test] + public async Task Command_Is_Not_Stored_If_The_Handler_Is_Not_Successful() { string id = Guid.NewGuid().ToString(); - - Assert.Throws(() => _commandProcessor.Send(new MyCommandToFail { Id = id})); - - Assert.False(_inbox.Exists(id, typeof(MyStoredCommandToFailHandler).FullName, null)); + await Assert.That(() => _commandProcessor.Send(new MyCommandToFail { Id = id })).ThrowsExactly(); + await Assert.That(_inbox.Exists(id, typeof(MyStoredCommandToFailHandler).FullName, null)).IsFalse(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_With_A_Inbox_Enabled_Async.cs b/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_With_A_Inbox_Enabled_Async.cs index b016d86f0a..6856dfdc2f 100644 --- a/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_With_A_Inbox_Enabled_Async.cs +++ b/tests/Paramore.Brighter.Core.Tests/OnceOnly/When_Handling_A_Command_With_A_Inbox_Enabled_Async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.OnceOnly.TestDoubles; @@ -7,7 +7,6 @@ using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Core.Tests.TestHelpers; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; using Paramore.Brighter.Inbox.Handlers; namespace Paramore.Brighter.Core.Tests.OnceOnly @@ -18,48 +17,41 @@ public class CommandProcessorUsingInboxAsyncTests private readonly IAmAnInboxAsync _inbox; private readonly IAmACommandProcessor _commandProcessor; private readonly string _contextKey; - public CommandProcessorUsingInboxAsyncTests() { _inbox = new InMemoryInbox(new FakeTimeProvider()); - var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient(); container.AddSingleton(_inbox); container.AddTransient>(); - container.AddSingleton(new BrighterOptions {HandlerLifetime = ServiceLifetime.Transient}); - + container.AddSingleton(new BrighterOptions { HandlerLifetime = ServiceLifetime.Transient }); var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - _contextKey = typeof(MyStoredCommandHandlerAsync).FullName; - - _command = new MyCommand {Value = "My Test String"}; - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); + _command = new MyCommand + { + Value = "My Test String" + }; + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task When_Handling_A_Command_With_A_Inbox_Enabled_Async() { await _commandProcessor.SendAsync(_command); - - // should_store_the_command_to_the_inbox - Assert.Equal(_command.Value, (await _inbox.GetAsync(_command.Id, _contextKey, null)).Value); + // should_store_the_command_to_the_inbox + await Assert.That((await _inbox.GetAsync(_command.Id, _contextKey, null)).Value).IsEqualTo(_command.Value); } - [Fact] + [Test] public async Task Command_Is_Not_Stored_If_The_Handler_Is_Not_Successful() { string id = Guid.NewGuid().ToString(); - await Catch.ExceptionAsync(async () =>await _commandProcessor.SendAsync(new MyCommandToFail { Id = id })); - + await Catch.ExceptionAsync(async () => await _commandProcessor.SendAsync(new MyCommandToFail { Id = id })); var exists = await _inbox.ExistsAsync(id, typeof(MyStoredCommandToFailHandlerAsync).FullName, null); - Assert.False(exists); + await Assert.That(exists).IsFalse(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Paramore.Brighter.Core.Tests.csproj b/tests/Paramore.Brighter.Core.Tests/Paramore.Brighter.Core.Tests.csproj index bbf12b7f64..9bfc590808 100644 --- a/tests/Paramore.Brighter.Core.Tests/Paramore.Brighter.Core.Tests.csproj +++ b/tests/Paramore.Brighter.Core.Tests/Paramore.Brighter.Core.Tests.csproj @@ -2,6 +2,7 @@ false $(BrighterTestTargetFrameworks) + Exe @@ -12,37 +13,14 @@ - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - Always - - - - - + diff --git a/tests/Paramore.Brighter.Core.Tests/Reject/When_async_handler_succeeds_should_not_reject_message.cs b/tests/Paramore.Brighter.Core.Tests/Reject/When_async_handler_succeeds_should_not_reject_message.cs index 56d3e9ba3b..549c31b6a4 100644 --- a/tests/Paramore.Brighter.Core.Tests/Reject/When_async_handler_succeeds_should_not_reject_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/Reject/When_async_handler_succeeds_should_not_reject_message.cs @@ -19,16 +19,13 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.Reject.TestDoubles; using Paramore.Brighter.Reject.Handlers; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Reject { @@ -36,13 +33,11 @@ public class When_async_handler_succeeds_should_not_reject_message { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _command = new(); - public When_async_handler_succeeds_should_not_reject_message() { //Arrange var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var handlerFactory = new SimpleHandlerFactoryAsync(type => { if (type == typeof(MySucceedingRejectHandlerAsync)) @@ -51,28 +46,21 @@ public When_async_handler_succeeds_should_not_reject_message() return new RejectMessageOnErrorHandlerAsync(); throw new ArgumentOutOfRangeException(nameof(type), type.Name, null); }); - MySucceedingRejectHandlerAsync.HandlerCalled = false; - - _commandProcessor = new CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory() - ); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task It_should_complete_without_throwing() { //Act - var exception = await Record.ExceptionAsync(() => _commandProcessor.SendAsync(_command)); + Exception? exception = null; + try { await _commandProcessor.SendAsync(_command); } + catch (Exception e) { exception = e; } //Assert - Assert.Null(exception); // No exception thrown - Assert.True(MySucceedingRejectHandlerAsync.HandlerCalled); // Handler was invoked + await Assert.That(exception).IsNull(); // No exception thrown + await Assert.That(MySucceedingRejectHandlerAsync.HandlerCalled).IsTrue(); // Handler was invoked } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Reject/When_async_handler_throws_exception_should_reject_message.cs b/tests/Paramore.Brighter.Core.Tests/Reject/When_async_handler_throws_exception_should_reject_message.cs index 2a23497405..a4da686bef 100644 --- a/tests/Paramore.Brighter.Core.Tests/Reject/When_async_handler_throws_exception_should_reject_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/Reject/When_async_handler_throws_exception_should_reject_message.cs @@ -19,9 +19,7 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Threading.Tasks; using Paramore.Brighter.Actions; @@ -29,7 +27,6 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.Reject.TestDoubles; using Paramore.Brighter.Reject.Handlers; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Reject { @@ -37,13 +34,11 @@ public class When_async_handler_throws_exception_should_reject_message { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _command = new(); - public When_async_handler_throws_exception_should_reject_message() { //Arrange var registry = new SubscriberRegistry(); registry.RegisterAsync(); - var handlerFactory = new SimpleHandlerFactoryAsync(type => { if (type == typeof(MyFailingRejectHandlerAsync)) @@ -52,30 +47,20 @@ public When_async_handler_throws_exception_should_reject_message() return new RejectMessageOnErrorHandlerAsync(); throw new ArgumentOutOfRangeException(nameof(type), type.Name, null); }); - MyFailingRejectHandlerAsync.HandlerCalled = false; - - _commandProcessor = new CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory() - ); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] + [Test] public async Task It_should_throw_RejectMessageAction_with_original_exception() { //Act - var exception = await Assert.ThrowsAsync(() => _commandProcessor.SendAsync(_command)); - + var exception = await Assert.That(() => _commandProcessor.SendAsync(_command)).ThrowsExactly(); //Assert - Assert.True(MyFailingRejectHandlerAsync.HandlerCalled); // Handler was invoked - Assert.Equal(MyFailingRejectHandlerAsync.EXCEPTION_MESSAGE, exception.Message); // Preserves original message - Assert.IsType(exception.InnerException); // Preserves original exception type - Assert.Equal(MyFailingRejectHandlerAsync.EXCEPTION_MESSAGE, exception.InnerException.Message); // Inner has same message + await Assert.That(MyFailingRejectHandlerAsync.HandlerCalled).IsTrue(); // Handler was invoked + await Assert.That(exception.Message).IsEqualTo(MyFailingRejectHandlerAsync.EXCEPTION_MESSAGE); // Preserves original message + await Assert.That(exception.InnerException).IsTypeOf(); // Preserves original exception type + await Assert.That(exception.InnerException.Message).IsEqualTo(MyFailingRejectHandlerAsync.EXCEPTION_MESSAGE); // Inner has same message } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Reject/When_getting_handler_type_from_reject_message_on_error_async_attribute.cs b/tests/Paramore.Brighter.Core.Tests/Reject/When_getting_handler_type_from_reject_message_on_error_async_attribute.cs index b237826c17..df90df2b27 100644 --- a/tests/Paramore.Brighter.Core.Tests/Reject/When_getting_handler_type_from_reject_message_on_error_async_attribute.cs +++ b/tests/Paramore.Brighter.Core.Tests/Reject/When_getting_handler_type_from_reject_message_on_error_async_attribute.cs @@ -19,30 +19,25 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using Paramore.Brighter.Reject.Attributes; using Paramore.Brighter.Reject.Handlers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Reject { public class When_getting_handler_type_from_reject_message_on_error_async_attribute { - [Fact] - public void It_should_return_correct_handler_configuration() + [Test] + public async Task It_should_return_correct_handler_configuration() { //Arrange var attribute = new RejectMessageOnErrorAsyncAttribute(step: 1); - //Act var handlerType = attribute.GetHandlerType(); - //Assert - Assert.Equal(typeof(RejectMessageOnErrorHandlerAsync<>), handlerType); // Returns the correct async handler type - Assert.Equal(HandlerTiming.Before, attribute.Timing); // Must wrap subsequent handlers - Assert.Equal(1, attribute.Step); // Preserves the specified step + await Assert.That(handlerType).IsEqualTo(typeof(RejectMessageOnErrorHandlerAsync<>)); // Returns the correct async handler type + await Assert.That(attribute.Timing).IsEqualTo(HandlerTiming.Before); // Must wrap subsequent handlers + await Assert.That(attribute.Step).IsEqualTo(1); // Preserves the specified step } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Reject/When_getting_handler_type_from_reject_message_on_error_attribute.cs b/tests/Paramore.Brighter.Core.Tests/Reject/When_getting_handler_type_from_reject_message_on_error_attribute.cs index 487e6a5ebd..ca6298b4ba 100644 --- a/tests/Paramore.Brighter.Core.Tests/Reject/When_getting_handler_type_from_reject_message_on_error_attribute.cs +++ b/tests/Paramore.Brighter.Core.Tests/Reject/When_getting_handler_type_from_reject_message_on_error_attribute.cs @@ -19,30 +19,25 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using Paramore.Brighter.Reject.Attributes; using Paramore.Brighter.Reject.Handlers; -using Xunit; namespace Paramore.Brighter.Core.Tests.Reject { public class When_getting_handler_type_from_reject_message_on_error_attribute { - [Fact] - public void It_should_return_correct_handler_configuration() + [Test] + public async Task It_should_return_correct_handler_configuration() { //Arrange var attribute = new RejectMessageOnErrorAttribute(step: 1); - //Act var handlerType = attribute.GetHandlerType(); - //Assert - Assert.Equal(typeof(RejectMessageOnErrorHandler<>), handlerType); // Returns the correct handler type - Assert.Equal(HandlerTiming.Before, attribute.Timing); // Must wrap subsequent handlers - Assert.Equal(1, attribute.Step); // Preserves the specified step + await Assert.That(handlerType).IsEqualTo(typeof(RejectMessageOnErrorHandler<>)); // Returns the correct handler type + await Assert.That(attribute.Timing).IsEqualTo(HandlerTiming.Before); // Must wrap subsequent handlers + await Assert.That(attribute.Step).IsEqualTo(1); // Preserves the specified step } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Reject/When_handler_succeeds_should_not_reject_message.cs b/tests/Paramore.Brighter.Core.Tests/Reject/When_handler_succeeds_should_not_reject_message.cs index b464ba84fe..0b2d88aa1e 100644 --- a/tests/Paramore.Brighter.Core.Tests/Reject/When_handler_succeeds_should_not_reject_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/Reject/When_handler_succeeds_should_not_reject_message.cs @@ -19,15 +19,12 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.Reject.TestDoubles; using Paramore.Brighter.Reject.Handlers; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Reject { @@ -35,13 +32,11 @@ public class When_handler_succeeds_should_not_reject_message { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _command = new(); - public When_handler_succeeds_should_not_reject_message() { //Arrange var registry = new SubscriberRegistry(); registry.Register(); - var handlerFactory = new SimpleHandlerFactorySync(type => { if (type == typeof(MySucceedingRejectHandler)) @@ -50,28 +45,21 @@ public When_handler_succeeds_should_not_reject_message() return new RejectMessageOnErrorHandler(); throw new ArgumentOutOfRangeException(nameof(type), type.Name, null); }); - MySucceedingRejectHandler.HandlerCalled = false; - - _commandProcessor = new CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory() - ); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void It_should_complete_without_throwing() + [Test] + public async Task It_should_complete_without_throwing() { //Act - var exception = Record.Exception(() => _commandProcessor.Send(_command)); + Exception? exception = null; + try { _commandProcessor.Send(_command); } + catch (Exception e) { exception = e; } //Assert - Assert.Null(exception); // No exception thrown - Assert.True(MySucceedingRejectHandler.HandlerCalled); // Handler was invoked + await Assert.That(exception).IsNull(); // No exception thrown + await Assert.That(MySucceedingRejectHandler.HandlerCalled).IsTrue(); // Handler was invoked } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Reject/When_handler_throws_exception_should_reject_message.cs b/tests/Paramore.Brighter.Core.Tests/Reject/When_handler_throws_exception_should_reject_message.cs index cc2a7966b5..9102c7e6f7 100644 --- a/tests/Paramore.Brighter.Core.Tests/Reject/When_handler_throws_exception_should_reject_message.cs +++ b/tests/Paramore.Brighter.Core.Tests/Reject/When_handler_throws_exception_should_reject_message.cs @@ -19,16 +19,13 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Paramore.Brighter.Actions; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.Reject.TestDoubles; using Paramore.Brighter.Reject.Handlers; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Reject { @@ -36,13 +33,11 @@ public class When_handler_throws_exception_should_reject_message { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _command = new(); - public When_handler_throws_exception_should_reject_message() { //Arrange var registry = new SubscriberRegistry(); registry.Register(); - var handlerFactory = new SimpleHandlerFactorySync(type => { if (type == typeof(MyFailingRejectHandler)) @@ -51,30 +46,20 @@ public When_handler_throws_exception_should_reject_message() return new RejectMessageOnErrorHandler(); throw new ArgumentOutOfRangeException(nameof(type), type.Name, null); }); - MyFailingRejectHandler.HandlerCalled = false; - - _commandProcessor = new CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory() - ); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void It_should_throw_RejectMessageAction_with_original_exception() + [Test] + public async Task It_should_throw_RejectMessageAction_with_original_exception() { //Act - var exception = Assert.Throws(() => _commandProcessor.Send(_command)); - + var exception = await Assert.That(() => _commandProcessor.Send(_command)).ThrowsExactly(); //Assert - Assert.True(MyFailingRejectHandler.HandlerCalled); // Handler was invoked - Assert.Equal(MyFailingRejectHandler.EXCEPTION_MESSAGE, exception.Message); // Preserves original message - Assert.IsType(exception.InnerException); // Preserves original exception type - Assert.Equal(MyFailingRejectHandler.EXCEPTION_MESSAGE, exception.InnerException.Message); // Inner has same message + await Assert.That(MyFailingRejectHandler.HandlerCalled).IsTrue(); // Handler was invoked + await Assert.That(exception.Message).IsEqualTo(MyFailingRejectHandler.EXCEPTION_MESSAGE); // Preserves original message + await Assert.That(exception.InnerException).IsTypeOf(); // Preserves original exception type + await Assert.That(exception.InnerException.Message).IsEqualTo(MyFailingRejectHandler.EXCEPTION_MESSAGE); // Inner has same message } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Reject/When_reject_handler_at_step_zero_catches_inner_exceptions.cs b/tests/Paramore.Brighter.Core.Tests/Reject/When_reject_handler_at_step_zero_catches_inner_exceptions.cs index f3b76bcc16..8723f33251 100644 --- a/tests/Paramore.Brighter.Core.Tests/Reject/When_reject_handler_at_step_zero_catches_inner_exceptions.cs +++ b/tests/Paramore.Brighter.Core.Tests/Reject/When_reject_handler_at_step_zero_catches_inner_exceptions.cs @@ -19,9 +19,7 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Paramore.Brighter.Actions; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; @@ -29,7 +27,6 @@ THE SOFTWARE. */ using Paramore.Brighter.Logging.Handlers; using Paramore.Brighter.Reject.Handlers; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.Core.Tests.Reject { @@ -41,13 +38,11 @@ public class When_reject_handler_at_step_zero_catches_inner_exceptions { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _command = new(); - public When_reject_handler_at_step_zero_catches_inner_exceptions() { //Arrange var registry = new SubscriberRegistry(); registry.Register(); - var handlerFactory = new SimpleHandlerFactorySync(type => { if (type == typeof(MyMultiStepFailingHandler)) @@ -58,29 +53,19 @@ public When_reject_handler_at_step_zero_catches_inner_exceptions() return new RequestLoggingHandler(); throw new ArgumentOutOfRangeException(nameof(type), type.Name, null); }); - MyMultiStepFailingHandler.HandlerCalled = false; - - _commandProcessor = new CommandProcessor( - registry, - handlerFactory, - new InMemoryRequestContextFactory(), - new PolicyRegistry(), - new ResiliencePipelineRegistry(), - new InMemorySchedulerFactory() - ); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } - [Fact] - public void It_should_catch_exception_at_outermost_handler() + [Test] + public async Task It_should_catch_exception_at_outermost_handler() { //Act - var exception = Assert.Throws(() => _commandProcessor.Send(_command)); - + var exception = await Assert.That(() => _commandProcessor.Send(_command)).ThrowsExactly(); //Assert - Assert.True(MyMultiStepFailingHandler.HandlerCalled); // Handler was invoked through the pipeline - Assert.Equal(MyMultiStepFailingHandler.EXCEPTION_MESSAGE, exception.Message); // Caught the inner exception - Assert.IsType(exception.InnerException); // Preserves original exception type + await Assert.That(MyMultiStepFailingHandler.HandlerCalled).IsTrue(); // Handler was invoked through the pipeline + await Assert.That(exception.Message).IsEqualTo(MyMultiStepFailingHandler.EXCEPTION_MESSAGE); // Caught the inner exception + await Assert.That(exception.InnerException).IsTypeOf(); // Preserves original exception type } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Specifications/TestDoubles/SpecificationTestState.cs b/tests/Paramore.Brighter.Core.Tests/Specifications/TestDoubles/SpecificationTestState.cs index a5a28a515d..fdd49c66b6 100644 --- a/tests/Paramore.Brighter.Core.Tests/Specifications/TestDoubles/SpecificationTestState.cs +++ b/tests/Paramore.Brighter.Core.Tests/Specifications/TestDoubles/SpecificationTestState.cs @@ -2,7 +2,7 @@ namespace Paramore.Brighter.Core.Tests.Specifications.TestDoubles; -public enum TestState +public enum SpecificationState { Done, Ready, @@ -12,6 +12,6 @@ public enum TestState public class SpecificationTestState { - public TestState State { get; set; } + public SpecificationState State { get; set; } public Dictionary Bag { get; set; } } diff --git a/tests/Paramore.Brighter.Core.Tests/Specifications/When_and_specification_left_fails_should_evaluate_both_sides.cs b/tests/Paramore.Brighter.Core.Tests/Specifications/When_and_specification_left_fails_should_evaluate_both_sides.cs index 9772fb239d..9fdadc99f0 100644 --- a/tests/Paramore.Brighter.Core.Tests/Specifications/When_and_specification_left_fails_should_evaluate_both_sides.cs +++ b/tests/Paramore.Brighter.Core.Tests/Specifications/When_and_specification_left_fails_should_evaluate_both_sides.cs @@ -19,86 +19,61 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; -using Xunit; namespace Paramore.Brighter.Core.Tests.Specifications; - public class AndSpecificationTests { - [Fact] - public void When_both_sides_fail_should_collect_errors_from_both() + [Test] + public async Task When_both_sides_fail_should_collect_errors_from_both() { // Arrange — two simple rules that both fail for short strings - var left = new Specification( - s => s.Length > 5, - s => new ValidationError(ValidationSeverity.Error, "Left", "too short")); - var right = new Specification( - s => s.StartsWith("X"), - s => new ValidationError(ValidationSeverity.Error, "Right", "wrong prefix")); - + var left = new Specification(s => s.Length > 5, s => new ValidationError(ValidationSeverity.Error, "Left", "too short")); + var right = new Specification(s => s.StartsWith("X"), s => new ValidationError(ValidationSeverity.Error, "Right", "wrong prefix")); var combined = left.And(right); var collector = new ValidationResultCollector(); - // Act var satisfied = combined.IsSatisfiedBy("abc"); var results = combined.Accept(collector).ToList(); - // Assert — both sides evaluated, both errors collected - Assert.False(satisfied); - Assert.Equal(2, results.Count(r => !r.Success)); - Assert.Contains(results, r => r.Error?.Source == "Left"); - Assert.Contains(results, r => r.Error?.Source == "Right"); + await Assert.That(satisfied).IsFalse(); + await Assert.That(results.Count(r => !r.Success)).IsEqualTo(2); + await Assert.That(results).Contains(r => r.Error?.Source == "Left"); + await Assert.That(results).Contains(r => r.Error?.Source == "Right"); } - [Fact] - public void When_left_fails_right_passes_should_collect_only_left_error() + [Test] + public async Task When_left_fails_right_passes_should_collect_only_left_error() { // Arrange - var left = new Specification( - s => s.Length > 5, - s => new ValidationError(ValidationSeverity.Error, "Left", "too short")); - var right = new Specification( - s => s.StartsWith("a"), - s => new ValidationError(ValidationSeverity.Error, "Right", "wrong prefix")); - + var left = new Specification(s => s.Length > 5, s => new ValidationError(ValidationSeverity.Error, "Left", "too short")); + var right = new Specification(s => s.StartsWith("a"), s => new ValidationError(ValidationSeverity.Error, "Right", "wrong prefix")); var combined = left.And(right); var collector = new ValidationResultCollector(); - // Act — "abc" fails left (length <= 5) but passes right (starts with 'a') var satisfied = combined.IsSatisfiedBy("abc"); var results = combined.Accept(collector).ToList(); - // Assert - Assert.False(satisfied); + await Assert.That(satisfied).IsFalse(); var failures = results.Where(r => !r.Success).ToList(); - Assert.Single(failures); - Assert.Equal("Left", failures[0].Error!.Source); + await Assert.That(failures).HasSingleItem(); + await Assert.That(failures[0].Error!.Source).IsEqualTo("Left"); } - [Fact] - public void When_both_sides_pass_should_return_true() + [Test] + public async Task When_both_sides_pass_should_return_true() { // Arrange - var left = new Specification( - s => s.Length > 2, - s => new ValidationError(ValidationSeverity.Error, "Left", "too short")); - var right = new Specification( - s => s.StartsWith("h"), - s => new ValidationError(ValidationSeverity.Error, "Right", "wrong prefix")); - + var left = new Specification(s => s.Length > 2, s => new ValidationError(ValidationSeverity.Error, "Left", "too short")); + var right = new Specification(s => s.StartsWith("h"), s => new ValidationError(ValidationSeverity.Error, "Right", "wrong prefix")); var combined = left.And(right); var collector = new ValidationResultCollector(); - // Act var satisfied = combined.IsSatisfiedBy("hello"); var results = combined.Accept(collector).ToList(); - // Assert - Assert.True(satisfied); - Assert.Empty(results); + await Assert.That(satisfied).IsTrue(); + await Assert.That(results).IsEmpty(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Specifications/When_collector_visits_specification_graph_should_collect_all_failures.cs b/tests/Paramore.Brighter.Core.Tests/Specifications/When_collector_visits_specification_graph_should_collect_all_failures.cs index 8ce8b86362..39d5cb2ace 100644 --- a/tests/Paramore.Brighter.Core.Tests/Specifications/When_collector_visits_specification_graph_should_collect_all_failures.cs +++ b/tests/Paramore.Brighter.Core.Tests/Specifications/When_collector_visits_specification_graph_should_collect_all_failures.cs @@ -19,119 +19,90 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; -using Xunit; namespace Paramore.Brighter.Core.Tests.Specifications; - public class ValidationResultCollectorGraphTests { - [Fact] - public void When_ValidationResult_Ok_should_have_success_true_and_no_error() + [Test] + public async Task When_ValidationResult_Ok_should_have_success_true_and_no_error() { // Act var result = ValidationResult.Ok(); - // Assert - Assert.True(result.Success); - Assert.Null(result.Error); + await Assert.That(result.Success).IsTrue(); + await Assert.That(result.Error).IsNull(); } - [Fact] - public void When_ValidationResult_Fail_should_carry_the_error() + [Test] + public async Task When_ValidationResult_Fail_should_carry_the_error() { // Arrange var error = new ValidationError(ValidationSeverity.Warning, "MySource", "something wrong"); - // Act var result = ValidationResult.Fail(error); - // Assert - Assert.False(result.Success); - Assert.NotNull(result.Error); - Assert.Equal(ValidationSeverity.Warning, result.Error.Severity); - Assert.Equal("MySource", result.Error.Source); - Assert.Equal("something wrong", result.Error.Message); + await Assert.That(result.Success).IsFalse(); + await Assert.That(result.Error).IsNotNull(); + await Assert.That(result.Error.Severity).IsEqualTo(ValidationSeverity.Warning); + await Assert.That(result.Error.Source).IsEqualTo("MySource"); + await Assert.That(result.Error.Message).IsEqualTo("something wrong"); } - [Fact] - public void When_collector_visits_or_specification_graph_should_collect_from_both_children() + [Test] + public async Task When_collector_visits_or_specification_graph_should_collect_from_both_children() { // Arrange — Or: both children fail, collector should collect from both - var left = new Specification( - n => n > 100, - n => new ValidationError(ValidationSeverity.Error, "Left", "too small")); - var right = new Specification( - n => n < 0, - n => new ValidationError(ValidationSeverity.Error, "Right", "not negative")); - + var left = new Specification(n => n > 100, n => new ValidationError(ValidationSeverity.Error, "Left", "too small")); + var right = new Specification(n => n < 0, n => new ValidationError(ValidationSeverity.Error, "Right", "not negative")); var combined = left.Or(right); var collector = new ValidationResultCollector(); - // Act — 5 fails both (not > 100, not < 0) var satisfied = combined.IsSatisfiedBy(5); var results = combined.Accept(collector).ToList(); - // Assert - Assert.False(satisfied); + await Assert.That(satisfied).IsFalse(); var failures = results.Where(r => !r.Success).ToList(); - Assert.Equal(2, failures.Count); - Assert.Contains(failures, r => r.Error?.Source == "Left"); - Assert.Contains(failures, r => r.Error?.Source == "Right"); + await Assert.That(failures.Count).IsEqualTo(2); + await Assert.That(failures).Contains(r => r.Error?.Source == "Left"); + await Assert.That(failures).Contains(r => r.Error?.Source == "Right"); } - [Fact] - public void When_collector_visits_not_specification_with_error_should_collect_negation_error() + [Test] + public async Task When_collector_visits_not_specification_with_error_should_collect_negation_error() { // Arrange — Not with error factory: inner passes, so Not fails - var inner = new Specification( - s => s.Length > 2, - s => new ValidationError(ValidationSeverity.Error, "Inner", "too short")); - - var negated = inner.Not( - s => new ValidationError(ValidationSeverity.Error, "Negation", "should be short but was long")); + var inner = new Specification(s => s.Length > 2, s => new ValidationError(ValidationSeverity.Error, "Inner", "too short")); + var negated = inner.Not(s => new ValidationError(ValidationSeverity.Error, "Negation", "should be short but was long")); var collector = new ValidationResultCollector(); - // Act — "hello" satisfies inner (length > 2), so Not fails var satisfied = negated.IsSatisfiedBy("hello"); var results = negated.Accept(collector).ToList(); - // Assert - Assert.False(satisfied); - Assert.Single(results); - Assert.Equal("Negation", results[0].Error!.Source); + await Assert.That(satisfied).IsFalse(); + await Assert.That(results).HasSingleItem(); + await Assert.That(results[0].Error!.Source).IsEqualTo("Negation"); } - [Fact] - public void When_collector_visits_nested_and_or_graph_should_collect_all_leaf_failures() + [Test] + public async Task When_collector_visits_nested_and_or_graph_should_collect_all_leaf_failures() { // Arrange — (A AND B) OR C, where A and C fail, B passes - var specA = new Specification( - n => n > 10, - n => new ValidationError(ValidationSeverity.Error, "A", "not > 10")); - var specB = new Specification( - n => n > 0, - n => new ValidationError(ValidationSeverity.Error, "B", "not > 0")); - var specC = new Specification( - n => n < 0, - n => new ValidationError(ValidationSeverity.Error, "C", "not < 0")); - + var specA = new Specification(n => n > 10, n => new ValidationError(ValidationSeverity.Error, "A", "not > 10")); + var specB = new Specification(n => n > 0, n => new ValidationError(ValidationSeverity.Error, "B", "not > 0")); + var specC = new Specification(n => n < 0, n => new ValidationError(ValidationSeverity.Error, "C", "not < 0")); // (A AND B) OR C var combined = specA.And(specB).Or(specC); var collector = new ValidationResultCollector(); - // Act — 5: A fails (not > 10), B passes (> 0), C fails (not < 0) var satisfied = combined.IsSatisfiedBy(5); var results = combined.Accept(collector).ToList(); - // Assert — collector traverses full tree, finds A and C failures - Assert.False(satisfied); + await Assert.That(satisfied).IsFalse(); var failures = results.Where(r => !r.Success).ToList(); - Assert.Equal(2, failures.Count); - Assert.Contains(failures, r => r.Error?.Source == "A"); - Assert.Contains(failures, r => r.Error?.Source == "C"); + await Assert.That(failures.Count).IsEqualTo(2); + await Assert.That(failures).Contains(r => r.Error?.Source == "A"); + await Assert.That(failures).Contains(r => r.Error?.Source == "C"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Specifications/When_evaluating_a_specification.cs b/tests/Paramore.Brighter.Core.Tests/Specifications/When_evaluating_a_specification.cs index c39ce8b5a8..105bb0eb27 100644 --- a/tests/Paramore.Brighter.Core.Tests/Specifications/When_evaluating_a_specification.cs +++ b/tests/Paramore.Brighter.Core.Tests/Specifications/When_evaluating_a_specification.cs @@ -1,74 +1,64 @@ -using Paramore.Brighter.Core.Tests.Specifications.TestDoubles; -using Xunit; +using Paramore.Brighter.Core.Tests.Specifications.TestDoubles; namespace Paramore.Brighter.Core.Tests.Specifications; - public class SpecificationTests { - [Fact] - public void When_evaluating_a_specificaion() + [Test] + public async Task When_evaluating_a_specificaion() { - var specification = new Specification(state => state.State == TestState.Done); - Assert.True(specification.IsSatisfiedBy(new SpecificationTestState { State = TestState.Done })); - Assert.False(specification.IsSatisfiedBy(new SpecificationTestState { State = TestState.Ready })); + var specification = new Specification(state => state.State == SpecificationState.Done); + await Assert.That(specification.IsSatisfiedBy(new SpecificationTestState { State = SpecificationState.Done })).IsTrue(); + await Assert.That(specification.IsSatisfiedBy(new SpecificationTestState { State = SpecificationState.Ready })).IsFalse(); } - [Fact] - public void When_combining_specifications_with_and() + [Test] + public async Task When_combining_specifications_with_and() { - var doneSpecification = new Specification(state => state.State == TestState.Done); - var runningSpecification = new Specification(state => state.State == TestState.Running); + var doneSpecification = new Specification(state => state.State == SpecificationState.Done); + var runningSpecification = new Specification(state => state.State == SpecificationState.Running); var combinedSpecification = doneSpecification.And(runningSpecification); - - Assert.False(combinedSpecification.IsSatisfiedBy(new SpecificationTestState { State = TestState.Done })); - Assert.False(combinedSpecification.IsSatisfiedBy(new SpecificationTestState { State = TestState.Running })); + await Assert.That(combinedSpecification.IsSatisfiedBy(new SpecificationTestState { State = SpecificationState.Done })).IsFalse(); + await Assert.That(combinedSpecification.IsSatisfiedBy(new SpecificationTestState { State = SpecificationState.Running })).IsFalse(); } - [Fact] - public void When_combining_specifications_with_or() + [Test] + public async Task When_combining_specifications_with_or() { - var doneSpecification = new Specification(state => state.State == TestState.Done); - var runningSpecification = new Specification(state => state.State == TestState.Running); + var doneSpecification = new Specification(state => state.State == SpecificationState.Done); + var runningSpecification = new Specification(state => state.State == SpecificationState.Running); var combinedSpecification = doneSpecification.Or(runningSpecification); - - Assert.True(combinedSpecification.IsSatisfiedBy(new SpecificationTestState { State = TestState.Done })); - Assert.True(combinedSpecification.IsSatisfiedBy(new SpecificationTestState { State = TestState.Running })); - Assert.False(combinedSpecification.IsSatisfiedBy(new SpecificationTestState { State = TestState.Ready })); + await Assert.That(combinedSpecification.IsSatisfiedBy(new SpecificationTestState { State = SpecificationState.Done })).IsTrue(); + await Assert.That(combinedSpecification.IsSatisfiedBy(new SpecificationTestState { State = SpecificationState.Running })).IsTrue(); + await Assert.That(combinedSpecification.IsSatisfiedBy(new SpecificationTestState { State = SpecificationState.Ready })).IsFalse(); } - [Fact] - public void When_negating_a_specification() + [Test] + public async Task When_negating_a_specification() { - var doneSpecification = new Specification(state => state.State == TestState.Done); + var doneSpecification = new Specification(state => state.State == SpecificationState.Done); var notDoneSpecification = doneSpecification.Not(); - - Assert.False(notDoneSpecification.IsSatisfiedBy(new SpecificationTestState { State = TestState.Done })); - Assert.True(notDoneSpecification.IsSatisfiedBy(new SpecificationTestState { State = TestState.Ready })); + await Assert.That(notDoneSpecification.IsSatisfiedBy(new SpecificationTestState { State = SpecificationState.Done })).IsFalse(); + await Assert.That(notDoneSpecification.IsSatisfiedBy(new SpecificationTestState { State = SpecificationState.Ready })).IsTrue(); } - [Fact] - public void When_combining_specifications_with_and_not() + [Test] + public async Task When_combining_specifications_with_and_not() { - var doneSpecification = new Specification(state => state.State == TestState.Done); - var runningSpecification = new Specification(state => state.State == TestState.Running); + var doneSpecification = new Specification(state => state.State == SpecificationState.Done); + var runningSpecification = new Specification(state => state.State == SpecificationState.Running); var combinedSpecification = doneSpecification.AndNot(runningSpecification); - - Assert.True(combinedSpecification.IsSatisfiedBy(new SpecificationTestState { State = TestState.Done })); - Assert.False(combinedSpecification.IsSatisfiedBy(new SpecificationTestState { State = TestState.Running })); + await Assert.That(combinedSpecification.IsSatisfiedBy(new SpecificationTestState { State = SpecificationState.Done })).IsTrue(); + await Assert.That(combinedSpecification.IsSatisfiedBy(new SpecificationTestState { State = SpecificationState.Running })).IsFalse(); } - [Fact] - public void When_combining_specifications_with_or_not() + [Test] + public async Task When_combining_specifications_with_or_not() { - var doneSpecification = new Specification(state => state.State == TestState.Done); - var runningSpecification = new Specification(state => state.State == TestState.Running); + var doneSpecification = new Specification(state => state.State == SpecificationState.Done); + var runningSpecification = new Specification(state => state.State == SpecificationState.Running); var combinedSpecification = doneSpecification.OrNot(runningSpecification); - - Assert.True(combinedSpecification.IsSatisfiedBy(new SpecificationTestState { State = TestState.Done })); - Assert.True(combinedSpecification.IsSatisfiedBy(new SpecificationTestState { State = TestState.Ready })); - Assert.False(combinedSpecification.IsSatisfiedBy(new SpecificationTestState { State = TestState.Running })); + await Assert.That(combinedSpecification.IsSatisfiedBy(new SpecificationTestState { State = SpecificationState.Done })).IsTrue(); + await Assert.That(combinedSpecification.IsSatisfiedBy(new SpecificationTestState { State = SpecificationState.Ready })).IsTrue(); + await Assert.That(combinedSpecification.IsSatisfiedBy(new SpecificationTestState { State = SpecificationState.Running })).IsFalse(); } -} - - - +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Specifications/When_specification_with_error_factory_fails_should_collect_error.cs b/tests/Paramore.Brighter.Core.Tests/Specifications/When_specification_with_error_factory_fails_should_collect_error.cs index 3d108b9ee3..c59ffba5b8 100644 --- a/tests/Paramore.Brighter.Core.Tests/Specifications/When_specification_with_error_factory_fails_should_collect_error.cs +++ b/tests/Paramore.Brighter.Core.Tests/Specifications/When_specification_with_error_factory_fails_should_collect_error.cs @@ -19,141 +19,113 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Collections.Generic; using System.Linq; -using Xunit; namespace Paramore.Brighter.Core.Tests.Specifications; - public class SpecificationValidationTests { - [Fact] - public void When_pure_predicate_fails_should_return_empty_results_from_visitor() + [Test] + public async Task When_pure_predicate_fails_should_return_empty_results_from_visitor() { // Arrange — pure predicate constructor, no validation metadata var spec = new Specification(s => s.Length > 5); var collector = new ValidationResultCollector(); - // Act var satisfied = spec.IsSatisfiedBy("abc"); var results = spec.Accept(collector).ToList(); - // Assert - Assert.False(satisfied); - Assert.Empty(results); + await Assert.That(satisfied).IsFalse(); + await Assert.That(results).IsEmpty(); } - [Fact] - public void When_simple_rule_fails_should_collect_validation_error() + [Test] + public async Task When_simple_rule_fails_should_collect_validation_error() { // Arrange — simple rule: predicate + error factory - var spec = new Specification( - s => s.Length > 5, - s => new ValidationError( - ValidationSeverity.Error, - "TestSource", - $"String '{s}' is too short")); + var spec = new Specification(s => s.Length > 5, s => new ValidationError(ValidationSeverity.Error, "TestSource", $"String '{s}' is too short")); var collector = new ValidationResultCollector(); - // Act var satisfied = spec.IsSatisfiedBy("abc"); var results = spec.Accept(collector).ToList(); - // Assert - Assert.False(satisfied); - Assert.Single(results); - Assert.False(results[0].Success); - Assert.Equal(ValidationSeverity.Error, results[0].Error!.Severity); - Assert.Equal("TestSource", results[0].Error!.Source); - Assert.Contains("abc", results[0].Error!.Message); + await Assert.That(satisfied).IsFalse(); + await Assert.That(results).HasSingleItem(); + await Assert.That(results[0].Success).IsFalse(); + await Assert.That(results[0].Error!.Severity).IsEqualTo(ValidationSeverity.Error); + await Assert.That(results[0].Error!.Source).IsEqualTo("TestSource"); + await Assert.That(results[0].Error!.Message).Contains("abc"); } - [Fact] - public void When_simple_rule_passes_should_return_empty_results() + [Test] + public async Task When_simple_rule_passes_should_return_empty_results() { // Arrange - var spec = new Specification( - s => s.Length > 2, - s => new ValidationError(ValidationSeverity.Error, "TestSource", "too short")); + var spec = new Specification(s => s.Length > 2, s => new ValidationError(ValidationSeverity.Error, "TestSource", "too short")); var collector = new ValidationResultCollector(); - // Act var satisfied = spec.IsSatisfiedBy("hello"); var results = spec.Accept(collector).ToList(); - // Assert - Assert.True(satisfied); - Assert.Empty(results); + await Assert.That(satisfied).IsTrue(); + await Assert.That(results).IsEmpty(); } - [Fact] - public void When_collapsed_rule_returns_failures_should_collect_all() + [Test] + public async Task When_collapsed_rule_returns_failures_should_collect_all() { // Arrange — collapsed rule: evaluator returns multiple results - var spec = new Specification(n => new List - { - ValidationResult.Fail(new ValidationError(ValidationSeverity.Error, "Item1", "first error")), - ValidationResult.Ok(), - ValidationResult.Fail(new ValidationError(ValidationSeverity.Warning, "Item3", "second error")) - }); + var spec = new Specification(n => new List { ValidationResult.Fail(new ValidationError(ValidationSeverity.Error, "Item1", "first error")), ValidationResult.Ok(), ValidationResult.Fail(new ValidationError(ValidationSeverity.Warning, "Item3", "second error")) }); var collector = new ValidationResultCollector(); - // Act var satisfied = spec.IsSatisfiedBy(42); var results = spec.Accept(collector).ToList(); - // Assert — IsSatisfiedBy returns false because not all results are successful - Assert.False(satisfied); - Assert.Equal(3, results.Count); - Assert.False(results[0].Success); - Assert.True(results[1].Success); - Assert.False(results[2].Success); - Assert.Equal(ValidationSeverity.Warning, results[2].Error!.Severity); + await Assert.That(satisfied).IsFalse(); + await Assert.That(results.Count).IsEqualTo(3); + await Assert.That(results[0].Success).IsFalse(); + await Assert.That(results[1].Success).IsTrue(); + await Assert.That(results[2].Success).IsFalse(); + await Assert.That(results[2].Error!.Severity).IsEqualTo(ValidationSeverity.Warning); } - [Fact] - public void When_predicate_throws_should_produce_error_severity_result() + [Test] + public async Task When_predicate_throws_should_produce_error_severity_result() { // Arrange — predicate that throws an exception - var spec = new Specification( - s => throw new InvalidOperationException("boom"), - s => new ValidationError(ValidationSeverity.Warning, "Test", "unused")); + var spec = new Specification(s => throw new InvalidOperationException("boom"), s => new ValidationError(ValidationSeverity.Warning, "Test", "unused")); var collector = new ValidationResultCollector(); - // Act var satisfied = spec.IsSatisfiedBy("test"); var results = spec.Accept(collector).ToList(); - // Assert — exception is caught, produces Error-severity result - Assert.False(satisfied); - Assert.Single(results); - Assert.False(results[0].Success); - Assert.Equal(ValidationSeverity.Error, results[0].Error!.Severity); - Assert.Contains("boom", results[0].Error!.Message); + await Assert.That(satisfied).IsFalse(); + await Assert.That(results).HasSingleItem(); + await Assert.That(results[0].Success).IsFalse(); + await Assert.That(results[0].Error!.Severity).IsEqualTo(ValidationSeverity.Error); + await Assert.That(results[0].Error!.Message).Contains("boom"); } - [Fact] - public void When_visitor_called_without_re_evaluating_should_return_cached_results() + [Test] + public async Task When_visitor_called_without_re_evaluating_should_return_cached_results() { // Arrange — track evaluation count via closure var evaluationCount = 0; - var spec = new Specification( - s => { evaluationCount++; return s.Length > 5; }, - s => new ValidationError(ValidationSeverity.Error, "Test", "too short")); + var spec = new Specification(s => + { + evaluationCount++; + return s.Length > 5; + }, s => new ValidationError(ValidationSeverity.Error, "Test", "too short")); var collector = new ValidationResultCollector(); - // Act — evaluate once, then visit twice spec.IsSatisfiedBy("abc"); var results1 = spec.Accept(collector).ToList(); var results2 = spec.Accept(collector).ToList(); - // Assert — predicate evaluated only once; visitor reads cached results - Assert.Equal(1, evaluationCount); - Assert.Single(results1); - Assert.Single(results2); + await Assert.That(evaluationCount).IsEqualTo(1); + await Assert.That(results1).HasSingleItem(); + await Assert.That(results2).HasSingleItem(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Tasks/BrighterSynchronizationContextsTests.cs b/tests/Paramore.Brighter.Core.Tests/Tasks/BrighterSynchronizationContextsTests.cs index 37222ee44b..387487f797 100644 --- a/tests/Paramore.Brighter.Core.Tests/Tasks/BrighterSynchronizationContextsTests.cs +++ b/tests/Paramore.Brighter.Core.Tests/Tasks/BrighterSynchronizationContextsTests.cs @@ -1,74 +1,73 @@ -#region Sources - +#region Sources // This class is based on Stephen Cleary's AyncContext, see OnMessagePublished; - public async Task PublishAsync(Action callBack) { await Task.Yield(); @@ -195,34 +186,30 @@ public async Task PublishAsync(Action callBack) public void Report(int value) { - Task.Run(() => OnMessagePublished?.Invoke(true, value)); + Task.Run(() => OnMessagePublished?.Invoke(true, value)); } } - - [Fact] - public void Current_WithoutAsyncContext_IsNull() + + [Test] + public async Task Current_WithoutAsyncContext_IsNull() { - Assert.Null(BrighterAsyncContext.Current); + await Assert.That(BrighterAsyncContext.Current).IsNull(); } - [Fact] - public void Current_FromBrighterSynchronizationHelper_IsBrighterSynchronizationHelper() + [Test] + public async Task Current_FromBrighterSynchronizationHelper_IsBrighterSynchronizationHelper() { BrighterAsyncContext observedHelper = null; var helper = new BrighterAsyncContext(); - - var task = helper.Factory.StartNew( - () => { observedHelper = BrighterAsyncContext.Current; }, - helper.Factory.CancellationToken, - helper.Factory.CreationOptions | TaskCreationOptions.DenyChildAttach, - helper.TaskScheduler); - + var task = helper.Factory.StartNew(() => + { + observedHelper = BrighterAsyncContext.Current; + }, helper.Factory.CancellationToken, helper.Factory.CreationOptions | TaskCreationOptions.DenyChildAttach, helper.TaskScheduler); helper.Execute(task); - - Assert.Equal(helper, observedHelper); + await Assert.That(observedHelper).IsEqualTo(helper); } - - [Fact] + + [Test] public async Task Run_AsyncTaskWithResult_ContainsMultipleAsyncTasks_Still_Ends2() { bool resumed = false; @@ -232,74 +219,66 @@ public async Task Run_AsyncTaskWithResult_ContainsMultipleAsyncTasks_Still_Ends2 resumed = true; return 17; })); - await Task.Delay(100); - - var result =await Task.WhenAll(newTask); - - Assert.True(resumed); - Assert.Equal(17, result[0]); + var result = await Task.WhenAll(newTask); + await Assert.That(resumed).IsTrue(); + await Assert.That(result[0]).IsEqualTo(17); } - [Fact] - public void SynchronizationContextCurrent_FromBrighterSynchronizationHelper_IsBrighterSynchronizationHelperSynchronizationContext() + [Test] + public async Task SynchronizationContextCurrent_FromBrighterSynchronizationHelper_IsBrighterSynchronizationHelperSynchronizationContext() { System.Threading.SynchronizationContext? observedContext = null; var context = new BrighterAsyncContext(); - - var task = context.Factory.StartNew( - () => { observedContext = System.Threading.SynchronizationContext.Current; }, - context.Factory.CancellationToken, - context.Factory.CreationOptions | TaskCreationOptions.DenyChildAttach, - context.TaskScheduler); - + var task = context.Factory.StartNew(() => + { + observedContext = System.Threading.SynchronizationContext.Current; + }, context.Factory.CancellationToken, context.Factory.CreationOptions | TaskCreationOptions.DenyChildAttach, context.TaskScheduler); context.Execute(task); - - Assert.Equal(context.SynchronizationContext, observedContext); + await Assert.That(observedContext).IsEqualTo(context.SynchronizationContext); } - [Fact] - public void TaskSchedulerCurrent_FromAsyncContext_IsThreadPoolTaskScheduler() + [Test] + public async Task TaskSchedulerCurrent_FromAsyncContext_IsThreadPoolTaskScheduler() { TaskScheduler observedScheduler = null; var context = new BrighterAsyncContext(); - - var task = context.Factory.StartNew( - () => { observedScheduler = TaskScheduler.Current; }, - context.Factory.CancellationToken, - context.Factory.CreationOptions | TaskCreationOptions.DenyChildAttach, - context.TaskScheduler); - + var task = context.Factory.StartNew(() => + { + observedScheduler = TaskScheduler.Current; + }, context.Factory.CancellationToken, context.Factory.CreationOptions | TaskCreationOptions.DenyChildAttach, context.TaskScheduler); context.Execute(task); - - Assert.Equal(TaskScheduler.Default, observedScheduler); + await Assert.That(observedScheduler).IsEqualTo(TaskScheduler.Default); } - [Fact] - public void TaskScheduler_MaximumConcurrency_IsOne() + [Test] + public async Task TaskScheduler_MaximumConcurrency_IsOne() { var context = new BrighterAsyncContext(); - Assert.Equal(1, context.TaskScheduler.MaximumConcurrencyLevel); + await Assert.That(context.TaskScheduler.MaximumConcurrencyLevel).IsEqualTo(1); } - [Fact] - public void Run_PropagatesException() + [Test] + public async Task Run_PropagatesException() { bool propogatesException = false; try { - BrighterAsyncContext.Run(() => { throw new NotImplementedException(); }); + BrighterAsyncContext.Run(() => + { + throw new NotImplementedException(); + }); } catch (Exception e) { propogatesException = true; } - Assert.True(propogatesException); + await Assert.That(propogatesException).IsTrue(); } - [Fact] - public void Run_Async_PropagatesException() + [Test] + public async Task Run_Async_PropagatesException() { bool propogatesException = false; try @@ -315,10 +294,10 @@ public void Run_Async_PropagatesException() propogatesException = true; } - Assert.True(propogatesException); + await Assert.That(propogatesException).IsTrue(); } - [Fact] + [Test] public async Task Run_Async_InThread_PropagatesException() { bool propogatesException = false; @@ -332,7 +311,6 @@ public async Task Run_Async_InThread_PropagatesException() throw new NotImplementedException(); }); }); - await runningThread; } catch (Exception e) @@ -340,11 +318,11 @@ public async Task Run_Async_InThread_PropagatesException() propogatesException = true; } - Assert.True(propogatesException); + await Assert.That(propogatesException).IsTrue(); } - [Fact] - public void SynchronizationContextPost_PropagatesException() + [Test] + public async Task SynchronizationContextPost_PropagatesException() { bool propogatesException = false; try @@ -363,31 +341,27 @@ public void SynchronizationContextPost_PropagatesException() propogatesException = true; } - Assert.True(propogatesException); + await Assert.That(propogatesException).IsTrue(); } - [Fact] - public void Task_AfterExecute_NeverRuns() + [Test] + public async Task Task_AfterExecute_NeverRuns() { int value = 0; var context = new BrighterAsyncContext(); - - var task = context.Factory.StartNew( - () => { value = 1; }, - context.Factory.CancellationToken, - context.Factory.CreationOptions | TaskCreationOptions.DenyChildAttach, - context.TaskScheduler); - + var task = context.Factory.StartNew(() => + { + value = 1; + }, context.Factory.CancellationToken, context.Factory.CreationOptions | TaskCreationOptions.DenyChildAttach, context.TaskScheduler); context.Execute(task); - - var taskTwo = context.Factory.StartNew( - () => { value = 2; }, - context.Factory.CancellationToken, - context.Factory.CreationOptions | TaskCreationOptions.DenyChildAttach, - context.TaskScheduler); - - taskTwo.ContinueWith(_ => { throw new Exception("Should not run"); }, TaskScheduler.Default); - + var taskTwo = context.Factory.StartNew(() => + { + value = 2; + }, context.Factory.CancellationToken, context.Factory.CreationOptions | TaskCreationOptions.DenyChildAttach, context.TaskScheduler); + taskTwo.ContinueWith(_ => + { + throw new Exception("Should not run"); + }, TaskScheduler.Default); bool exceptionRan = false; try { @@ -397,32 +371,26 @@ public void Task_AfterExecute_NeverRuns() { exceptionRan = true; } - //there should be no pending work - Assert.Equal(1, value); - Assert.False(exceptionRan); + //there should be no pending work + await Assert.That(value).IsEqualTo(1); + await Assert.That(exceptionRan).IsFalse(); } - [Fact] + [Test] public async Task Task_AfterExecute_Runs_On_ThreadPool() { int value = 0; var context = new BrighterAsyncContext(); - - var task = context.Factory.StartNew( - () => { value = 1; }, - context.Factory.CancellationToken, - context.Factory.CreationOptions | TaskCreationOptions.DenyChildAttach, - context.TaskScheduler); - + var task = context.Factory.StartNew(() => + { + value = 1; + }, context.Factory.CancellationToken, context.Factory.CreationOptions | TaskCreationOptions.DenyChildAttach, context.TaskScheduler); context.Execute(task); - - var taskTwo = context.Factory.StartNew( - () => { value = 2; }, - context.Factory.CancellationToken, - context.Factory.CreationOptions | TaskCreationOptions.DenyChildAttach, - TaskScheduler.Default); - + var taskTwo = context.Factory.StartNew(() => + { + value = 2; + }, context.Factory.CancellationToken, context.Factory.CreationOptions | TaskCreationOptions.DenyChildAttach, TaskScheduler.Default); bool threadPoolExceptionRan = false; try { @@ -430,29 +398,27 @@ public async Task Task_AfterExecute_Runs_On_ThreadPool() } catch (Exception e) { - Assert.Equal("Should run on thread pool", e.Message); + await Assert.That(e.Message).IsEqualTo("Should run on thread pool"); threadPoolExceptionRan = true; } - Assert.True(threadPoolExceptionRan); + await Assert.That(threadPoolExceptionRan).IsTrue(); } - - [Fact] - public void SynchronizationContext_IsEqualToCopyOfItself() + + [Test] + public async Task SynchronizationContext_IsEqualToCopyOfItself() { - var synchronizationContext1 = - BrighterAsyncContext.Run(() => System.Threading.SynchronizationContext.Current); + var synchronizationContext1 = BrighterAsyncContext.Run(() => System.Threading.SynchronizationContext.Current); var synchronizationContext2 = synchronizationContext1.CreateCopy(); - - Assert.Equal(synchronizationContext2.GetHashCode(), synchronizationContext1.GetHashCode()); - Assert.True(synchronizationContext1.Equals(synchronizationContext2)); - Assert.False(synchronizationContext1.Equals(new System.Threading.SynchronizationContext())); + await Assert.That(synchronizationContext1.GetHashCode()).IsEqualTo(synchronizationContext2.GetHashCode()); + await Assert.That(synchronizationContext1.Equals(synchronizationContext2)).IsTrue(); + await Assert.That(synchronizationContext1.Equals(new System.Threading.SynchronizationContext())).IsFalse(); } - [Fact] - public void Id_IsEqualToTaskSchedulerId() + [Test] + public async Task Id_IsEqualToTaskSchedulerId() { var context = new BrighterAsyncContext(); - Assert.Equal(context.TaskScheduler.Id, context.Id); + await Assert.That(context.Id).IsEqualTo(context.TaskScheduler.Id); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Timeout/Test Doubles/MyFailsDueToTimeoutHandler.cs b/tests/Paramore.Brighter.Core.Tests/Timeout/Test Doubles/MyFailsDueToTimeoutHandler.cs index a2301f0f85..d22d0e7359 100644 --- a/tests/Paramore.Brighter.Core.Tests/Timeout/Test Doubles/MyFailsDueToTimeoutHandler.cs +++ b/tests/Paramore.Brighter.Core.Tests/Timeout/Test Doubles/MyFailsDueToTimeoutHandler.cs @@ -23,9 +23,7 @@ THE SOFTWARE. */ #endregion using System; -using System.Linq; using System.Threading; -using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Policies.Attributes; using Paramore.Brighter.Policies.Handlers; @@ -44,28 +42,16 @@ public override MyCommand Handle(MyCommand myCommand) //already died return base.Handle(myCommand); } - try - { - var delay = Task.Delay(1000, ct).ContinueWith( - x => - { - // done something I should not do, because I should of been cancel - myCommand.WasCancelled = false; - }, - ct); - Task.WaitAll(new[] { delay }); - } - catch (AggregateException e) + if (ct.WaitHandle.WaitOne(1000)) { - foreach (var tce in e.InnerExceptions.OfType()) - { - myCommand.WasCancelled = true; - myCommand.TaskCompleted = false; - return base.Handle(myCommand); - } + myCommand.WasCancelled = true; + myCommand.TaskCompleted = false; + return base.Handle(myCommand); } + // done something I should not do, because I should of been cancel + myCommand.WasCancelled = false; myCommand.TaskCompleted = true; return base.Handle(myCommand); } diff --git a/tests/Paramore.Brighter.Core.Tests/Timeout/Test Doubles/MyPassesTimeoutHandler.cs b/tests/Paramore.Brighter.Core.Tests/Timeout/Test Doubles/MyPassesTimeoutHandler.cs index aeeb8eb7a2..27eac3b07a 100644 --- a/tests/Paramore.Brighter.Core.Tests/Timeout/Test Doubles/MyPassesTimeoutHandler.cs +++ b/tests/Paramore.Brighter.Core.Tests/Timeout/Test Doubles/MyPassesTimeoutHandler.cs @@ -36,7 +36,15 @@ internal sealed class MyPassesTimeoutHandler : RequestHandler public override MyCommand Handle(MyCommand myCommand) { var ct = (CancellationToken)Context.Bag[TimeoutPolicyHandler.CONTEXT_BAG_TIMEOUT_CANCELLATION_TOKEN]; - Task.Delay(100, ct).ContinueWith((antecedent) => { myCommand.TaskCompleted = true; }, ct).Wait(ct); + if (!ct.WaitHandle.WaitOne(100)) + { + myCommand.TaskCompleted = true; + } + else + { + ct.ThrowIfCancellationRequested(); + } + return base.Handle(myCommand); } } diff --git a/tests/Paramore.Brighter.Core.Tests/Timeout/When_sending_a_command_to_the_processor_failing_a_timeout_policy_check.cs b/tests/Paramore.Brighter.Core.Tests/Timeout/When_sending_a_command_to_the_processor_failing_a_timeout_policy_check.cs index 4758cbdd67..f9acab0a17 100644 --- a/tests/Paramore.Brighter.Core.Tests/Timeout/When_sending_a_command_to_the_processor_failing_a_timeout_policy_check.cs +++ b/tests/Paramore.Brighter.Core.Tests/Timeout/When_sending_a_command_to_the_processor_failing_a_timeout_policy_check.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,21 +12,18 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Linq; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.Timeout.Test_Doubles; -using Xunit; using Polly.Registry; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.TestHelpers; @@ -40,34 +37,28 @@ public class TimeoutHandlerFailsCheckTests private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); private AggregateException _thrownException; - public TimeoutHandlerFailsCheckTests() { var registry = new SubscriberRegistry(); registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); - var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } //We have to catch the final exception that bubbles out after retry - [Fact(Skip="Replace with Polly Timeout")] - public void When_Sending_A_Command_To_The_Processor_Failing_A_Timeout_Policy_Check() + [Test, Skip("Replace with Polly Timeout")] + public async Task When_Sending_A_Command_To_The_Processor_Failing_A_Timeout_Policy_Check() { _thrownException = (AggregateException)Catch.Exception(() => _commandProcessor.Send(_myCommand)); - //_should_throw_a_timeout_exception - Assert.IsType(_thrownException.Flatten().InnerExceptions.First()); + await Assert.That(_thrownException.Flatten().InnerExceptions.First()).IsTypeOf(); //_should_signal_that_a_timeout_occured_and_handler_should_be_cancelled - Assert.True(_myCommand.WasCancelled); + await Assert.That(_myCommand.WasCancelled).IsTrue(); //_should_not_run_to_completion - Assert.False(_myCommand.TaskCompleted); + await Assert.That(_myCommand.TaskCompleted).IsFalse(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Timeout/When_sending_a_command_to_the_processor_passing_a_timeout_policy_check.cs b/tests/Paramore.Brighter.Core.Tests/Timeout/When_sending_a_command_to_the_processor_passing_a_timeout_policy_check.cs index a463672302..e45a672e52 100644 --- a/tests/Paramore.Brighter.Core.Tests/Timeout/When_sending_a_command_to_the_processor_passing_a_timeout_policy_check.cs +++ b/tests/Paramore.Brighter.Core.Tests/Timeout/When_sending_a_command_to_the_processor_passing_a_timeout_policy_check.cs @@ -1,9 +1,9 @@ -#region Licence +#region Licence /* The MIT License (MIT) -Copyright © 2014 Ian Cooper +Copyright 2014 Ian Cooper Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the “Software”), to deal +of this software and associated documentation files (the Software), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is @@ -12,20 +12,17 @@ of this software and associated documentation files (the “Software”), to dea The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Core.Tests.Timeout.Test_Doubles; -using Xunit; using Polly.Registry; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; @@ -37,31 +34,25 @@ public class MyPassesTimeoutHandlerTests { private readonly CommandProcessor _commandProcessor; private readonly MyCommand _myCommand = new MyCommand(); - public MyPassesTimeoutHandlerTests() { var registry = new SubscriberRegistry(); //Handler is decorated with UsePolicy registry.Register(); - var container = new ServiceCollection(); container.AddTransient(); container.AddTransient>(); - var handlerFactory = new ServiceProviderHandlerFactory(container.BuildServiceProvider()); - - _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); + _commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); } //We have to catch the final exception that bubbles out after retry - [Fact(Skip="Replace with Polly Timeout")] - public void When_Sending_A_Command_To_The_Processor_Passing_A_Timeout_Policy_Check() + [Test, Skip("Replace with Polly Timeout")] + public async Task When_Sending_A_Command_To_The_Processor_Passing_A_Timeout_Policy_Check() { _commandProcessor.Send(_myCommand); - //_should_complete_the_command_before_an_exception - Assert.True(_myCommand.TaskCompleted); + await Assert.That(_myCommand.TaskCompleted).IsTrue(); } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_async_handler_has_sync_attribute_should_report_error.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_async_handler_has_sync_attribute_should_report_error.cs index bf19f3b485..78b605b494 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_async_handler_has_sync_attribute_should_report_error.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_async_handler_has_sync_attribute_should_report_error.cs @@ -19,51 +19,32 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Reject.Attributes; using Paramore.Brighter.Reject.Handlers; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class AsyncHandlerSyncAttributeValidationTests { - [Fact] - public void When_async_handler_has_sync_attribute_should_report_error() + [Test] + public async Task When_async_handler_has_sync_attribute_should_report_error() { // Arrange — async handler (isAsync: true) with a sync step handler type // RejectMessageOnErrorHandler<> extends RequestHandler (sync), not RequestHandlerAsync - var description = new HandlerPipelineDescription( - requestType: typeof(MyCommand), - handlerType: typeof(MyCommandHandler), - isAsync: true, - beforeSteps: - [ - new PipelineStepDescription( - typeof(RejectMessageOnErrorAttribute), - typeof(RejectMessageOnErrorHandler<>), - Step: 1, - HandlerTiming.Before) - ], - afterSteps: []); - + var description = new HandlerPipelineDescription(requestType: typeof(MyCommand), handlerType: typeof(MyCommandHandler), isAsync: true, beforeSteps: [new PipelineStepDescription(typeof(RejectMessageOnErrorAttribute), typeof(RejectMessageOnErrorHandler<>), Step: 1, HandlerTiming.Before)], afterSteps: []); var spec = HandlerPipelineValidationRules.AttributeAsyncConsistency(); - // Act var satisfied = spec.IsSatisfiedBy(description); var collector = new ValidationResultCollector(); var results = spec.Accept(collector).Where(r => !r.Success).ToList(); - // Assert - Assert.False(satisfied); - Assert.Single(results); - Assert.Equal(ValidationSeverity.Error, results[0].Error!.Severity); - Assert.Contains("Async handler uses sync attribute", results[0].Error!.Message); - Assert.Contains("RejectMessageOnErrorAttribute", results[0].Error!.Message); + await Assert.That(satisfied).IsFalse(); + await Assert.That(results).HasSingleItem(); + await Assert.That(results[0].Error!.Severity).IsEqualTo(ValidationSeverity.Error); + await Assert.That(results[0].Error!.Message).Contains("Async handler uses sync attribute"); + await Assert.That(results[0].Error!.Message).Contains("RejectMessageOnErrorAttribute"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_backstop_after_resilience_should_report_ordering_warning.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_backstop_after_resilience_should_report_ordering_warning.cs index 07cc7f04fc..06166988fc 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_backstop_after_resilience_should_report_ordering_warning.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_backstop_after_resilience_should_report_ordering_warning.cs @@ -19,9 +19,7 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Policies.Attributes; @@ -29,50 +27,28 @@ THE SOFTWARE. */ using Paramore.Brighter.Reject.Attributes; using Paramore.Brighter.Reject.Handlers; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class BackstopResilienceValidationTests { - [Fact] - public void When_backstop_after_resilience_should_report_ordering_warning() + [Test] + public async Task When_backstop_after_resilience_should_report_ordering_warning() { // Arrange — backstop at step 5, resilience at step 3 // Lower step = outer wrapper, so backstop (step 5) is inner and will never catch failures - var description = new HandlerPipelineDescription( - requestType: typeof(MyCommand), - handlerType: typeof(MyCommandHandler), - isAsync: false, - beforeSteps: - [ - new PipelineStepDescription( - typeof(RejectMessageOnErrorAttribute), - typeof(RejectMessageOnErrorHandler<>), - Step: 5, - HandlerTiming.Before), - new PipelineStepDescription( - typeof(UseResiliencePipelineAttribute), - typeof(ResilienceExceptionPolicyHandler<>), - Step: 3, - HandlerTiming.Before) - ], - afterSteps: []); - + var description = new HandlerPipelineDescription(requestType: typeof(MyCommand), handlerType: typeof(MyCommandHandler), isAsync: false, beforeSteps: [new PipelineStepDescription(typeof(RejectMessageOnErrorAttribute), typeof(RejectMessageOnErrorHandler<>), Step: 5, HandlerTiming.Before), new PipelineStepDescription(typeof(UseResiliencePipelineAttribute), typeof(ResilienceExceptionPolicyHandler<>), Step: 3, HandlerTiming.Before)], afterSteps: []); var spec = HandlerPipelineValidationRules.BackstopAttributeOrdering(); - // Act var satisfied = spec.IsSatisfiedBy(description); var collector = new ValidationResultCollector(); var results = spec.Accept(collector).Where(r => !r.Success).ToList(); - // Assert - Assert.False(satisfied); - Assert.Single(results); - Assert.Equal(ValidationSeverity.Warning, results[0].Error!.Severity); - Assert.Contains("RejectMessageOnErrorAttribute", results[0].Error!.Message); - Assert.Contains("step 5", results[0].Error!.Message); - Assert.Contains("UseResiliencePipelineAttribute", results[0].Error!.Message); - Assert.Contains("step 3", results[0].Error!.Message); + await Assert.That(satisfied).IsFalse(); + await Assert.That(results).HasSingleItem(); + await Assert.That(results[0].Error!.Severity).IsEqualTo(ValidationSeverity.Warning); + await Assert.That(results[0].Error!.Message).Contains("RejectMessageOnErrorAttribute"); + await Assert.That(results[0].Error!.Message).Contains("step 5"); + await Assert.That(results[0].Error!.Message).Contains("UseResiliencePipelineAttribute"); + await Assert.That(results[0].Error!.Message).Contains("step 3"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_backstop_before_resilience_should_pass.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_backstop_before_resilience_should_pass.cs index a2726ae182..54e5cbdc5d 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_backstop_before_resilience_should_pass.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_backstop_before_resilience_should_pass.cs @@ -19,9 +19,7 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Policies.Attributes; @@ -29,45 +27,23 @@ THE SOFTWARE. */ using Paramore.Brighter.Reject.Attributes; using Paramore.Brighter.Reject.Handlers; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class BackstopBeforeResilienceValidationTests { - [Fact] - public void When_backstop_before_resilience_should_pass() + [Test] + public async Task When_backstop_before_resilience_should_pass() { // Arrange — backstop at step 0, resilience at step 1 // Lower step = outer wrapper, so backstop (step 0) is outermost — correct ordering - var description = new HandlerPipelineDescription( - requestType: typeof(MyCommand), - handlerType: typeof(MyCommandHandler), - isAsync: false, - beforeSteps: - [ - new PipelineStepDescription( - typeof(RejectMessageOnErrorAttribute), - typeof(RejectMessageOnErrorHandler<>), - Step: 0, - HandlerTiming.Before), - new PipelineStepDescription( - typeof(UseResiliencePipelineAttribute), - typeof(ResilienceExceptionPolicyHandler<>), - Step: 1, - HandlerTiming.Before) - ], - afterSteps: []); - + var description = new HandlerPipelineDescription(requestType: typeof(MyCommand), handlerType: typeof(MyCommandHandler), isAsync: false, beforeSteps: [new PipelineStepDescription(typeof(RejectMessageOnErrorAttribute), typeof(RejectMessageOnErrorHandler<>), Step: 0, HandlerTiming.Before), new PipelineStepDescription(typeof(UseResiliencePipelineAttribute), typeof(ResilienceExceptionPolicyHandler<>), Step: 1, HandlerTiming.Before)], afterSteps: []); var spec = HandlerPipelineValidationRules.BackstopAttributeOrdering(); - // Act var satisfied = spec.IsSatisfiedBy(description); var collector = new ValidationResultCollector(); var results = spec.Accept(collector).Where(r => !r.Success).ToList(); - // Assert - Assert.True(satisfied); - Assert.Empty(results); + await Assert.That(satisfied).IsTrue(); + await Assert.That(results).IsEmpty(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_both_validate_and_describe_registered_should_describe_once.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_both_validate_and_describe_registered_should_describe_once.cs index 43b52b885b..9d00379ba5 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_both_validate_and_describe_registered_should_describe_once.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_both_validate_and_describe_registered_should_describe_once.cs @@ -19,9 +19,7 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -30,33 +28,26 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class DoubleDescribePreventionTests { - [Fact] + [Test] public async Task When_both_validate_and_describe_registered_should_describe_once() { // Arrange — a shared diagnostic writer registered in DI, used by both hosted services var diagnosticWriter = new SpyPipelineDiagnosticWriter(); var validator = SpyPipelineValidator.WithNoErrors(); var options = Options.Create(new BrighterPipelineValidationOptions { ConsumerOwnsValidation = false }); - var services = new ServiceCollection(); services.AddSingleton(diagnosticWriter); var provider = services.BuildServiceProvider(); - - var validationService = new BrighterValidationHostedService( - options, validator, provider, NullLogger.Instance); + var validationService = new BrighterValidationHostedService(options, validator, provider, NullLogger.Instance); var diagnosticService = new BrighterDiagnosticHostedService(diagnosticWriter, options); - // Act — both hosted services start (as they would in a real host) await validationService.StartAsync(CancellationToken.None); await diagnosticService.StartAsync(CancellationToken.None); - // Assert — Describe should have been called exactly once, not twice - Assert.Equal(1, diagnosticWriter.DescribeCallCount); + await Assert.That(diagnosticWriter.DescribeCallCount).IsEqualTo(1); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_brighter_and_producers_configured_should_run_handler_and_producer_checks.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_brighter_and_producers_configured_should_run_handler_and_producer_checks.cs index be54865db5..cd198e590c 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_brighter_and_producers_configured_should_run_handler_and_producer_checks.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_brighter_and_producers_configured_should_run_handler_and_producer_checks.cs @@ -19,42 +19,39 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class PipelineValidatorHandlerAndProducerTests { - [Fact] - public void When_brighter_and_producers_configured_should_run_handler_and_producer_checks() + [Test] + public async Task When_brighter_and_producers_configured_should_run_handler_and_producer_checks() { // Arrange — handler path: internal handler triggers visibility error var registry = new SubscriberRegistry(); registry.Add(typeof(MyDescribableCommand), typeof(MyInternalHandler)); var pipelineBuilder = new PipelineBuilder(registry); - PipelineBuilder.ClearPipelineCache(); - // Producer path: null RequestType triggers producer error - var publications = new[] { new Publication { Topic = new RoutingKey("test.topic"), RequestType = null } }; - + var publications = new[] + { + new Publication + { + Topic = new RoutingKey("test.topic"), + RequestType = null + } + }; // No subscriptions — consumer path should not run var validator = new PipelineValidator(pipelineBuilder, publications); - // Act var result = validator.Validate(); - // Assert — errors from both handler and producer paths - Assert.False(result.IsValid); - Assert.Contains(result.Errors, e => e.Message.Contains("not public")); - Assert.Contains(result.Errors, e => e.Message.Contains("RequestType")); - + await Assert.That(result.IsValid).IsFalse(); + await Assert.That(result.Errors).Contains(e => e.Message.Contains("not public")); + await Assert.That(result.Errors).Contains(e => e.Message.Contains("RequestType")); // No consumer errors - Assert.DoesNotContain(result.Errors, e => e.Message.Contains("No handler registered")); + await Assert.That(result.Errors).DoesNotContain(e => e.Message.Contains("No handler registered")); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_describe_pipelines_called_should_register_diagnostic_writer_in_di.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_describe_pipelines_called_should_register_diagnostic_writer_in_di.cs index 45ba0bf3ec..1667c72b72 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_describe_pipelines_called_should_register_diagnostic_writer_in_di.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_describe_pipelines_called_should_register_diagnostic_writer_in_di.cs @@ -19,32 +19,26 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class DescribePipelinesRegistrationTests { - [Fact] - public void When_describe_pipelines_called_should_register_diagnostic_writer_in_di() + [Test] + public async Task When_describe_pipelines_called_should_register_diagnostic_writer_in_di() { // Arrange var services = new ServiceCollection(); var subscriberRegistry = new ServiceCollectionSubscriberRegistry(services); var mapperRegistry = new ServiceCollectionMessageMapperRegistryBuilder(services); var builder = new ServiceCollectionBrighterBuilder(services, subscriberRegistry, mapperRegistry); - // Act var returnedBuilder = builder.DescribePipelines(); - // Assert — DescribePipelines registers IAmAPipelineDiagnosticWriter and returns builder for chaining - Assert.Contains(services, sd => sd.ServiceType == typeof(IAmAPipelineDiagnosticWriter)); - Assert.Same(builder, returnedBuilder); + await Assert.That(services).Contains(sd => sd.ServiceType == typeof(IAmAPipelineDiagnosticWriter)); + await Assert.That(returnedBuilder).IsSameReferenceAs(builder); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_describe_pipelines_called_standalone_should_run_at_startup.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_describe_pipelines_called_standalone_should_run_at_startup.cs index 5d98f98332..c778de3a8d 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_describe_pipelines_called_standalone_should_run_at_startup.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_describe_pipelines_called_standalone_should_run_at_startup.cs @@ -19,9 +19,7 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Collections.Generic; using System.Linq; @@ -32,31 +30,25 @@ THE SOFTWARE. */ using Microsoft.Extensions.Logging; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class DescribePipelinesStandaloneTests { - [Fact] - public void When_describe_pipelines_called_should_register_diagnostic_hosted_service() + [Test] + public async Task When_describe_pipelines_called_should_register_diagnostic_hosted_service() { // Arrange var services = new ServiceCollection(); var subscriberRegistry = new ServiceCollectionSubscriberRegistry(services); var mapperRegistry = new ServiceCollectionMessageMapperRegistryBuilder(services); var builder = new ServiceCollectionBrighterBuilder(services, subscriberRegistry, mapperRegistry); - // Act builder.DescribePipelines(); - // Assert — a diagnostic hosted service is registered - Assert.Contains(services, sd => - sd.ServiceType == typeof(IHostedService) - && sd.ImplementationType?.Name == "BrighterDiagnosticHostedService"); + await Assert.That(services).Contains(sd => sd.ServiceType == typeof(IHostedService) && sd.ImplementationType?.Name == "BrighterDiagnosticHostedService"); } - [Fact] + [Test] public async Task When_describe_pipelines_standalone_should_produce_log_output_at_startup() { // Arrange — DescribePipelines without ValidatePipelines, real diagnostic writer with captured logs @@ -67,13 +59,10 @@ public async Task When_describe_pipelines_standalone_should_produce_log_output_a var mapperRegistry = new ServiceCollectionMessageMapperRegistryBuilder(services); var builder = new ServiceCollectionBrighterBuilder(services, subscriberRegistry, mapperRegistry); builder.DescribePipelines(); - // Use a capturing logger factory so we can verify log output var logEntries = new List(); services.AddSingleton(new CapturingLoggerFactory(logEntries)); - var provider = services.BuildServiceProvider(); - // Act — start all hosted services (simulates host startup) var hostedServices = provider.GetServices().ToList(); foreach (var svc in hostedServices) @@ -82,30 +71,33 @@ public async Task When_describe_pipelines_standalone_should_produce_log_output_a } // Assert — the diagnostic writer ran and produced the pipeline summary log - Assert.Contains(logEntries, e => - e.LogLevel == LogLevel.Information - && e.Message.Contains("handler pipeline")); + await Assert.That(logEntries).Contains(e => e.LogLevel == LogLevel.Information && e.Message.Contains("handler pipeline")); } /// /// A logger factory that captures all log entries for test assertions. /// - private class CapturingLoggerFactory(List entries) : ILoggerFactory + private class CapturingLoggerFactory(List entries) : Microsoft.Extensions.Logging.ILoggerFactory, System.IDisposable { public ILogger CreateLogger(string categoryName) => new CapturingLogger(entries); - public void AddProvider(ILoggerProvider provider) { } - public void Dispose() { } + public void AddProvider(ILoggerProvider provider) + { + } + + public void Dispose() + { + } } private class CapturingLogger(List entries) : ILogger { - public void Log(LogLevel logLevel, EventId eventId, TState state, Exception? exception, - Func formatter) + public void Log(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func formatter) { entries.Add(new LogEntry(logLevel, formatter(state, exception))); } public bool IsEnabled(LogLevel logLevel) => true; - public IDisposable? BeginScope(TState state) where TState : notnull => null; + public IDisposable? BeginScope(TState state) + where TState : notnull => null; } } diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_describe_pipelines_with_producers_should_log_publications.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_describe_pipelines_with_producers_should_log_publications.cs index ed89cb0f4f..d0017600d2 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_describe_pipelines_with_producers_should_log_publications.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_describe_pipelines_with_producers_should_log_publications.cs @@ -19,32 +19,24 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class DescribePipelinesWithProducersTests { - [Fact] - public void When_describe_pipelines_with_producers_should_log_publication_summary() + [Test] + public async Task When_describe_pipelines_with_producers_should_log_publication_summary() { // Arrange — set up a producer with a publication that has a RequestType and Topic var routingKey = new RoutingKey("greeting.created"); - var producer = new InMemoryMessageProducer( - new InternalBus(), - new Publication { Topic = routingKey, RequestType = typeof(MyDescribableEvent) }); - var producerRegistry = new ProducerRegistry( - new Dictionary { { routingKey, producer } }); - + var producer = new InMemoryMessageProducer(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyDescribableEvent) }); + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, producer } }); var services = new ServiceCollection(); var subscriberRegistry = new ServiceCollectionSubscriberRegistry(services); services.AddSingleton(subscriberRegistry); @@ -53,26 +45,23 @@ public void When_describe_pipelines_with_producers_should_log_publication_summar services.AddSingleton(mapperRegistry); var builder = new ServiceCollectionBrighterBuilder(services, subscriberRegistry, mapperRegistry); builder.DescribePipelines(); - // Replace the logger factory so we can capture output var spyLogger = new SpyLogger(); - services.AddSingleton( - new TestLoggerFactory(spyLogger)); - + services.AddSingleton(new TestLoggerFactory(spyLogger)); var provider = services.BuildServiceProvider(); - // Act — resolve the diagnostic writer and call Describe var writer = provider.GetRequiredService(); writer.Describe(); - // Assert — the summary should include publication count var infoMessages = spyLogger.InformationEntries.Select(e => e.Message).ToList(); - Assert.Contains(infoMessages, m => m.Contains("1 publication")); + await Assert.That(infoMessages).Contains(m => m.Contains("1 publication")); } - private class MyDescribableEvent : Event + private class MyDescribableEvent : Paramore.Brighter.Event, Paramore.Brighter.IEvent, Paramore.Brighter.IRequest { - public MyDescribableEvent() : base(System.Guid.NewGuid()) { } + public MyDescribableEvent() : base(System.Guid.NewGuid()) + { + } } private class TestLoggerFactory : Microsoft.Extensions.Logging.ILoggerFactory @@ -80,7 +69,12 @@ private class TestLoggerFactory : Microsoft.Extensions.Logging.ILoggerFactory private readonly SpyLogger _logger; public TestLoggerFactory(SpyLogger logger) => _logger = logger; public Microsoft.Extensions.Logging.ILogger CreateLogger(string categoryName) => _logger; - public void AddProvider(Microsoft.Extensions.Logging.ILoggerProvider provider) { } - public void Dispose() { } + public void AddProvider(Microsoft.Extensions.Logging.ILoggerProvider provider) + { + } + + public void Dispose() + { + } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_diagnostic_writer_describes_should_log_handler_pipeline_detail_at_debug.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_diagnostic_writer_describes_should_log_handler_pipeline_detail_at_debug.cs index ef146c9144..13b980d37c 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_diagnostic_writer_describes_should_log_handler_pipeline_detail_at_debug.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_diagnostic_writer_describes_should_log_handler_pipeline_detail_at_debug.cs @@ -19,52 +19,35 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Microsoft.Extensions.Logging; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class PipelineDiagnosticWriterHandlerDetailTests { - [Fact] - public void When_diagnostic_writer_describes_should_log_handler_pipeline_detail_at_debug() + [Test] + public async Task When_diagnostic_writer_describes_should_log_handler_pipeline_detail_at_debug() { // Arrange — handler with two before-step attributes (backstop at 5, resilience at 3) var registry = new SubscriberRegistry(); registry.Add(typeof(MyDescribableCommand), typeof(MyMisorderedBackstopHandler)); var pipelineBuilder = new PipelineBuilder(registry); - PipelineBuilder.ClearPipelineCache(); - var logger = new SpyLogger(); var writer = new PipelineDiagnosticWriter(logger, pipelineBuilder); - // Act writer.Describe(); - // Assert — Debug-level messages contain handler name with sync/async indicator and pipeline chain var debugMessages = logger.DebugEntries.Select(e => e.Message).ToList(); - // Section header - Assert.Contains(debugMessages, m => m.Contains("Handler Pipelines")); - + await Assert.That(debugMessages).Contains(m => m.Contains("Handler Pipelines")); // Handler name with sync indicator (MyMisorderedBackstopHandler is sync) - Assert.Contains(debugMessages, m => - m.Contains("MyMisorderedBackstopHandler") && m.Contains("sync")); - + await Assert.That(debugMessages).Contains(m => m.Contains("MyMisorderedBackstopHandler") && m.Contains("sync")); // Pipeline chain shows attributes in step order with arrow separator ending at handler // Step 3 (UseResiliencePipeline) is outer, Step 5 (RejectMessageOnError) is inner // Format: [Attr(step)] → [Attr(step)] → HandlerName - Assert.Contains(debugMessages, m => - m.Contains("UseResiliencePipeline") && - m.Contains("→") && - m.Contains("RejectMessageOnError") && - m.Contains("→") && - m.Contains("MyMisorderedBackstopHandler")); + await Assert.That(debugMessages).Contains(m => m.Contains("UseResiliencePipeline") && m.Contains("→") && m.Contains("RejectMessageOnError") && m.Contains("→") && m.Contains("MyMisorderedBackstopHandler")); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_diagnostic_writer_describes_should_log_publication_detail_at_debug.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_diagnostic_writer_describes_should_log_publication_detail_at_debug.cs index 37a82eefef..2d598d1f7a 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_diagnostic_writer_describes_should_log_publication_detail_at_debug.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_diagnostic_writer_describes_should_log_publication_detail_at_debug.cs @@ -19,34 +19,24 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Microsoft.Extensions.Logging; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class PipelineDiagnosticWriterPublicationDetailTests { - [Fact] - public void When_diagnostic_writer_describes_should_log_publication_detail_at_debug() + [Test] + public async Task When_diagnostic_writer_describes_should_log_publication_detail_at_debug() { // Arrange — one publication with a custom mapper that has a wrap transform var registry = new SubscriberRegistry(); registry.Add(typeof(MyDescribableCommand), typeof(MyPublicSyncHandler)); var pipelineBuilder = new PipelineBuilder(registry); - PipelineBuilder.ClearPipelineCache(); - - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => null!), - new SimpleMessageMapperFactoryAsync(_ => null!)); + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => null!), new SimpleMessageMapperFactoryAsync(_ => null!)); mapperRegistry.Register(); - TransformPipelineBuilder.ClearPipelineCache(); - var publications = new[] { new Publication @@ -55,30 +45,19 @@ public void When_diagnostic_writer_describes_should_log_publication_detail_at_de RequestType = typeof(MyDescribableCommand) } }; - var logger = new SpyLogger(); - var writer = new PipelineDiagnosticWriter( - logger, pipelineBuilder, mapperRegistry: mapperRegistry, publications: publications); - + var writer = new PipelineDiagnosticWriter(logger, pipelineBuilder, mapperRegistry: mapperRegistry, publications: publications); // Act writer.Describe(); - // Assert — Debug messages contain publication section and detail var debugMessages = logger.DebugEntries.Select(e => e.Message).ToList(); - // Section header - Assert.Contains(debugMessages, m => m.Contains("Publications")); - + await Assert.That(debugMessages).Contains(m => m.Contains("Publications")); // Publication topic and request type - Assert.Contains(debugMessages, m => - m.Contains("MyDescribableCommand") && m.Contains("order.created")); - + await Assert.That(debugMessages).Contains(m => m.Contains("MyDescribableCommand") && m.Contains("order.created")); // Mapper type with custom/default indicator - Assert.Contains(debugMessages, m => - m.Contains("MyDescribableCommandMessageMapper") && m.Contains("custom")); - + await Assert.That(debugMessages).Contains(m => m.Contains("MyDescribableCommandMessageMapper") && m.Contains("custom")); // Transform step from the mapper's [MyDescribableWrapWith(0)] - Assert.Contains(debugMessages, m => - m.Contains("MyDescribableWrapWith")); + await Assert.That(debugMessages).Contains(m => m.Contains("MyDescribableWrapWith")); } } diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_diagnostic_writer_describes_should_log_subscription_detail_at_debug.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_diagnostic_writer_describes_should_log_subscription_detail_at_debug.cs index 77a3105641..aaca0bcd96 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_diagnostic_writer_describes_should_log_subscription_detail_at_debug.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_diagnostic_writer_describes_should_log_subscription_detail_at_debug.cs @@ -19,57 +19,37 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Microsoft.Extensions.Logging; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class PipelineDiagnosticWriterSubscriptionDetailTests { - [Fact] - public void When_diagnostic_writer_describes_should_log_subscription_detail_at_debug() + [Test] + public async Task When_diagnostic_writer_describes_should_log_subscription_detail_at_debug() { // Arrange — one subscription with known channel, routing key, and pump type var registry = new SubscriberRegistry(); registry.Add(typeof(MyDescribableCommand), typeof(MyPublicSyncHandler)); var pipelineBuilder = new PipelineBuilder(registry); - PipelineBuilder.ClearPipelineCache(); - var subscriptions = new[] { - new Subscription( - subscriptionName: new SubscriptionName("order-sub"), - channelName: new ChannelName("order-channel"), - routingKey: new RoutingKey("order.created"), - requestType: typeof(MyDescribableCommand), - messagePumpType: MessagePumpType.Reactor) + new Subscription(subscriptionName: new SubscriptionName("order-sub"), channelName: new ChannelName("order-channel"), routingKey: new RoutingKey("order.created"), requestType: typeof(MyDescribableCommand), messagePumpType: MessagePumpType.Reactor) }; - var logger = new SpyLogger(); - var writer = new PipelineDiagnosticWriter( - logger, pipelineBuilder, subscriptions: subscriptions); - + var writer = new PipelineDiagnosticWriter(logger, pipelineBuilder, subscriptions: subscriptions); // Act writer.Describe(); - // Assert — Debug messages contain subscription section and detail var debugMessages = logger.DebugEntries.Select(e => e.Message).ToList(); - // Section header - Assert.Contains(debugMessages, m => m.Contains("Subscriptions")); - + await Assert.That(debugMessages).Contains(m => m.Contains("Subscriptions")); // Subscription name with pump type - Assert.Contains(debugMessages, m => - m.Contains("order-sub") && m.Contains("Reactor")); - + await Assert.That(debugMessages).Contains(m => m.Contains("order-sub") && m.Contains("Reactor")); // Channel and routing key - Assert.Contains(debugMessages, m => - m.Contains("order-channel") && m.Contains("order.created")); + await Assert.That(debugMessages).Contains(m => m.Contains("order-channel") && m.Contains("order.created")); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_diagnostic_writer_describes_should_log_summary_at_information.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_diagnostic_writer_describes_should_log_summary_at_information.cs index eae4311806..6922058b1c 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_diagnostic_writer_describes_should_log_summary_at_information.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_diagnostic_writer_describes_should_log_summary_at_information.cs @@ -19,45 +19,39 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Microsoft.Extensions.Logging; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class PipelineDiagnosticWriterSummaryTests { - [Fact] - public void When_diagnostic_writer_describes_should_log_summary_at_information() + [Test] + public async Task When_diagnostic_writer_describes_should_log_summary_at_information() { // Arrange — two handler pipelines registered, one publication var registry = new SubscriberRegistry(); registry.Add(typeof(MyDescribableCommand), typeof(MyPublicSyncHandler)); registry.Add(typeof(MyDescribableCommand), typeof(MyPublicAsyncHandler)); var pipelineBuilder = new PipelineBuilder(registry); - PipelineBuilder.ClearPipelineCache(); - var publications = new[] { - new Publication { Topic = new RoutingKey("topic.one"), RequestType = typeof(MyDescribableCommand) } + new Publication + { + Topic = new RoutingKey("topic.one"), + RequestType = typeof(MyDescribableCommand) + } }; - var logger = new SpyLogger(); - var writer = new PipelineDiagnosticWriter(logger, pipelineBuilder, publications: publications); - // Act writer.Describe(); - // Assert — one Information-level summary line with correct counts var infoMessages = logger.InformationEntries.ToList(); - Assert.Single(infoMessages); - Assert.Contains("2 handler pipeline", infoMessages[0].Message); - Assert.Contains("1 publication", infoMessages[0].Message); + await Assert.That(infoMessages).HasSingleItem(); + await Assert.That(infoMessages[0].Message).Contains("2 handler pipeline"); + await Assert.That(infoMessages[0].Message).Contains("1 publication"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_diagnostic_writer_has_no_items_should_produce_no_output.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_diagnostic_writer_has_no_items_should_produce_no_output.cs index ebe4ea00ef..f5a4760d61 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_diagnostic_writer_has_no_items_should_produce_no_output.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_diagnostic_writer_has_no_items_should_produce_no_output.cs @@ -19,32 +19,24 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class PipelineDiagnosticWriterNoItemsTests { - [Fact] - public void When_diagnostic_writer_has_no_items_should_produce_no_output() + [Test] + public async Task When_diagnostic_writer_has_no_items_should_produce_no_output() { // Arrange — empty registry, no publications, no subscriptions var registry = new SubscriberRegistry(); var pipelineBuilder = new PipelineBuilder(registry); - PipelineBuilder.ClearPipelineCache(); - var logger = new SpyLogger(); var writer = new PipelineDiagnosticWriter(logger, pipelineBuilder); - // Act writer.Describe(); - // Assert — no log entries at any level - Assert.Empty(logger.Entries); + await Assert.That(logger.Entries).IsEmpty(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_handler_correctly_configured_should_report_no_findings.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_handler_correctly_configured_should_report_no_findings.cs index 30cb3f872a..70478b8ae2 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_handler_correctly_configured_should_report_no_findings.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_handler_correctly_configured_should_report_no_findings.cs @@ -19,9 +19,7 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Policies.Attributes; @@ -29,53 +27,24 @@ THE SOFTWARE. */ using Paramore.Brighter.Reject.Attributes; using Paramore.Brighter.Reject.Handlers; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class CorrectlyConfiguredHandlerValidationTests { - [Fact] - public void When_handler_correctly_configured_should_report_no_findings() + [Test] + public async Task When_handler_correctly_configured_should_report_no_findings() { // Arrange — public handler, backstop outermost (step 0), resilience inner (step 1), all sync - var description = new HandlerPipelineDescription( - requestType: typeof(MyCommand), - handlerType: typeof(MyCommandHandler), - isAsync: false, - beforeSteps: - [ - new PipelineStepDescription( - typeof(RejectMessageOnErrorAttribute), - typeof(RejectMessageOnErrorHandler<>), - Step: 0, - HandlerTiming.Before), - new PipelineStepDescription( - typeof(UseResiliencePipelineAttribute), - typeof(ResilienceExceptionPolicyHandler<>), - Step: 1, - HandlerTiming.Before) - ], - afterSteps: []); - + var description = new HandlerPipelineDescription(requestType: typeof(MyCommand), handlerType: typeof(MyCommandHandler), isAsync: false, beforeSteps: [new PipelineStepDescription(typeof(RejectMessageOnErrorAttribute), typeof(RejectMessageOnErrorHandler<>), Step: 0, HandlerTiming.Before), new PipelineStepDescription(typeof(UseResiliencePipelineAttribute), typeof(ResilienceExceptionPolicyHandler<>), Step: 1, HandlerTiming.Before)], afterSteps: []); var visibility = HandlerPipelineValidationRules.HandlerTypeVisibility(); var ordering = HandlerPipelineValidationRules.BackstopAttributeOrdering(); var consistency = HandlerPipelineValidationRules.AttributeAsyncConsistency(); - // Act - var allSatisfied = visibility.IsSatisfiedBy(description) - && ordering.IsSatisfiedBy(description) - && consistency.IsSatisfiedBy(description); - + var allSatisfied = visibility.IsSatisfiedBy(description) && ordering.IsSatisfiedBy(description) && consistency.IsSatisfiedBy(description); var collector = new ValidationResultCollector(); - var allFailures = visibility.Accept(collector) - .Concat(ordering.Accept(collector)) - .Concat(consistency.Accept(collector)) - .Where(r => !r.Success) - .ToList(); - + var allFailures = visibility.Accept(collector).Concat(ordering.Accept(collector)).Concat(consistency.Accept(collector)).Where(r => !r.Success).ToList(); // Assert - Assert.True(allSatisfied); - Assert.Empty(allFailures); + await Assert.That(allSatisfied).IsTrue(); + await Assert.That(allFailures).IsEmpty(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_handler_type_is_not_public_should_report_visibility_error.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_handler_type_is_not_public_should_report_visibility_error.cs index 835a62d5c4..22643cfba4 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_handler_type_is_not_public_should_report_visibility_error.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_handler_type_is_not_public_should_report_visibility_error.cs @@ -19,47 +19,35 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class InternalHandlerValidationTests { - [Fact] - public void When_handler_type_is_not_public_should_report_visibility_error() + [Test] + public async Task When_handler_type_is_not_public_should_report_visibility_error() { // Arrange — an internal handler type is not visible to the pipeline builder - var description = new HandlerPipelineDescription( - requestType: typeof(MyCommand), - handlerType: typeof(InternalTestHandler), - isAsync: false, - beforeSteps: [], - afterSteps: []); - + var description = new HandlerPipelineDescription(requestType: typeof(MyCommand), handlerType: typeof(InternalTestHandler), isAsync: false, beforeSteps: [], afterSteps: []); var spec = HandlerPipelineValidationRules.HandlerTypeVisibility(); - // Act var satisfied = spec.IsSatisfiedBy(description); var collector = new ValidationResultCollector(); var results = spec.Accept(collector).ToList(); - // Assert - Assert.False(satisfied); - Assert.Single(results); - Assert.Equal(ValidationSeverity.Error, results[0].Error!.Severity); - Assert.Contains("not public", results[0].Error!.Message); - Assert.Contains(nameof(InternalTestHandler), results[0].Error!.Source); + await Assert.That(satisfied).IsFalse(); + await Assert.That(results).HasSingleItem(); + await Assert.That(results[0].Error!.Severity).IsEqualTo(ValidationSeverity.Error); + await Assert.That(results[0].Error!.Message).Contains("not public"); + await Assert.That(results[0].Error!.Source).Contains(nameof(InternalTestHandler)); } } /// Internal handler type for testing visibility validation. -internal class InternalTestHandler : RequestHandler +internal class InternalTestHandler : Paramore.Brighter.RequestHandler, Paramore.Brighter.IHandleRequests, Paramore.Brighter.IHandleRequests { public override MyCommand Handle(MyCommand command) => base.Handle(command); -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_only_brighter_configured_should_run_only_handler_checks.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_only_brighter_configured_should_run_only_handler_checks.cs index 20dd99545c..2ff8f14943 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_only_brighter_configured_should_run_only_handler_checks.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_only_brighter_configured_should_run_only_handler_checks.cs @@ -19,39 +19,30 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class PipelineValidatorHandlerOnlyTests { - [Fact] - public void When_only_brighter_configured_should_run_only_handler_checks() + [Test] + public async Task When_only_brighter_configured_should_run_only_handler_checks() { // Arrange — internal handler triggers a handler-path error; // no publications or subscriptions provided var registry = new SubscriberRegistry(); registry.Add(typeof(MyDescribableCommand), typeof(MyInternalHandler)); var pipelineBuilder = new PipelineBuilder(registry); - PipelineBuilder.ClearPipelineCache(); - var validator = new PipelineValidator(pipelineBuilder); - // Act var result = validator.Validate(); - // Assert — only handler-path errors appear - Assert.False(result.IsValid); - Assert.Contains(result.Errors, e => e.Message.Contains("not public")); - + await Assert.That(result.IsValid).IsFalse(); + await Assert.That(result.Errors).Contains(e => e.Message.Contains("not public")); // No producer or consumer errors - Assert.DoesNotContain(result.Errors, e => e.Message.Contains("RequestType")); - Assert.DoesNotContain(result.Errors, e => e.Message.Contains("No handler registered")); + await Assert.That(result.Errors).DoesNotContain(e => e.Message.Contains("RequestType")); + await Assert.That(result.Errors).DoesNotContain(e => e.Message.Contains("No handler registered")); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_pipeline_builder_describes_handler_should_return_pipeline_description.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_pipeline_builder_describes_handler_should_return_pipeline_description.cs index c8e6992106..7933006d37 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_pipeline_builder_describes_handler_should_return_pipeline_description.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_pipeline_builder_describes_handler_should_return_pipeline_description.cs @@ -19,137 +19,109 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Linq; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class PipelineBuilderDescribeTests { - [Fact] - public void When_describing_sync_handler_should_return_description_with_request_and_handler_types() + [Test] + public async Task When_describing_sync_handler_should_return_description_with_request_and_handler_types() { // Arrange var registry = new SubscriberRegistry(); registry.Add(typeof(MyCommand), typeof(MyPreAndPostDecoratedHandler)); - var pipelineBuilder = new PipelineBuilder(registry); - PipelineBuilder.ClearPipelineCache(); - // Act var descriptions = pipelineBuilder.Describe(typeof(MyCommand)).ToList(); - // Assert - Assert.Single(descriptions); + await Assert.That(descriptions).HasSingleItem(); var description = descriptions[0]; - Assert.Equal(typeof(MyCommand), description.RequestType); - Assert.Equal(typeof(MyPreAndPostDecoratedHandler), description.HandlerType); - Assert.False(description.IsAsync); + await Assert.That(description.RequestType).IsEqualTo(typeof(MyCommand)); + await Assert.That(description.HandlerType).IsEqualTo(typeof(MyPreAndPostDecoratedHandler)); + await Assert.That(description.IsAsync).IsFalse(); } - [Fact] - public void When_describing_sync_handler_should_list_before_steps_in_step_order() + [Test] + public async Task When_describing_sync_handler_should_list_before_steps_in_step_order() { // Arrange — MyPreAndPostDecoratedHandler has [MyPreValidationHandler(2, Before)] var registry = new SubscriberRegistry(); registry.Add(typeof(MyCommand), typeof(MyPreAndPostDecoratedHandler)); - var pipelineBuilder = new PipelineBuilder(registry); - PipelineBuilder.ClearPipelineCache(); - // Act var description = pipelineBuilder.Describe(typeof(MyCommand)).First(); - // Assert - Assert.Single(description.BeforeSteps); + await Assert.That(description.BeforeSteps).HasSingleItem(); var beforeStep = description.BeforeSteps[0]; - Assert.Equal(typeof(MyPreValidationHandlerAttribute), beforeStep.AttributeType); - Assert.Equal(typeof(MyValidationHandler<>), beforeStep.HandlerType); - Assert.Equal(2, beforeStep.Step); - Assert.Equal(HandlerTiming.Before, beforeStep.Timing); + await Assert.That(beforeStep.AttributeType).IsEqualTo(typeof(MyPreValidationHandlerAttribute)); + await Assert.That(beforeStep.HandlerType).IsEqualTo(typeof(MyValidationHandler<>)); + await Assert.That(beforeStep.Step).IsEqualTo(2); + await Assert.That(beforeStep.Timing).IsEqualTo(HandlerTiming.Before); } - [Fact] - public void When_describing_sync_handler_should_list_after_steps() + [Test] + public async Task When_describing_sync_handler_should_list_after_steps() { // Arrange — MyPreAndPostDecoratedHandler has [MyPostLoggingHandler(1, After)] var registry = new SubscriberRegistry(); registry.Add(typeof(MyCommand), typeof(MyPreAndPostDecoratedHandler)); - var pipelineBuilder = new PipelineBuilder(registry); - PipelineBuilder.ClearPipelineCache(); - // Act var description = pipelineBuilder.Describe(typeof(MyCommand)).First(); - // Assert - Assert.Single(description.AfterSteps); + await Assert.That(description.AfterSteps).HasSingleItem(); var afterStep = description.AfterSteps[0]; - Assert.Equal(typeof(MyPostLoggingHandlerAttribute), afterStep.AttributeType); - Assert.Equal(typeof(MyLoggingHandler<>), afterStep.HandlerType); - Assert.Equal(1, afterStep.Step); - Assert.Equal(HandlerTiming.After, afterStep.Timing); + await Assert.That(afterStep.AttributeType).IsEqualTo(typeof(MyPostLoggingHandlerAttribute)); + await Assert.That(afterStep.HandlerType).IsEqualTo(typeof(MyLoggingHandler<>)); + await Assert.That(afterStep.Step).IsEqualTo(1); + await Assert.That(afterStep.Timing).IsEqualTo(HandlerTiming.After); } - [Fact] - public void When_describing_async_handler_should_set_IsAsync_true() + [Test] + public async Task When_describing_async_handler_should_set_IsAsync_true() { // Arrange — MyPreAndPostDecoratedHandlerAsync extends RequestHandlerAsync var registry = new SubscriberRegistry(); registry.Add(typeof(MyCommand), typeof(MyPreAndPostDecoratedHandlerAsync)); - var pipelineBuilder = new PipelineBuilder(registry); - PipelineBuilder.ClearPipelineCache(); - // Act var description = pipelineBuilder.Describe(typeof(MyCommand)).First(); - // Assert - Assert.True(description.IsAsync); - Assert.Equal(typeof(MyPreAndPostDecoratedHandlerAsync), description.HandlerType); + await Assert.That(description.IsAsync).IsTrue(); + await Assert.That(description.HandlerType).IsEqualTo(typeof(MyPreAndPostDecoratedHandlerAsync)); } - [Fact] - public void When_multiple_handlers_registered_should_produce_multiple_descriptions() + [Test] + public async Task When_multiple_handlers_registered_should_produce_multiple_descriptions() { // Arrange — two handler types for the same request type var registry = new SubscriberRegistry(); registry.Add(typeof(MyCommand), typeof(MyPreAndPostDecoratedHandler)); registry.Add(typeof(MyCommand), typeof(MyPreAndPostDecoratedHandlerAsync)); - var pipelineBuilder = new PipelineBuilder(registry); - PipelineBuilder.ClearPipelineCache(); - // Act var descriptions = pipelineBuilder.Describe(typeof(MyCommand)).ToList(); - // Assert - Assert.Equal(2, descriptions.Count); - Assert.Contains(descriptions, d => d.HandlerType == typeof(MyPreAndPostDecoratedHandler)); - Assert.Contains(descriptions, d => d.HandlerType == typeof(MyPreAndPostDecoratedHandlerAsync)); + await Assert.That(descriptions.Count).IsEqualTo(2); + await Assert.That(descriptions).Contains(d => d.HandlerType == typeof(MyPreAndPostDecoratedHandler)); + await Assert.That(descriptions).Contains(d => d.HandlerType == typeof(MyPreAndPostDecoratedHandlerAsync)); } - [Fact] - public void When_parameterless_describe_should_iterate_all_registered_request_types() + [Test] + public async Task When_parameterless_describe_should_iterate_all_registered_request_types() { // Arrange — register handlers for MyCommand only var registry = new SubscriberRegistry(); registry.Add(typeof(MyCommand), typeof(MyPreAndPostDecoratedHandler)); - var pipelineBuilder = new PipelineBuilder(registry); - PipelineBuilder.ClearPipelineCache(); - // Act — parameterless Describe() should find all registered request types var descriptions = pipelineBuilder.Describe().ToList(); - // Assert - Assert.Single(descriptions); - Assert.Equal(typeof(MyCommand), descriptions[0].RequestType); + await Assert.That(descriptions).HasSingleItem(); + await Assert.That(descriptions[0].RequestType).IsEqualTo(typeof(MyCommand)); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_proactor_subscription_has_sync_handler_should_report_error.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_proactor_subscription_has_sync_handler_should_report_error.cs index 3d12037fd2..693f3a9da3 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_proactor_subscription_has_sync_handler_should_report_error.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_proactor_subscription_has_sync_handler_should_report_error.cs @@ -19,46 +19,32 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.ServiceActivator.Validation; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class ProactorSubscriptionWithSyncHandlerValidationTests { - [Fact] - public void When_proactor_subscription_has_sync_handler_should_report_error() + [Test] + public async Task When_proactor_subscription_has_sync_handler_should_report_error() { // Arrange — Proactor subscription with a sync handler registered - var subscription = new Subscription( - subscriptionName: new SubscriptionName("test-sub"), - channelName: new ChannelName("test-channel"), - routingKey: new RoutingKey("test.routing.key"), - requestType: typeof(MyDescribableCommand), - messagePumpType: MessagePumpType.Proactor - ); - + var subscription = new Subscription(subscriptionName: new SubscriptionName("test-sub"), channelName: new ChannelName("test-channel"), routingKey: new RoutingKey("test.routing.key"), requestType: typeof(MyDescribableCommand), messagePumpType: MessagePumpType.Proactor); var registry = new SubscriberRegistry(); registry.Add(typeof(MyDescribableCommand), typeof(MyPublicSyncHandler)); - var spec = ConsumerValidationRules.PumpHandlerMatch(registry); - // Act var satisfied = spec.IsSatisfiedBy(subscription); var collector = new ValidationResultCollector(); var results = spec.Accept(collector).ToList(); - // Assert - Assert.False(satisfied); - Assert.Single(results); - Assert.Equal(ValidationSeverity.Error, results[0].Error!.Severity); - Assert.Contains("Proactor", results[0].Error!.Message); - Assert.Contains("Reactor", results[0].Error!.Message); + await Assert.That(satisfied).IsFalse(); + await Assert.That(results).HasSingleItem(); + await Assert.That(results[0].Error!.Severity).IsEqualTo(ValidationSeverity.Error); + await Assert.That(results[0].Error!.Message).Contains("Proactor"); + await Assert.That(results[0].Error!.Message).Contains("Reactor"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_publication_missing_request_type_should_report_error.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_publication_missing_request_type_should_report_error.cs index 0b80486fdd..de1cc5eeb7 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_publication_missing_request_type_should_report_error.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_publication_missing_request_type_should_report_error.cs @@ -19,35 +19,32 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class PublicationMissingRequestTypeValidationTests { - [Fact] - public void When_publication_missing_request_type_should_report_error() + [Test] + public async Task When_publication_missing_request_type_should_report_error() { // Arrange — publication with RequestType = null - var publication = new Publication { Topic = new RoutingKey("test.topic"), RequestType = null }; - + var publication = new Publication + { + Topic = new RoutingKey("test.topic"), + RequestType = null + }; var spec = ProducerValidationRules.PublicationRequestTypeSet(); - // Act var satisfied = spec.IsSatisfiedBy(publication); var collector = new ValidationResultCollector(); var results = spec.Accept(collector).ToList(); - // Assert - Assert.False(satisfied); - Assert.Single(results); - Assert.Equal(ValidationSeverity.Error, results[0].Error!.Severity); - Assert.Contains("test.topic", results[0].Error!.Source); - Assert.Contains("RequestType is null", results[0].Error!.Message); + await Assert.That(satisfied).IsFalse(); + await Assert.That(results).HasSingleItem(); + await Assert.That(results[0].Error!.Severity).IsEqualTo(ValidationSeverity.Error); + await Assert.That(results[0].Error!.Source).Contains("test.topic"); + await Assert.That(results[0].Error!.Message).Contains("RequestType is null"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_publication_request_type_not_IRequest_should_report_error.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_publication_request_type_not_IRequest_should_report_error.cs index 20481390fa..2a29f1e9fc 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_publication_request_type_not_IRequest_should_report_error.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_publication_request_type_not_IRequest_should_report_error.cs @@ -19,19 +19,15 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class PublicationRequestTypeNotIRequestValidationTests { - [Fact] - public void When_publication_request_type_not_IRequest_should_report_error() + [Test] + public async Task When_publication_request_type_not_IRequest_should_report_error() { // Arrange — RequestType is set but does not implement IRequest var publication = new Publication @@ -39,22 +35,19 @@ public void When_publication_request_type_not_IRequest_should_report_error() Topic = new RoutingKey("test.topic"), RequestType = typeof(NotAnIRequest) }; - var spec = ProducerValidationRules.PublicationRequestTypeImplementsIRequest(); - // Act var satisfied = spec.IsSatisfiedBy(publication); var collector = new ValidationResultCollector(); var results = spec.Accept(collector).ToList(); - // Assert - Assert.False(satisfied); - Assert.Single(results); - Assert.Equal(ValidationSeverity.Error, results[0].Error!.Severity); - Assert.Contains("test.topic", results[0].Error!.Source); - Assert.Contains("does not implement IRequest", results[0].Error!.Message); + await Assert.That(satisfied).IsFalse(); + await Assert.That(results).HasSingleItem(); + await Assert.That(results[0].Error!.Severity).IsEqualTo(ValidationSeverity.Error); + await Assert.That(results[0].Error!.Source).Contains("test.topic"); + await Assert.That(results[0].Error!.Message).Contains("does not implement IRequest"); } } /// A type that does not implement IRequest, for testing producer validation. -public class NotAnIRequest; +public class NotAnIRequest; \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_publication_valid_should_report_no_findings.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_publication_valid_should_report_no_findings.cs index ed95003407..7a8b66de2e 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_publication_valid_should_report_no_findings.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_publication_valid_should_report_no_findings.cs @@ -19,20 +19,16 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class ValidPublicationValidationTests { - [Fact] - public void When_publication_valid_should_report_no_findings() + [Test] + public async Task When_publication_valid_should_report_no_findings() { // Arrange — publication with a valid RequestType that implements IRequest var publication = new Publication @@ -40,22 +36,14 @@ public void When_publication_valid_should_report_no_findings() Topic = new RoutingKey("test.topic"), RequestType = typeof(MyCommand) }; - var requestTypeSet = ProducerValidationRules.PublicationRequestTypeSet(); var implementsIRequest = ProducerValidationRules.PublicationRequestTypeImplementsIRequest(); - // Act - var allSatisfied = requestTypeSet.IsSatisfiedBy(publication) - && implementsIRequest.IsSatisfiedBy(publication); - + var allSatisfied = requestTypeSet.IsSatisfiedBy(publication) && implementsIRequest.IsSatisfiedBy(publication); var collector = new ValidationResultCollector(); - var allFailures = requestTypeSet.Accept(collector) - .Concat(implementsIRequest.Accept(collector)) - .Where(r => !r.Success) - .ToList(); - + var allFailures = requestTypeSet.Accept(collector).Concat(implementsIRequest.Accept(collector)).Where(r => !r.Success).ToList(); // Assert - Assert.True(allSatisfied); - Assert.Empty(allFailures); + await Assert.That(allSatisfied).IsTrue(); + await Assert.That(allFailures).IsEmpty(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_pump_handler_mismatch_should_report_correct_handler.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_pump_handler_mismatch_should_report_correct_handler.cs index 6bc2ed1f91..ff877ab6af 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_pump_handler_mismatch_should_report_correct_handler.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_pump_handler_mismatch_should_report_correct_handler.cs @@ -19,76 +19,52 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.ServiceActivator.Validation; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class PumpHandlerMismatchReportTests { - [Fact] - public void When_reactor_has_both_sync_and_async_handlers_should_name_async_handler() + [Test] + public async Task When_reactor_has_both_sync_and_async_handlers_should_name_async_handler() { // Arrange — Reactor subscription with both a sync handler (OK) and async handler (mismatched) var registry = new SubscriberRegistry(); registry.Add(typeof(MyDescribableCommand), typeof(MyPublicSyncHandler)); registry.Add(typeof(MyDescribableCommand), typeof(MyPublicAsyncHandler)); - - var subscription = new Subscription( - subscriptionName: new SubscriptionName("reactor-sub"), - channelName: new ChannelName("test-channel"), - routingKey: new RoutingKey("test.routing.key"), - requestType: typeof(MyDescribableCommand), - messagePumpType: MessagePumpType.Reactor - ); - + var subscription = new Subscription(subscriptionName: new SubscriptionName("reactor-sub"), channelName: new ChannelName("test-channel"), routingKey: new RoutingKey("test.routing.key"), requestType: typeof(MyDescribableCommand), messagePumpType: MessagePumpType.Reactor); var spec = ConsumerValidationRules.PumpHandlerMatch(registry); - // Act var satisfied = spec.IsSatisfiedBy(subscription); var collector = new ValidationResultCollector(); var results = spec.Accept(collector).ToList(); - // Assert — error should name MyPublicAsyncHandler, not MyPublicSyncHandler - Assert.False(satisfied); - Assert.Single(results); - Assert.Contains("MyPublicAsyncHandler", results[0].Error!.Message); - Assert.DoesNotContain("MyPublicSyncHandler", results[0].Error!.Message); + await Assert.That(satisfied).IsFalse(); + await Assert.That(results).HasSingleItem(); + await Assert.That(results[0].Error!.Message).Contains("MyPublicAsyncHandler"); + await Assert.That(results[0].Error!.Message).DoesNotContain("MyPublicSyncHandler"); } - [Fact] - public void When_proactor_has_both_async_and_sync_handlers_should_name_sync_handler() + [Test] + public async Task When_proactor_has_both_async_and_sync_handlers_should_name_sync_handler() { // Arrange — Proactor subscription with both an async handler (OK) and sync handler (mismatched) var registry = new SubscriberRegistry(); registry.Add(typeof(MyDescribableCommand), typeof(MyPublicAsyncHandler)); registry.Add(typeof(MyDescribableCommand), typeof(MyPublicSyncHandler)); - - var subscription = new Subscription( - subscriptionName: new SubscriptionName("proactor-sub"), - channelName: new ChannelName("test-channel"), - routingKey: new RoutingKey("test.routing.key"), - requestType: typeof(MyDescribableCommand), - messagePumpType: MessagePumpType.Proactor - ); - + var subscription = new Subscription(subscriptionName: new SubscriptionName("proactor-sub"), channelName: new ChannelName("test-channel"), routingKey: new RoutingKey("test.routing.key"), requestType: typeof(MyDescribableCommand), messagePumpType: MessagePumpType.Proactor); var spec = ConsumerValidationRules.PumpHandlerMatch(registry); - // Act var satisfied = spec.IsSatisfiedBy(subscription); var collector = new ValidationResultCollector(); var results = spec.Accept(collector).ToList(); - // Assert — error should name MyPublicSyncHandler, not MyPublicAsyncHandler - Assert.False(satisfied); - Assert.Single(results); - Assert.Contains("MyPublicSyncHandler", results[0].Error!.Message); - Assert.DoesNotContain("MyPublicAsyncHandler", results[0].Error!.Message); + await Assert.That(satisfied).IsFalse(); + await Assert.That(results).HasSingleItem(); + await Assert.That(results[0].Error!.Message).Contains("MyPublicSyncHandler"); + await Assert.That(results[0].Error!.Message).DoesNotContain("MyPublicAsyncHandler"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_reactor_subscription_has_async_handler_should_report_error.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_reactor_subscription_has_async_handler_should_report_error.cs index 3f82af8ae4..73d8cb734e 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_reactor_subscription_has_async_handler_should_report_error.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_reactor_subscription_has_async_handler_should_report_error.cs @@ -19,46 +19,32 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.ServiceActivator.Validation; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class ReactorSubscriptionWithAsyncHandlerValidationTests { - [Fact] - public void When_reactor_subscription_has_async_handler_should_report_error() + [Test] + public async Task When_reactor_subscription_has_async_handler_should_report_error() { // Arrange — Reactor subscription with an async handler registered - var subscription = new Subscription( - subscriptionName: new SubscriptionName("test-sub"), - channelName: new ChannelName("test-channel"), - routingKey: new RoutingKey("test.routing.key"), - requestType: typeof(MyDescribableCommand), - messagePumpType: MessagePumpType.Reactor - ); - + var subscription = new Subscription(subscriptionName: new SubscriptionName("test-sub"), channelName: new ChannelName("test-channel"), routingKey: new RoutingKey("test.routing.key"), requestType: typeof(MyDescribableCommand), messagePumpType: MessagePumpType.Reactor); var registry = new SubscriberRegistry(); registry.Add(typeof(MyDescribableCommand), typeof(MyPublicAsyncHandler)); - var spec = ConsumerValidationRules.PumpHandlerMatch(registry); - // Act var satisfied = spec.IsSatisfiedBy(subscription); var collector = new ValidationResultCollector(); var results = spec.Accept(collector).ToList(); - // Assert - Assert.False(satisfied); - Assert.Single(results); - Assert.Equal(ValidationSeverity.Error, results[0].Error!.Severity); - Assert.Contains("Reactor", results[0].Error!.Message); - Assert.Contains("Proactor", results[0].Error!.Message); + await Assert.That(satisfied).IsFalse(); + await Assert.That(results).HasSingleItem(); + await Assert.That(results[0].Error!.Severity).IsEqualTo(ValidationSeverity.Error); + await Assert.That(results[0].Error!.Message).Contains("Reactor"); + await Assert.That(results[0].Error!.Message).Contains("Proactor"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_scanning_assemblies_should_exclude_open_generic_handlers.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_scanning_assemblies_should_exclude_open_generic_handlers.cs index 940a28e3f3..6d0ee11977 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_scanning_assemblies_should_exclude_open_generic_handlers.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_scanning_assemblies_should_exclude_open_generic_handlers.cs @@ -19,38 +19,31 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using System.Reflection; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Defer.Handlers; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class AssemblyScanningOpenGenericExclusionTests { - [Fact] - public void When_scanning_assemblies_should_not_register_open_generic_type_parameters() + [Test] + public async Task When_scanning_assemblies_should_not_register_open_generic_type_parameters() { // Arrange — scan the Brighter core assembly, which contains DeferMessageOnErrorHandler var services = new ServiceCollection(); var subscriberRegistry = new ServiceCollectionSubscriberRegistry(services); var mapperRegistry = new ServiceCollectionMessageMapperRegistryBuilder(services); var builder = new ServiceCollectionBrighterBuilder(services, subscriberRegistry, mapperRegistry); - var brighterAssembly = typeof(DeferMessageOnErrorHandler<>).Assembly; builder.HandlersFromAssemblies(new[] { brighterAssembly }, null); builder.AsyncHandlersFromAssemblies(new[] { brighterAssembly }, null); - // Act var requestTypes = subscriberRegistry.GetRegisteredRequestTypes(); - // Assert — no registered request type should be a generic type parameter (e.g. TRequest) var openGenericParameters = requestTypes.Where(t => t.IsGenericParameter).ToList(); - Assert.Empty(openGenericParameters); + await Assert.That(openGenericParameters).IsEmpty(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_service_collection_subscriber_registry_should_implement_inspector.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_service_collection_subscriber_registry_should_implement_inspector.cs index 89e61b16ab..7c14030022 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_service_collection_subscriber_registry_should_implement_inspector.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_service_collection_subscriber_registry_should_implement_inspector.cs @@ -19,22 +19,17 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class ServiceCollectionSubscriberRegistryInspectorTests { private readonly ServiceCollectionSubscriberRegistry _registry; - public ServiceCollectionSubscriberRegistryInspectorTests() { // Arrange @@ -43,36 +38,33 @@ public ServiceCollectionSubscriberRegistryInspectorTests() _registry.Register(); } - [Fact] - public void When_cast_to_inspector_should_return_registered_request_types() + [Test] + public async Task When_cast_to_inspector_should_return_registered_request_types() { // Act var inspector = (IAmASubscriberRegistryInspector)_registry; var requestTypes = inspector.GetRegisteredRequestTypes(); - // Assert - Assert.Contains(typeof(MyDescribableCommand), requestTypes); + await Assert.That(requestTypes).Contains(typeof(MyDescribableCommand)); } - [Fact] - public void When_cast_to_inspector_should_return_handler_types_for_request() + [Test] + public async Task When_cast_to_inspector_should_return_handler_types_for_request() { // Act var inspector = (IAmASubscriberRegistryInspector)_registry; var handlerTypes = inspector.GetHandlerTypes(typeof(MyDescribableCommand)); - // Assert - Assert.Contains(typeof(MyPublicSyncHandler), handlerTypes); + await Assert.That(handlerTypes).Contains(typeof(MyPublicSyncHandler)); } - [Fact] - public void When_cast_to_inspector_should_return_empty_for_unregistered_request() + [Test] + public async Task When_cast_to_inspector_should_return_empty_for_unregistered_request() { // Act var inspector = (IAmASubscriberRegistryInspector)_registry; var handlerTypes = inspector.GetHandlerTypes(typeof(MyBareRequest)); - // Assert - Assert.Empty(handlerTypes); + await Assert.That(handlerTypes).IsEmpty(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_step_implements_neither_handler_interface_should_report_error.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_step_implements_neither_handler_interface_should_report_error.cs index 59431dde7e..77f4b5bb0b 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_step_implements_neither_handler_interface_should_report_error.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_step_implements_neither_handler_interface_should_report_error.cs @@ -19,51 +19,32 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class NeitherHandlerInterfaceValidationTests { - [Fact] - public void When_step_implements_neither_handler_interface_should_report_error() + [Test] + public async Task When_step_implements_neither_handler_interface_should_report_error() { // Arrange — step handler type that implements neither IHandleRequests nor IHandleRequestsAsync // This represents a corrupted or unexpected type in the pipeline registry - var description = new HandlerPipelineDescription( - requestType: typeof(MyCommand), - handlerType: typeof(MyCommandHandler), - isAsync: false, - beforeSteps: - [ - new PipelineStepDescription( - typeof(RequestHandlerAttribute), - typeof(NeitherSyncNorAsyncStep), - Step: 1, - HandlerTiming.Before) - ], - afterSteps: []); - + var description = new HandlerPipelineDescription(requestType: typeof(MyCommand), handlerType: typeof(MyCommandHandler), isAsync: false, beforeSteps: [new PipelineStepDescription(typeof(RequestHandlerAttribute), typeof(NeitherSyncNorAsyncStep), Step: 1, HandlerTiming.Before)], afterSteps: []); var spec = HandlerPipelineValidationRules.AttributeAsyncConsistency(); - // Act var satisfied = spec.IsSatisfiedBy(description); var collector = new ValidationResultCollector(); var results = spec.Accept(collector).Where(r => !r.Success).ToList(); - // Assert - Assert.False(satisfied); - Assert.Single(results); - Assert.Equal(ValidationSeverity.Error, results[0].Error!.Severity); - Assert.Contains("implements neither", results[0].Error!.Message); + await Assert.That(satisfied).IsFalse(); + await Assert.That(results).HasSingleItem(); + await Assert.That(results[0].Error!.Severity).IsEqualTo(ValidationSeverity.Error); + await Assert.That(results[0].Error!.Message).Contains("implements neither"); } } /// A type that implements neither IHandleRequests nor IHandleRequestsAsync. -public class NeitherSyncNorAsyncStep; +public class NeitherSyncNorAsyncStep; \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_subscription_correctly_configured_should_report_no_findings.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_subscription_correctly_configured_should_report_no_findings.cs index bceb36e0da..cce27c0e16 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_subscription_correctly_configured_should_report_no_findings.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_subscription_correctly_configured_should_report_no_findings.cs @@ -19,46 +19,31 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.ServiceActivator.Validation; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class SubscriptionCorrectlyConfiguredValidationTests { - [Fact] - public void When_subscription_correctly_configured_should_report_no_findings() + [Test] + public async Task When_subscription_correctly_configured_should_report_no_findings() { // Arrange — correctly configured: Reactor + sync handler + ICommand type - var subscription = new Subscription( - subscriptionName: new SubscriptionName("test-sub"), - channelName: new ChannelName("test-channel"), - routingKey: new RoutingKey("test.routing.key"), - requestType: typeof(MyDescribableCommand), - messagePumpType: MessagePumpType.Reactor - ); - + var subscription = new Subscription(subscriptionName: new SubscriptionName("test-sub"), channelName: new ChannelName("test-channel"), routingKey: new RoutingKey("test.routing.key"), requestType: typeof(MyDescribableCommand), messagePumpType: MessagePumpType.Reactor); var registry = new SubscriberRegistry(); registry.Add(typeof(MyDescribableCommand), typeof(MyPublicSyncHandler)); - var pumpMatch = ConsumerValidationRules.PumpHandlerMatch(registry); var handlerRegistered = ConsumerValidationRules.HandlerRegistered(registry); var requestTypeSubtype = ConsumerValidationRules.RequestTypeSubtype(); - // Act & Assert — all three rules pass - Assert.True(pumpMatch.IsSatisfiedBy(subscription)); - Assert.Empty(pumpMatch.Accept(new ValidationResultCollector()).ToList()); - - Assert.True(handlerRegistered.IsSatisfiedBy(subscription)); - Assert.Empty(handlerRegistered.Accept(new ValidationResultCollector()).ToList()); - - Assert.True(requestTypeSubtype.IsSatisfiedBy(subscription)); - Assert.Empty(requestTypeSubtype.Accept(new ValidationResultCollector()).ToList()); + await Assert.That(pumpMatch.IsSatisfiedBy(subscription)).IsTrue(); + await Assert.That(pumpMatch.Accept(new ValidationResultCollector()).ToList()).IsEmpty(); + await Assert.That(handlerRegistered.IsSatisfiedBy(subscription)).IsTrue(); + await Assert.That(handlerRegistered.Accept(new ValidationResultCollector()).ToList()).IsEmpty(); + await Assert.That(requestTypeSubtype.IsSatisfiedBy(subscription)).IsTrue(); + await Assert.That(requestTypeSubtype.Accept(new ValidationResultCollector()).ToList()).IsEmpty(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_subscription_has_no_handler_registered_should_report_error.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_subscription_has_no_handler_registered_should_report_error.cs index a1c5a9848d..cc4e7c6cfc 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_subscription_has_no_handler_registered_should_report_error.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_subscription_has_no_handler_registered_should_report_error.cs @@ -19,45 +19,31 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.ServiceActivator.Validation; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class SubscriptionNoHandlerRegisteredValidationTests { - [Fact] - public void When_subscription_has_no_handler_registered_should_report_error() + [Test] + public async Task When_subscription_has_no_handler_registered_should_report_error() { // Arrange — subscription with a RequestType but no handler registered for it - var subscription = new Subscription( - subscriptionName: new SubscriptionName("test-sub"), - channelName: new ChannelName("test-channel"), - routingKey: new RoutingKey("test.routing.key"), - requestType: typeof(MyDescribableCommand), - messagePumpType: MessagePumpType.Reactor - ); - + var subscription = new Subscription(subscriptionName: new SubscriptionName("test-sub"), channelName: new ChannelName("test-channel"), routingKey: new RoutingKey("test.routing.key"), requestType: typeof(MyDescribableCommand), messagePumpType: MessagePumpType.Reactor); var registry = new SubscriberRegistry(); // No handlers registered for MyDescribableCommand - var spec = ConsumerValidationRules.HandlerRegistered(registry); - // Act var satisfied = spec.IsSatisfiedBy(subscription); var collector = new ValidationResultCollector(); var results = spec.Accept(collector).ToList(); - // Assert - Assert.False(satisfied); - Assert.Single(results); - Assert.Equal(ValidationSeverity.Error, results[0].Error!.Severity); - Assert.Contains("No handler registered", results[0].Error!.Message); + await Assert.That(satisfied).IsFalse(); + await Assert.That(results).HasSingleItem(); + await Assert.That(results[0].Error!.Severity).IsEqualTo(ValidationSeverity.Error); + await Assert.That(results[0].Error!.Message).Contains("No handler registered"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_subscription_has_no_handlers_pump_match_should_pass.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_subscription_has_no_handlers_pump_match_should_pass.cs index 3dff71273c..a7804cbb93 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_subscription_has_no_handlers_pump_match_should_pass.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_subscription_has_no_handlers_pump_match_should_pass.cs @@ -19,43 +19,29 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.ServiceActivator.Validation; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class SubscriptionNoHandlersPumpMatchValidationTests { - [Fact] - public void When_subscription_has_no_handlers_pump_match_should_pass() + [Test] + public async Task When_subscription_has_no_handlers_pump_match_should_pass() { // Arrange — Reactor subscription but no handlers registered for the type - var subscription = new Subscription( - subscriptionName: new SubscriptionName("test-sub"), - channelName: new ChannelName("test-channel"), - routingKey: new RoutingKey("test.routing.key"), - requestType: typeof(MyDescribableCommand), - messagePumpType: MessagePumpType.Reactor - ); - + var subscription = new Subscription(subscriptionName: new SubscriptionName("test-sub"), channelName: new ChannelName("test-channel"), routingKey: new RoutingKey("test.routing.key"), requestType: typeof(MyDescribableCommand), messagePumpType: MessagePumpType.Reactor); var registry = new SubscriberRegistry(); // No handlers registered for MyDescribableCommand - var spec = ConsumerValidationRules.PumpHandlerMatch(registry); - // Act var satisfied = spec.IsSatisfiedBy(subscription); var collector = new ValidationResultCollector(); var results = spec.Accept(collector).ToList(); - // Assert — vacuously passes; HandlerRegistered catches the missing handler case - Assert.True(satisfied); - Assert.Empty(results); + await Assert.That(satisfied).IsTrue(); + await Assert.That(results).IsEmpty(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_subscription_request_type_is_command_should_pass.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_subscription_request_type_is_command_should_pass.cs index 06352f07f1..e39f8c4d9f 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_subscription_request_type_is_command_should_pass.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_subscription_request_type_is_command_should_pass.cs @@ -19,40 +19,27 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.ServiceActivator.Validation; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class SubscriptionRequestTypeIsCommandValidationTests { - [Fact] - public void When_subscription_request_type_is_command_should_pass() + [Test] + public async Task When_subscription_request_type_is_command_should_pass() { // Arrange — subscription with a RequestType that implements ICommand - var subscription = new Subscription( - subscriptionName: new SubscriptionName("test-sub"), - channelName: new ChannelName("test-channel"), - routingKey: new RoutingKey("test.routing.key"), - requestType: typeof(MyDescribableCommand), - messagePumpType: MessagePumpType.Reactor - ); - + var subscription = new Subscription(subscriptionName: new SubscriptionName("test-sub"), channelName: new ChannelName("test-channel"), routingKey: new RoutingKey("test.routing.key"), requestType: typeof(MyDescribableCommand), messagePumpType: MessagePumpType.Reactor); var spec = ConsumerValidationRules.RequestTypeSubtype(); - // Act var satisfied = spec.IsSatisfiedBy(subscription); var collector = new ValidationResultCollector(); var results = spec.Accept(collector).ToList(); - // Assert - Assert.True(satisfied); - Assert.Empty(results); + await Assert.That(satisfied).IsTrue(); + await Assert.That(results).IsEmpty(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_subscription_request_type_not_command_or_event_should_report_warning.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_subscription_request_type_not_command_or_event_should_report_warning.cs index fe6137a227..902af21a53 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_subscription_request_type_not_command_or_event_should_report_warning.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_subscription_request_type_not_command_or_event_should_report_warning.cs @@ -19,43 +19,30 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.ServiceActivator.Validation; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class SubscriptionRequestTypeNotCommandOrEventValidationTests { - [Fact] - public void When_subscription_request_type_not_command_or_event_should_report_warning() + [Test] + public async Task When_subscription_request_type_not_command_or_event_should_report_warning() { // Arrange — subscription with a RequestType that implements IRequest but not ICommand or IEvent - var subscription = new Subscription( - subscriptionName: new SubscriptionName("test-sub"), - channelName: new ChannelName("test-channel"), - routingKey: new RoutingKey("test.routing.key"), - requestType: typeof(MyBareRequest), - messagePumpType: MessagePumpType.Reactor - ); - + var subscription = new Subscription(subscriptionName: new SubscriptionName("test-sub"), channelName: new ChannelName("test-channel"), routingKey: new RoutingKey("test.routing.key"), requestType: typeof(MyBareRequest), messagePumpType: MessagePumpType.Reactor); var spec = ConsumerValidationRules.RequestTypeSubtype(); - // Act var satisfied = spec.IsSatisfiedBy(subscription); var collector = new ValidationResultCollector(); var results = spec.Accept(collector).ToList(); - // Assert — Warning, not Error, because it may still work but is unusual - Assert.False(satisfied); - Assert.Single(results); - Assert.Equal(ValidationSeverity.Warning, results[0].Error!.Severity); - Assert.Contains("ICommand", results[0].Error!.Message); - Assert.Contains("IEvent", results[0].Error!.Message); + await Assert.That(satisfied).IsFalse(); + await Assert.That(results).HasSingleItem(); + await Assert.That(results[0].Error!.Severity).IsEqualTo(ValidationSeverity.Warning); + await Assert.That(results[0].Error!.Message).Contains("ICommand"); + await Assert.That(results[0].Error!.Message).Contains("IEvent"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_sync_handler_has_async_attribute_should_report_error.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_sync_handler_has_async_attribute_should_report_error.cs index 777711333b..9527d3e1fe 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_sync_handler_has_async_attribute_should_report_error.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_sync_handler_has_async_attribute_should_report_error.cs @@ -19,51 +19,32 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Core.Tests.CommandProcessors.TestDoubles; using Paramore.Brighter.Reject.Attributes; using Paramore.Brighter.Reject.Handlers; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class SyncHandlerAsyncAttributeValidationTests { - [Fact] - public void When_sync_handler_has_async_attribute_should_report_error() + [Test] + public async Task When_sync_handler_has_async_attribute_should_report_error() { // Arrange — sync handler (isAsync: false) with an async step handler type // RejectMessageOnErrorHandlerAsync<> extends RequestHandlerAsync, not RequestHandler - var description = new HandlerPipelineDescription( - requestType: typeof(MyCommand), - handlerType: typeof(MyCommandHandler), - isAsync: false, - beforeSteps: - [ - new PipelineStepDescription( - typeof(RejectMessageOnErrorAsyncAttribute), - typeof(RejectMessageOnErrorHandlerAsync<>), - Step: 1, - HandlerTiming.Before) - ], - afterSteps: []); - + var description = new HandlerPipelineDescription(requestType: typeof(MyCommand), handlerType: typeof(MyCommandHandler), isAsync: false, beforeSteps: [new PipelineStepDescription(typeof(RejectMessageOnErrorAsyncAttribute), typeof(RejectMessageOnErrorHandlerAsync<>), Step: 1, HandlerTiming.Before)], afterSteps: []); var spec = HandlerPipelineValidationRules.AttributeAsyncConsistency(); - // Act var satisfied = spec.IsSatisfiedBy(description); var collector = new ValidationResultCollector(); var results = spec.Accept(collector).Where(r => !r.Success).ToList(); - // Assert - Assert.False(satisfied); - Assert.Single(results); - Assert.Equal(ValidationSeverity.Error, results[0].Error!.Severity); - Assert.Contains("Sync handler uses async attribute", results[0].Error!.Message); - Assert.Contains("RejectMessageOnErrorAsyncAttribute", results[0].Error!.Message); + await Assert.That(satisfied).IsFalse(); + await Assert.That(results).HasSingleItem(); + await Assert.That(results[0].Error!.Severity).IsEqualTo(ValidationSeverity.Error); + await Assert.That(results[0].Error!.Message).Contains("Sync handler uses async attribute"); + await Assert.That(results[0].Error!.Message).Contains("RejectMessageOnErrorAsyncAttribute"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_throw_on_error_false_should_log_errors_not_throw.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_throw_on_error_false_should_log_errors_not_throw.cs index 96ee03f6c6..87849415a9 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_throw_on_error_false_should_log_errors_not_throw.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_throw_on_error_false_should_log_errors_not_throw.cs @@ -19,9 +19,7 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -31,119 +29,93 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class ThrowOnErrorFalseTests { - private static BrighterValidationHostedService BuildService( - BrighterPipelineValidationOptions options, - IAmAPipelineValidator validator, - SpyLogger logger) + private static BrighterValidationHostedService BuildService(BrighterPipelineValidationOptions options, IAmAPipelineValidator validator, SpyLogger logger) { var services = new ServiceCollection(); var provider = services.BuildServiceProvider(); - - return new BrighterValidationHostedService( - Options.Create(options), - validator, - provider, - logger); + return new BrighterValidationHostedService(Options.Create(options), validator, provider, logger); } - [Fact] - public void When_validate_pipelines_with_throw_on_error_false_should_store_in_options() + [Test] + public async Task When_validate_pipelines_with_throw_on_error_false_should_store_in_options() { // Arrange var services = new ServiceCollection(); var subscriberRegistry = new ServiceCollectionSubscriberRegistry(services); var mapperRegistry = new ServiceCollectionMessageMapperRegistryBuilder(services); var builder = new ServiceCollectionBrighterBuilder(services, subscriberRegistry, mapperRegistry); - // Act builder.ValidatePipelines(throwOnError: false); - // Assert — ThrowOnError should be false in the resolved options var provider = services.BuildServiceProvider(); var options = provider.GetRequiredService>().Value; - Assert.False(options.ThrowOnError); + await Assert.That(options.ThrowOnError).IsFalse(); } - [Fact] - public void When_validate_pipelines_with_throw_on_error_true_should_store_in_options() + [Test] + public async Task When_validate_pipelines_with_throw_on_error_true_should_store_in_options() { // Arrange var services = new ServiceCollection(); var subscriberRegistry = new ServiceCollectionSubscriberRegistry(services); var mapperRegistry = new ServiceCollectionMessageMapperRegistryBuilder(services); var builder = new ServiceCollectionBrighterBuilder(services, subscriberRegistry, mapperRegistry); - // Act builder.ValidatePipelines(throwOnError: true); - // Assert — ThrowOnError should be true (the default) var provider = services.BuildServiceProvider(); var options = provider.GetRequiredService>().Value; - Assert.True(options.ThrowOnError); + await Assert.That(options.ThrowOnError).IsTrue(); } - [Fact] - public void When_validate_pipelines_default_should_have_throw_on_error_true() + [Test] + public async Task When_validate_pipelines_default_should_have_throw_on_error_true() { // Arrange var services = new ServiceCollection(); var subscriberRegistry = new ServiceCollectionSubscriberRegistry(services); var mapperRegistry = new ServiceCollectionMessageMapperRegistryBuilder(services); var builder = new ServiceCollectionBrighterBuilder(services, subscriberRegistry, mapperRegistry); - // Act — no throwOnError argument builder.ValidatePipelines(); - // Assert — default ThrowOnError should be true var provider = services.BuildServiceProvider(); var options = provider.GetRequiredService>().Value; - Assert.True(options.ThrowOnError); + await Assert.That(options.ThrowOnError).IsTrue(); } - [Fact] + [Test] public async Task When_throw_on_error_false_and_errors_should_log_not_throw() { // Arrange var error = new ValidationError(ValidationSeverity.Error, "TestHandler", "Handler is misconfigured"); var validator = SpyPipelineValidator.WithErrors(error); var logger = new SpyLogger(); - var service = BuildService( - new BrighterPipelineValidationOptions { ConsumerOwnsValidation = false, ThrowOnError = false }, - validator, - logger); - + var service = BuildService(new BrighterPipelineValidationOptions { ConsumerOwnsValidation = false, ThrowOnError = false }, validator, logger); // Act — should NOT throw await service.StartAsync(CancellationToken.None); - // Assert — error should be logged, not thrown - Assert.True(validator.ValidateWasCalled); - Assert.Contains(logger.Entries, e => e.LogLevel == LogLevel.Error && e.Message.Contains("misconfigured")); + await Assert.That(validator.ValidateWasCalled).IsTrue(); + await Assert.That(logger.Entries).Contains(e => e.LogLevel == LogLevel.Error && e.Message.Contains("misconfigured")); } - [Fact] + [Test] public async Task When_throw_on_error_true_and_errors_should_throw() { // Arrange var error = new ValidationError(ValidationSeverity.Error, "TestHandler", "Handler is misconfigured"); var validator = SpyPipelineValidator.WithErrors(error); var logger = new SpyLogger(); - var service = BuildService( - new BrighterPipelineValidationOptions { ConsumerOwnsValidation = false, ThrowOnError = true }, - validator, - logger); - + var service = BuildService(new BrighterPipelineValidationOptions { ConsumerOwnsValidation = false, ThrowOnError = true }, validator, logger); // Act & Assert — should throw PipelineValidationException - await Assert.ThrowsAsync( - () => service.StartAsync(CancellationToken.None)); + await Assert.That(() => service.StartAsync(CancellationToken.None)).ThrowsExactly(); } - [Fact] + [Test] public async Task When_throw_on_error_false_should_still_log_warnings() { // Arrange @@ -151,16 +123,11 @@ public async Task When_throw_on_error_false_should_still_log_warnings() var error = new ValidationError(ValidationSeverity.Error, "TestHandler", "Handler is misconfigured"); var validator = new SpyPipelineValidator(new PipelineValidationResult([error], [warning])); var logger = new SpyLogger(); - var service = BuildService( - new BrighterPipelineValidationOptions { ConsumerOwnsValidation = false, ThrowOnError = false }, - validator, - logger); - + var service = BuildService(new BrighterPipelineValidationOptions { ConsumerOwnsValidation = false, ThrowOnError = false }, validator, logger); // Act await service.StartAsync(CancellationToken.None); - // Assert — both error and warning should be logged - Assert.Contains(logger.Entries, e => e.LogLevel == LogLevel.Error && e.Message.Contains("misconfigured")); - Assert.Contains(logger.Entries, e => e.LogLevel == LogLevel.Warning && e.Message.Contains("suboptimal")); + await Assert.That(logger.Entries).Contains(e => e.LogLevel == LogLevel.Error && e.Message.Contains("misconfigured")); + await Assert.That(logger.Entries).Contains(e => e.LogLevel == LogLevel.Warning && e.Message.Contains("suboptimal")); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_transform_builder_describes_should_return_mapper_and_transforms.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_transform_builder_describes_should_return_mapper_and_transforms.cs index a1abc6003d..7d7d56d43e 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_transform_builder_describes_should_return_mapper_and_transforms.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_transform_builder_describes_should_return_mapper_and_transforms.cs @@ -19,128 +19,88 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System; using System.Linq; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.MessageMappers; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class TransformPipelineBuilderDescribeTests { - [Fact] - public void When_describing_custom_mapper_should_return_mapper_type_and_not_default() + [Test] + public async Task When_describing_custom_mapper_should_return_mapper_type_and_not_default() { // Arrange — register an explicit (non-default) mapper for MyDescribableCommand - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => null!), - new SimpleMessageMapperFactoryAsync(_ => null!)); + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => null!), new SimpleMessageMapperFactoryAsync(_ => null!)); mapperRegistry.Register(); - - TransformPipelineBuilder.ClearPipelineCache(); - // Act - var description = TransformPipelineBuilder.DescribeTransforms( - mapperRegistry, typeof(MyDescribableCommand)); - + var description = TransformPipelineBuilder.DescribeTransforms(mapperRegistry, typeof(MyDescribableCommand)); // Assert - Assert.NotNull(description); - Assert.Equal(typeof(MyDescribableCommandMessageMapper), description.MapperType); - Assert.False(description.IsDefaultMapper); + await Assert.That(description).IsNotNull(); + await Assert.That(description.MapperType).IsEqualTo(typeof(MyDescribableCommandMessageMapper)); + await Assert.That(description.IsDefaultMapper).IsFalse(); } - [Fact] - public void When_describing_transforms_should_list_wrap_transforms_in_step_order() + [Test] + public async Task When_describing_transforms_should_list_wrap_transforms_in_step_order() { // Arrange - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => null!), - new SimpleMessageMapperFactoryAsync(_ => null!)); + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => null!), new SimpleMessageMapperFactoryAsync(_ => null!)); mapperRegistry.Register(); - - TransformPipelineBuilder.ClearPipelineCache(); - // Act - var description = TransformPipelineBuilder.DescribeTransforms( - mapperRegistry, typeof(MyDescribableCommand)); - + var description = TransformPipelineBuilder.DescribeTransforms(mapperRegistry, typeof(MyDescribableCommand)); // Assert — MyDescribableCommandMessageMapper has [MyDescribableWrapWith(0)] on MapToMessage - Assert.NotNull(description); - Assert.Single(description.WrapTransforms); + await Assert.That(description).IsNotNull(); + await Assert.That(description.WrapTransforms).HasSingleItem(); var wrapStep = description.WrapTransforms[0]; - Assert.Equal(typeof(MyDescribableWrapWith), wrapStep.AttributeType); - Assert.Equal(typeof(MyDescribableTransform), wrapStep.TransformType); - Assert.Equal(0, wrapStep.Step); + await Assert.That(wrapStep.AttributeType).IsEqualTo(typeof(MyDescribableWrapWith)); + await Assert.That(wrapStep.TransformType).IsEqualTo(typeof(MyDescribableTransform)); + await Assert.That(wrapStep.Step).IsEqualTo(0); } - [Fact] - public void When_describing_transforms_should_list_unwrap_transforms_in_step_order() + [Test] + public async Task When_describing_transforms_should_list_unwrap_transforms_in_step_order() { // Arrange - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => null!), - new SimpleMessageMapperFactoryAsync(_ => null!)); + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => null!), new SimpleMessageMapperFactoryAsync(_ => null!)); mapperRegistry.Register(); - - TransformPipelineBuilder.ClearPipelineCache(); - // Act - var description = TransformPipelineBuilder.DescribeTransforms( - mapperRegistry, typeof(MyDescribableCommand)); - + var description = TransformPipelineBuilder.DescribeTransforms(mapperRegistry, typeof(MyDescribableCommand)); // Assert — MyDescribableCommandMessageMapper has [MyDescribableUnwrapWith(0)] on MapToRequest - Assert.NotNull(description); - Assert.Single(description.UnwrapTransforms); + await Assert.That(description).IsNotNull(); + await Assert.That(description.UnwrapTransforms).HasSingleItem(); var unwrapStep = description.UnwrapTransforms[0]; - Assert.Equal(typeof(MyDescribableUnwrapWith), unwrapStep.AttributeType); - Assert.Equal(typeof(MyDescribableTransform), unwrapStep.TransformType); - Assert.Equal(0, unwrapStep.Step); + await Assert.That(unwrapStep.AttributeType).IsEqualTo(typeof(MyDescribableUnwrapWith)); + await Assert.That(unwrapStep.TransformType).IsEqualTo(typeof(MyDescribableTransform)); + await Assert.That(unwrapStep.Step).IsEqualTo(0); } - [Fact] - public void When_describing_default_mapper_should_identify_as_default() + [Test] + public async Task When_describing_default_mapper_should_identify_as_default() { // Arrange — use an open generic default mapper (no explicit registration for this request type) - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => null!), - new SimpleMessageMapperFactoryAsync(_ => null!), - defaultMessageMapper: typeof(JsonMessageMapper<>)); - - TransformPipelineBuilder.ClearPipelineCache(); - + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => null!), new SimpleMessageMapperFactoryAsync(_ => null!), defaultMessageMapper: typeof(JsonMessageMapper<>)); // Act - var description = TransformPipelineBuilder.DescribeTransforms( - mapperRegistry, typeof(MyDescribableCommand)); - + var description = TransformPipelineBuilder.DescribeTransforms(mapperRegistry, typeof(MyDescribableCommand)); // Assert - Assert.NotNull(description); - Assert.True(description.IsDefaultMapper); - Assert.Equal(typeof(JsonMessageMapper), description.MapperType); + await Assert.That(description).IsNotNull(); + await Assert.That(description.IsDefaultMapper).IsTrue(); + await Assert.That(description.MapperType).IsEqualTo(typeof(JsonMessageMapper)); } - [Fact] - public void When_describing_vanilla_mapper_should_have_empty_transforms() + [Test] + public async Task When_describing_vanilla_mapper_should_have_empty_transforms() { // Arrange — MyVanillaDescribableCommandMessageMapper has no wrap/unwrap attributes - var mapperRegistry = new MessageMapperRegistry( - new SimpleMessageMapperFactory(_ => null!), - new SimpleMessageMapperFactoryAsync(_ => null!)); + var mapperRegistry = new MessageMapperRegistry(new SimpleMessageMapperFactory(_ => null!), new SimpleMessageMapperFactoryAsync(_ => null!)); mapperRegistry.Register(); - - TransformPipelineBuilder.ClearPipelineCache(); - // Act - var description = TransformPipelineBuilder.DescribeTransforms( - mapperRegistry, typeof(MyDescribableCommand)); - + var description = TransformPipelineBuilder.DescribeTransforms(mapperRegistry, typeof(MyDescribableCommand)); // Assert - Assert.NotNull(description); - Assert.Empty(description.WrapTransforms); - Assert.Empty(description.UnwrapTransforms); + await Assert.That(description).IsNotNull(); + await Assert.That(description.WrapTransforms).IsEmpty(); + await Assert.That(description.UnwrapTransforms).IsEmpty(); } } diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_validate_pipelines_called_should_register_hosted_service_and_options.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_validate_pipelines_called_should_register_hosted_service_and_options.cs index 3d4218da69..c2d53c0c85 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_validate_pipelines_called_should_register_hosted_service_and_options.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_validate_pipelines_called_should_register_hosted_service_and_options.cs @@ -19,53 +19,43 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class ValidatePipelinesHostedServiceRegistrationTests { - [Fact] - public void When_validate_pipelines_called_should_register_hosted_service() + [Test] + public async Task When_validate_pipelines_called_should_register_hosted_service() { // Arrange var services = new ServiceCollection(); var subscriberRegistry = new ServiceCollectionSubscriberRegistry(services); var mapperRegistry = new ServiceCollectionMessageMapperRegistryBuilder(services); var builder = new ServiceCollectionBrighterBuilder(services, subscriberRegistry, mapperRegistry); - // Act builder.ValidatePipelines(); - // Assert — BrighterValidationHostedService is registered as IHostedService - Assert.Contains(services, sd => - sd.ServiceType == typeof(IHostedService) - && sd.ImplementationType?.Name == "BrighterValidationHostedService"); + await Assert.That(services).Contains(sd => sd.ServiceType == typeof(IHostedService) && sd.ImplementationType?.Name == "BrighterValidationHostedService"); } - [Fact] - public void When_validate_pipelines_called_should_register_options_with_consumer_owns_false() + [Test] + public async Task When_validate_pipelines_called_should_register_options_with_consumer_owns_false() { // Arrange var services = new ServiceCollection(); var subscriberRegistry = new ServiceCollectionSubscriberRegistry(services); var mapperRegistry = new ServiceCollectionMessageMapperRegistryBuilder(services); var builder = new ServiceCollectionBrighterBuilder(services, subscriberRegistry, mapperRegistry); - // Act builder.ValidatePipelines(); - // Assert — BrighterPipelineValidationOptions is configured with ConsumerOwnsValidation = false var provider = services.BuildServiceProvider(); var options = provider.GetRequiredService>().Value; - Assert.False(options.ConsumerOwnsValidation); + await Assert.That(options.ConsumerOwnsValidation).IsFalse(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_validate_pipelines_called_should_register_validator_in_di.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_validate_pipelines_called_should_register_validator_in_di.cs index bd0cdacc6f..48d03a7787 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_validate_pipelines_called_should_register_validator_in_di.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_validate_pipelines_called_should_register_validator_in_di.cs @@ -19,32 +19,26 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class ValidatePipelinesRegistrationTests { - [Fact] - public void When_validate_pipelines_called_should_register_validator_in_di() + [Test] + public async Task When_validate_pipelines_called_should_register_validator_in_di() { // Arrange var services = new ServiceCollection(); var subscriberRegistry = new ServiceCollectionSubscriberRegistry(services); var mapperRegistry = new ServiceCollectionMessageMapperRegistryBuilder(services); var builder = new ServiceCollectionBrighterBuilder(services, subscriberRegistry, mapperRegistry); - // Act var returnedBuilder = builder.ValidatePipelines(); - // Assert — ValidatePipelines registers IAmAPipelineValidator and returns builder for chaining - Assert.Contains(services, sd => sd.ServiceType == typeof(IAmAPipelineValidator)); - Assert.Same(builder, returnedBuilder); + await Assert.That(services).Contains(sd => sd.ServiceType == typeof(IAmAPipelineValidator)); + await Assert.That(returnedBuilder).IsSameReferenceAs(builder); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_validate_pipelines_disabled_should_not_register.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_validate_pipelines_disabled_should_not_register.cs index 6e90b53fd7..f41f003d5a 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_validate_pipelines_disabled_should_not_register.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_validate_pipelines_disabled_should_not_register.cs @@ -19,18 +19,14 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class ValidatePipelinesDisabledTests { private static IBrighterBuilder CreateBuilder(out ServiceCollection services) @@ -41,95 +37,75 @@ private static IBrighterBuilder CreateBuilder(out ServiceCollection services) return new ServiceCollectionBrighterBuilder(services, subscriberRegistry, mapperRegistry); } - [Fact] - public void When_validate_pipelines_disabled_should_not_register_validator() + [Test] + public async Task When_validate_pipelines_disabled_should_not_register_validator() { // Arrange var builder = CreateBuilder(out var services); - // Act var returnedBuilder = builder.ValidatePipelines(enabled: false); - // Assert — no validator, no hosted service registered - Assert.DoesNotContain(services, sd => sd.ServiceType == typeof(IAmAPipelineValidator)); - Assert.DoesNotContain(services, sd => - sd.ServiceType == typeof(IHostedService) - && sd.ImplementationType?.Name == "BrighterValidationHostedService"); - Assert.Same(builder, returnedBuilder); + await Assert.That(services).DoesNotContain(sd => sd.ServiceType == typeof(IAmAPipelineValidator)); + await Assert.That(services).DoesNotContain(sd => sd.ServiceType == typeof(IHostedService) && sd.ImplementationType?.Name == "BrighterValidationHostedService"); + await Assert.That(returnedBuilder).IsSameReferenceAs(builder); } - [Fact] - public void When_validate_pipelines_enabled_should_register_validator() + [Test] + public async Task When_validate_pipelines_enabled_should_register_validator() { // Arrange var builder = CreateBuilder(out var services); - // Act builder.ValidatePipelines(enabled: true); - // Assert — validator and hosted service registered (same as default) - Assert.Contains(services, sd => sd.ServiceType == typeof(IAmAPipelineValidator)); - Assert.Contains(services, sd => - sd.ServiceType == typeof(IHostedService) - && sd.ImplementationType?.Name == "BrighterValidationHostedService"); + await Assert.That(services).Contains(sd => sd.ServiceType == typeof(IAmAPipelineValidator)); + await Assert.That(services).Contains(sd => sd.ServiceType == typeof(IHostedService) && sd.ImplementationType?.Name == "BrighterValidationHostedService"); } - [Fact] - public void When_validate_pipelines_default_should_register_validator() + [Test] + public async Task When_validate_pipelines_default_should_register_validator() { // Arrange var builder = CreateBuilder(out var services); - // Act — no arguments, default should be enabled builder.ValidatePipelines(); - // Assert - Assert.Contains(services, sd => sd.ServiceType == typeof(IAmAPipelineValidator)); + await Assert.That(services).Contains(sd => sd.ServiceType == typeof(IAmAPipelineValidator)); } - [Fact] - public void When_describe_pipelines_disabled_should_not_register_writer() + [Test] + public async Task When_describe_pipelines_disabled_should_not_register_writer() { // Arrange var builder = CreateBuilder(out var services); - // Act var returnedBuilder = builder.DescribePipelines(enabled: false); - // Assert — no diagnostic writer, no hosted service registered - Assert.DoesNotContain(services, sd => sd.ServiceType == typeof(IAmAPipelineDiagnosticWriter)); - Assert.DoesNotContain(services, sd => - sd.ServiceType == typeof(IHostedService) - && sd.ImplementationType?.Name == "BrighterDiagnosticHostedService"); - Assert.Same(builder, returnedBuilder); + await Assert.That(services).DoesNotContain(sd => sd.ServiceType == typeof(IAmAPipelineDiagnosticWriter)); + await Assert.That(services).DoesNotContain(sd => sd.ServiceType == typeof(IHostedService) && sd.ImplementationType?.Name == "BrighterDiagnosticHostedService"); + await Assert.That(returnedBuilder).IsSameReferenceAs(builder); } - [Fact] - public void When_describe_pipelines_enabled_should_register_writer() + [Test] + public async Task When_describe_pipelines_enabled_should_register_writer() { // Arrange var builder = CreateBuilder(out var services); - // Act builder.DescribePipelines(enabled: true); - // Assert — diagnostic writer and hosted service registered (same as default) - Assert.Contains(services, sd => sd.ServiceType == typeof(IAmAPipelineDiagnosticWriter)); - Assert.Contains(services, sd => - sd.ServiceType == typeof(IHostedService) - && sd.ImplementationType?.Name == "BrighterDiagnosticHostedService"); + await Assert.That(services).Contains(sd => sd.ServiceType == typeof(IAmAPipelineDiagnosticWriter)); + await Assert.That(services).Contains(sd => sd.ServiceType == typeof(IHostedService) && sd.ImplementationType?.Name == "BrighterDiagnosticHostedService"); } - [Fact] - public void When_describe_pipelines_default_should_register_writer() + [Test] + public async Task When_describe_pipelines_default_should_register_writer() { // Arrange var builder = CreateBuilder(out var services); - // Act — no arguments, default should be enabled builder.DescribePipelines(); - // Assert - Assert.Contains(services, sd => sd.ServiceType == typeof(IAmAPipelineDiagnosticWriter)); + await Assert.That(services).Contains(sd => sd.ServiceType == typeof(IAmAPipelineDiagnosticWriter)); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_validate_pipelines_with_producers_should_receive_publications.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_validate_pipelines_with_producers_should_receive_publications.cs index 66ed031e2d..8f2a550524 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_validate_pipelines_with_producers_should_receive_publications.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_validate_pipelines_with_producers_should_receive_publications.cs @@ -19,29 +19,22 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Collections.Generic; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class ValidatePipelinesWithProducersTests { - [Fact] - public void When_validate_pipelines_with_producers_should_detect_missing_request_type() + [Test] + public async Task When_validate_pipelines_with_producers_should_detect_missing_request_type() { // Arrange — set up a producer whose publication has no RequestType var routingKey = new RoutingKey("test.validation.topic"); - var producer = new InMemoryMessageProducer( - new InternalBus(), new Publication { Topic = routingKey }); - var producerRegistry = new ProducerRegistry( - new Dictionary { { routingKey, producer } }); - + var producer = new InMemoryMessageProducer(new InternalBus(), new Publication { Topic = routingKey }); + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, producer } }); var services = new ServiceCollection(); var subscriberRegistry = new ServiceCollectionSubscriberRegistry(services); services.AddSingleton(subscriberRegistry); @@ -50,29 +43,22 @@ public void When_validate_pipelines_with_producers_should_detect_missing_request services.AddSingleton(mapperRegistry); var builder = new ServiceCollectionBrighterBuilder(services, subscriberRegistry, mapperRegistry); builder.ValidatePipelines(); - var provider = services.BuildServiceProvider(); - // Act — resolve validator and run validation var validator = provider.GetRequiredService(); var result = validator.Validate(); - // Assert — validation should detect the missing RequestType on the publication - Assert.False(result.IsValid); - Assert.Contains(result.Errors, e => e.Message.Contains("RequestType is null")); + await Assert.That(result.IsValid).IsFalse(); + await Assert.That(result.Errors).Contains(e => e.Message.Contains("RequestType is null")); } - [Fact] - public void When_validate_pipelines_with_valid_producers_should_pass_producer_checks() + [Test] + public async Task When_validate_pipelines_with_valid_producers_should_pass_producer_checks() { // Arrange — set up a producer with a valid publication var routingKey = new RoutingKey("test.validation.topic"); - var producer = new InMemoryMessageProducer( - new InternalBus(), - new Publication { Topic = routingKey, RequestType = typeof(MyValidationCommand) }); - var producerRegistry = new ProducerRegistry( - new Dictionary { { routingKey, producer } }); - + var producer = new InMemoryMessageProducer(new InternalBus(), new Publication { Topic = routingKey, RequestType = typeof(MyValidationCommand) }); + var producerRegistry = new ProducerRegistry(new Dictionary { { routingKey, producer } }); var services = new ServiceCollection(); var subscriberRegistry = new ServiceCollectionSubscriberRegistry(services); services.AddSingleton(subscriberRegistry); @@ -81,19 +67,18 @@ public void When_validate_pipelines_with_valid_producers_should_pass_producer_ch services.AddSingleton(mapperRegistry); var builder = new ServiceCollectionBrighterBuilder(services, subscriberRegistry, mapperRegistry); builder.ValidatePipelines(); - var provider = services.BuildServiceProvider(); - // Act var validator = provider.GetRequiredService(); var result = validator.Validate(); - // Assert — no producer validation errors - Assert.DoesNotContain(result.Errors, e => e.Source.Contains("Publication")); + await Assert.That(result.Errors).DoesNotContain(e => e.Source.Contains("Publication")); } - private class MyValidationCommand : Command + private class MyValidationCommand : Paramore.Brighter.Command, Paramore.Brighter.ICommand, Paramore.Brighter.IRequest { - public MyValidationCommand() : base(System.Guid.NewGuid()) { } + public MyValidationCommand() : base(System.Guid.NewGuid()) + { + } } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_validate_pipelines_without_describe_should_build_service_provider.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_validate_pipelines_without_describe_should_build_service_provider.cs index cb5f8c2734..14b2aeb212 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_validate_pipelines_without_describe_should_build_service_provider.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_validate_pipelines_without_describe_should_build_service_provider.cs @@ -19,22 +19,18 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class ValidatePipelinesWithoutDescribeTests { - [Fact] + [Test] public async Task When_validate_pipelines_called_without_describe_should_build_and_start() { // Arrange — register ValidatePipelines but NOT DescribePipelines @@ -44,17 +40,13 @@ public async Task When_validate_pipelines_called_without_describe_should_build_a services.AddSingleton(subscriberRegistry); var mapperRegistry = new ServiceCollectionMessageMapperRegistryBuilder(services); var builder = new ServiceCollectionBrighterBuilder(services, subscriberRegistry, mapperRegistry); - builder.ValidatePipelines(); - // Act — building the service provider and resolving the hosted service should not throw var provider = services.BuildServiceProvider(); var hostedServices = provider.GetServices(); var validationService = hostedServices.FirstOrDefault(s => s.GetType().Name == "BrighterValidationHostedService"); - - Assert.NotNull(validationService); - + await Assert.That(validationService).IsNotNull(); // StartAsync should complete without throwing (no diagnostic writer, no errors) await validationService.StartAsync(CancellationToken.None); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_validation_hosted_service_has_warnings_should_log_them.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_validation_hosted_service_has_warnings_should_log_them.cs index b85b14b991..2d43e04f39 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_validation_hosted_service_has_warnings_should_log_them.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_validation_hosted_service_has_warnings_should_log_them.cs @@ -19,9 +19,7 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -30,13 +28,11 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class ValidationHostedServiceWarningLoggingTests { - [Fact] + [Test] public async Task When_validation_has_warnings_should_log_them_at_warning_level() { // Arrange — two warnings with distinct source and message @@ -47,20 +43,18 @@ public async Task When_validation_has_warnings_should_log_them_at_warning_level( var logger = new SpyLogger(); var provider = new ServiceCollection().BuildServiceProvider(); var service = new BrighterValidationHostedService(options, validator, provider, logger); - // Act await service.StartAsync(CancellationToken.None); - // Assert — each warning is logged at Warning level with source and message var warningEntries = logger.WarningEntries.ToList(); - Assert.Equal(2, warningEntries.Count); - Assert.Contains("HandlerA", warningEntries[0].Message); - Assert.Contains("Backstop ordering suboptimal", warningEntries[0].Message); - Assert.Contains("HandlerB", warningEntries[1].Message); - Assert.Contains("Attribute mismatch suggestion", warningEntries[1].Message); + await Assert.That(warningEntries.Count).IsEqualTo(2); + await Assert.That(warningEntries[0].Message).Contains("HandlerA"); + await Assert.That(warningEntries[0].Message).Contains("Backstop ordering suboptimal"); + await Assert.That(warningEntries[1].Message).Contains("HandlerB"); + await Assert.That(warningEntries[1].Message).Contains("Attribute mismatch suggestion"); } - [Fact] + [Test] public async Task When_validation_has_no_warnings_should_not_log_warnings() { // Arrange — no warnings @@ -69,11 +63,9 @@ public async Task When_validation_has_no_warnings_should_not_log_warnings() var logger = new SpyLogger(); var provider = new ServiceCollection().BuildServiceProvider(); var service = new BrighterValidationHostedService(options, validator, provider, logger); - // Act await service.StartAsync(CancellationToken.None); - // Assert — no warning log entries - Assert.Empty(logger.WarningEntries); + await Assert.That(logger.WarningEntries).IsEmpty(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_validation_hosted_service_starts_without_consumers_should_validate.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_validation_hosted_service_starts_without_consumers_should_validate.cs index 4dcae60297..24a42af9d7 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_validation_hosted_service_starts_without_consumers_should_validate.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_validation_hosted_service_starts_without_consumers_should_validate.cs @@ -19,9 +19,7 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -30,102 +28,71 @@ THE SOFTWARE. */ using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class ValidationHostedServiceTests { - private static BrighterValidationHostedService BuildService( - BrighterPipelineValidationOptions options, - IAmAPipelineValidator validator, - IAmAPipelineDiagnosticWriter? diagnosticWriter = null) + private static BrighterValidationHostedService BuildService(BrighterPipelineValidationOptions options, IAmAPipelineValidator validator, IAmAPipelineDiagnosticWriter? diagnosticWriter = null) { var services = new ServiceCollection(); if (diagnosticWriter != null) services.AddSingleton(diagnosticWriter); - var provider = services.BuildServiceProvider(); - - return new BrighterValidationHostedService( - Options.Create(options), - validator, - provider, - NullLogger.Instance); + return new BrighterValidationHostedService(Options.Create(options), validator, provider, NullLogger.Instance); } - [Fact] + [Test] public async Task When_consumer_does_not_own_validation_should_run_validation() { // Arrange var validator = SpyPipelineValidator.WithNoErrors(); var diagnosticWriter = new SpyPipelineDiagnosticWriter(); - var service = BuildService( - new BrighterPipelineValidationOptions { ConsumerOwnsValidation = false }, - validator, - diagnosticWriter); - + var service = BuildService(new BrighterPipelineValidationOptions { ConsumerOwnsValidation = false }, validator, diagnosticWriter); // Act await service.StartAsync(CancellationToken.None); - // Assert — validation should have run; Describe is owned by BrighterDiagnosticHostedService - Assert.True(validator.ValidateWasCalled); - Assert.False(diagnosticWriter.DescribeWasCalled); + await Assert.That(validator.ValidateWasCalled).IsTrue(); + await Assert.That(diagnosticWriter.DescribeWasCalled).IsFalse(); } - [Fact] + [Test] public async Task When_consumer_owns_validation_should_be_noop() { // Arrange var validator = SpyPipelineValidator.WithNoErrors(); var diagnosticWriter = new SpyPipelineDiagnosticWriter(); - var service = BuildService( - new BrighterPipelineValidationOptions { ConsumerOwnsValidation = true }, - validator, - diagnosticWriter); - + var service = BuildService(new BrighterPipelineValidationOptions { ConsumerOwnsValidation = true }, validator, diagnosticWriter); // Act await service.StartAsync(CancellationToken.None); - // Assert — neither validation nor diagnostics should have run - Assert.False(validator.ValidateWasCalled); - Assert.False(diagnosticWriter.DescribeWasCalled); + await Assert.That(validator.ValidateWasCalled).IsFalse(); + await Assert.That(diagnosticWriter.DescribeWasCalled).IsFalse(); } - [Fact] + [Test] public async Task When_validation_has_errors_should_throw_pipeline_validation_exception() { // Arrange var error = new ValidationError(ValidationSeverity.Error, "TestHandler", "Handler is misconfigured"); var validator = SpyPipelineValidator.WithErrors(error); var diagnosticWriter = new SpyPipelineDiagnosticWriter(); - var service = BuildService( - new BrighterPipelineValidationOptions { ConsumerOwnsValidation = false }, - validator, - diagnosticWriter); - + var service = BuildService(new BrighterPipelineValidationOptions { ConsumerOwnsValidation = false }, validator, diagnosticWriter); // Act & Assert — validation errors should prevent startup - await Assert.ThrowsAsync( - () => service.StartAsync(CancellationToken.None)); + await Assert.That(() => service.StartAsync(CancellationToken.None)).ThrowsExactly(); } - [Fact] + [Test] public async Task When_validation_has_warnings_only_should_not_throw() { // Arrange var warning = new ValidationError(ValidationSeverity.Warning, "TestHandler", "Backstop ordering suboptimal"); var validator = SpyPipelineValidator.WithWarningsOnly(warning); var diagnosticWriter = new SpyPipelineDiagnosticWriter(); - var service = BuildService( - new BrighterPipelineValidationOptions { ConsumerOwnsValidation = false }, - validator, - diagnosticWriter); - + var service = BuildService(new BrighterPipelineValidationOptions { ConsumerOwnsValidation = false }, validator, diagnosticWriter); // Act — should complete without throwing await service.StartAsync(CancellationToken.None); - // Assert — validation ran, but no exception was thrown; Describe is owned by BrighterDiagnosticHostedService - Assert.True(validator.ValidateWasCalled); - Assert.False(diagnosticWriter.DescribeWasCalled); + await Assert.That(validator.ValidateWasCalled).IsTrue(); + await Assert.That(diagnosticWriter.DescribeWasCalled).IsFalse(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_validation_result_has_errors_should_throw_pipeline_validation_exception.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_validation_result_has_errors_should_throw_pipeline_validation_exception.cs index 6fe1f3a1d7..875608da7f 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_validation_result_has_errors_should_throw_pipeline_validation_exception.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_validation_result_has_errors_should_throw_pipeline_validation_exception.cs @@ -19,20 +19,16 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Collections.Generic; using System.Linq; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class PipelineValidationResultTests { - [Fact] - public void When_no_errors_only_warnings_should_be_valid() + [Test] + public async Task When_no_errors_only_warnings_should_be_valid() { // Arrange var warnings = new List @@ -40,18 +36,16 @@ public void When_no_errors_only_warnings_should_be_valid() new(ValidationSeverity.Warning, "Handler 'OrderHandler'", "Backstop after resilience pipeline") }; var errors = new List(); - // Act var result = new PipelineValidationResult(errors, warnings); - // Assert - Assert.True(result.IsValid); - Assert.Empty(result.Errors); - Assert.Single(result.Warnings); + await Assert.That(result.IsValid).IsTrue(); + await Assert.That(result.Errors).IsEmpty(); + await Assert.That(result.Warnings).HasSingleItem(); } - [Fact] - public void When_errors_present_should_not_be_valid() + [Test] + public async Task When_errors_present_should_not_be_valid() { // Arrange var errors = new List @@ -59,17 +53,15 @@ public void When_errors_present_should_not_be_valid() new(ValidationSeverity.Error, "Handler 'OrderHandler'", "Handler type is not public") }; var warnings = new List(); - // Act var result = new PipelineValidationResult(errors, warnings); - // Assert - Assert.False(result.IsValid); - Assert.Single(result.Errors); + await Assert.That(result.IsValid).IsFalse(); + await Assert.That(result.Errors).HasSingleItem(); } - [Fact] - public void When_has_errors_ThrowIfInvalid_should_throw_PipelineValidationException() + [Test] + public async Task When_has_errors_ThrowIfInvalid_should_throw_PipelineValidationException() { // Arrange var errors = new List @@ -79,62 +71,45 @@ public void When_has_errors_ThrowIfInvalid_should_throw_PipelineValidationExcept }; var warnings = new List(); var result = new PipelineValidationResult(errors, warnings); - // Act - var exception = Assert.Throws(() => result.ThrowIfInvalid()); - + var exception = await Assert.That(() => result.ThrowIfInvalid()).ThrowsExactly(); // Assert — exception is a ConfigurationException - Assert.IsAssignableFrom(exception); - + await Assert.That(exception).IsAssignableTo(); // Assert — exception carries the validation result - Assert.Same(result, exception.ValidationResult); - + await Assert.That(exception.ValidationResult).IsSameReferenceAs(result); // Assert — message lists all errors with source context - Assert.Contains("[Handler 'OrderHandler']", exception.Message); - Assert.Contains("Handler type is not public", exception.Message); - Assert.Contains("[Producer 'OrderCreated']", exception.Message); - Assert.Contains("RequestType not set", exception.Message); - Assert.Contains("2 error(s)", exception.Message); + await Assert.That(exception.Message).Contains("[Handler 'OrderHandler']"); + await Assert.That(exception.Message).Contains("Handler type is not public"); + await Assert.That(exception.Message).Contains("[Producer 'OrderCreated']"); + await Assert.That(exception.Message).Contains("RequestType not set"); + await Assert.That(exception.Message).Contains("2 error(s)"); } - [Fact] - public void When_valid_ThrowIfInvalid_should_not_throw() + [Test] + public async Task When_valid_ThrowIfInvalid_should_not_throw() { // Arrange - var result = new PipelineValidationResult( - new List(), - new List { new(ValidationSeverity.Warning, "X", "minor") }); - + var result = new PipelineValidationResult(new List(), new List { new(ValidationSeverity.Warning, "X", "minor") }); // Act & Assert — no exception result.ThrowIfInvalid(); } - [Fact] - public void When_combining_results_should_merge_errors_and_warnings() + [Test] + public async Task When_combining_results_should_merge_errors_and_warnings() { // Arrange - var result1 = new PipelineValidationResult( - new List { new(ValidationSeverity.Error, "A", "error from A") }, - new List { new(ValidationSeverity.Warning, "A", "warning from A") }); - - var result2 = new PipelineValidationResult( - new List { new(ValidationSeverity.Error, "B", "error from B") }, - new List()); - - var result3 = new PipelineValidationResult( - new List(), - new List { new(ValidationSeverity.Warning, "C", "warning from C") }); - + var result1 = new PipelineValidationResult(new List { new(ValidationSeverity.Error, "A", "error from A") }, new List { new(ValidationSeverity.Warning, "A", "warning from A") }); + var result2 = new PipelineValidationResult(new List { new(ValidationSeverity.Error, "B", "error from B") }, new List()); + var result3 = new PipelineValidationResult(new List(), new List { new(ValidationSeverity.Warning, "C", "warning from C") }); // Act var combined = PipelineValidationResult.Combine(result1, result2, result3); - // Assert - Assert.False(combined.IsValid); - Assert.Equal(2, combined.Errors.Count); - Assert.Equal(2, combined.Warnings.Count); - Assert.Contains(combined.Errors, e => e.Source == "A"); - Assert.Contains(combined.Errors, e => e.Source == "B"); - Assert.Contains(combined.Warnings, e => e.Source == "A"); - Assert.Contains(combined.Warnings, e => e.Source == "C"); + await Assert.That(combined.IsValid).IsFalse(); + await Assert.That(combined.Errors.Count).IsEqualTo(2); + await Assert.That(combined.Warnings.Count).IsEqualTo(2); + await Assert.That(combined.Errors).Contains(e => e.Source == "A"); + await Assert.That(combined.Errors).Contains(e => e.Source == "B"); + await Assert.That(combined.Warnings).Contains(e => e.Source == "A"); + await Assert.That(combined.Warnings).Contains(e => e.Source == "C"); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_validator_encounters_warnings_and_errors_should_collect_separately.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_validator_encounters_warnings_and_errors_should_collect_separately.cs index 6d7988ace8..d389d8420a 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_validator_encounters_warnings_and_errors_should_collect_separately.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_validator_encounters_warnings_and_errors_should_collect_separately.cs @@ -19,46 +19,43 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class PipelineValidatorWarningsSeparationTests { - [Fact] - public void When_validator_encounters_warnings_and_errors_should_collect_separately() + [Test] + public async Task When_validator_encounters_warnings_and_errors_should_collect_separately() { // Arrange — configure paths that produce both errors and warnings - // Handler path: misordered backstop/resilience triggers a Warning var registry = new SubscriberRegistry(); registry.Add(typeof(MyDescribableCommand), typeof(MyMisorderedBackstopHandler)); var pipelineBuilder = new PipelineBuilder(registry); - PipelineBuilder.ClearPipelineCache(); - // Producer path: null RequestType triggers an Error - var publications = new[] { new Publication { Topic = new RoutingKey("test.topic"), RequestType = null } }; - + var publications = new[] + { + new Publication + { + Topic = new RoutingKey("test.topic"), + RequestType = null + } + }; var validator = new PipelineValidator(pipelineBuilder, publications); - // Act var result = validator.Validate(); - // Assert — warnings and errors are in separate collections - Assert.NotEmpty(result.Errors); - Assert.NotEmpty(result.Warnings); - - Assert.All(result.Errors, e => Assert.Equal(ValidationSeverity.Error, e.Severity)); - Assert.All(result.Warnings, w => Assert.Equal(ValidationSeverity.Warning, w.Severity)); - + await Assert.That(result.Errors).IsNotEmpty(); + await Assert.That(result.Warnings).IsNotEmpty(); + foreach (var e in result.Errors) + await Assert.That(e.Severity).IsEqualTo(ValidationSeverity.Error); + foreach (var w in result.Warnings) + await Assert.That(w.Severity).IsEqualTo(ValidationSeverity.Warning); // Verify no cross-contamination - Assert.DoesNotContain(result.Errors, e => e.Severity == ValidationSeverity.Warning); - Assert.DoesNotContain(result.Warnings, w => w.Severity == ValidationSeverity.Error); + await Assert.That(result.Errors).DoesNotContain(e => e.Severity == ValidationSeverity.Warning); + await Assert.That(result.Warnings).DoesNotContain(w => w.Severity == ValidationSeverity.Error); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_validator_finds_errors_across_paths_should_aggregate_all.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_validator_finds_errors_across_paths_should_aggregate_all.cs index e4c13f6dd2..819a78935b 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_validator_finds_errors_across_paths_should_aggregate_all.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_validator_finds_errors_across_paths_should_aggregate_all.cs @@ -19,59 +19,48 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using System.Linq; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.ServiceActivator.Validation; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class PipelineValidatorErrorAggregationTests { - [Fact] - public void When_all_paths_have_errors_should_collect_errors_from_each() + [Test] + public async Task When_all_paths_have_errors_should_collect_errors_from_each() { // Arrange — configure each path with a known error - // Handler path: internal handler triggers HandlerTypeVisibility error var registry = new SubscriberRegistry(); registry.Add(typeof(MyDescribableCommand), typeof(MyInternalHandler)); var pipelineBuilder = new PipelineBuilder(registry); - PipelineBuilder.ClearPipelineCache(); - // Producer path: null RequestType triggers PublicationRequestTypeSet error - var publications = new[] { new Publication { Topic = new RoutingKey("test.topic"), RequestType = null } }; - + var publications = new[] + { + new Publication + { + Topic = new RoutingKey("test.topic"), + RequestType = null + } + }; // Consumer path: no handler for MyBareRequest triggers HandlerRegistered error var subscriptions = new[] { - new Subscription( - subscriptionName: new SubscriptionName("bare-sub"), - channelName: new ChannelName("bare-channel"), - routingKey: new RoutingKey("bare.routing.key"), - requestType: typeof(MyBareRequest), - messagePumpType: MessagePumpType.Reactor) + new Subscription(subscriptionName: new SubscriptionName("bare-sub"), channelName: new ChannelName("bare-channel"), routingKey: new RoutingKey("bare.routing.key"), requestType: typeof(MyBareRequest), messagePumpType: MessagePumpType.Reactor) }; - var consumerRules = new ISpecification[] { ConsumerValidationRules.HandlerRegistered(registry) }; - var validator = new PipelineValidator(pipelineBuilder, publications, subscriptions, consumerRules); - // Act var result = validator.Validate(); - // Assert — errors from all three paths are present - Assert.False(result.IsValid); - - Assert.Contains(result.Errors, e => e.Message.Contains("not public")); - Assert.Contains(result.Errors, e => e.Message.Contains("RequestType")); - Assert.Contains(result.Errors, e => e.Message.Contains("No handler registered")); + await Assert.That(result.IsValid).IsFalse(); + await Assert.That(result.Errors).Contains(e => e.Message.Contains("not public")); + await Assert.That(result.Errors).Contains(e => e.Message.Contains("RequestType")); + await Assert.That(result.Errors).Contains(e => e.Message.Contains("No handler registered")); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_validator_resolved_from_di_should_validate_through_full_path.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_validator_resolved_from_di_should_validate_through_full_path.cs index 15d7564326..99e680d040 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_validator_resolved_from_di_should_validate_through_full_path.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_validator_resolved_from_di_should_validate_through_full_path.cs @@ -19,21 +19,17 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class ValidatePipelinesThroughDiPathTests { - [Fact] - public void When_validator_resolved_from_di_should_validate_without_configuration_exception() + [Test] + public async Task When_validator_resolved_from_di_should_validate_without_configuration_exception() { // Arrange — wire up Brighter with a handler and ValidatePipelines through the builder var services = new ServiceCollection(); @@ -43,14 +39,11 @@ public void When_validator_resolved_from_di_should_validate_without_configuratio var mapperRegistry = new ServiceCollectionMessageMapperRegistryBuilder(services); var builder = new ServiceCollectionBrighterBuilder(services, subscriberRegistry, mapperRegistry); builder.ValidatePipelines(); - var provider = services.BuildServiceProvider(); - // Act — resolve the validator and run validation through the full DI path var validator = provider.GetRequiredService(); var result = validator.Validate(); - // Assert — validation completes without ConfigurationException; result is valid - Assert.True(result.IsValid); + await Assert.That(result.IsValid).IsTrue(); } } diff --git a/tests/Paramore.Brighter.Core.Tests/Validation/When_validator_result_has_only_warnings_should_be_valid.cs b/tests/Paramore.Brighter.Core.Tests/Validation/When_validator_result_has_only_warnings_should_be_valid.cs index 80c80a911b..b7c38682c4 100644 --- a/tests/Paramore.Brighter.Core.Tests/Validation/When_validator_result_has_only_warnings_should_be_valid.cs +++ b/tests/Paramore.Brighter.Core.Tests/Validation/When_validator_result_has_only_warnings_should_be_valid.cs @@ -19,35 +19,27 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ - #endregion - using Paramore.Brighter.Core.Tests.Validation.TestDoubles; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Core.Tests.Validation; - public class PipelineValidatorIsValidWithWarningsTests { - [Fact] - public void When_validator_result_has_only_warnings_should_be_valid() + [Test] + public async Task When_validator_result_has_only_warnings_should_be_valid() { // Arrange — handler with misordered backstop/resilience produces only a warning var registry = new SubscriberRegistry(); registry.Add(typeof(MyDescribableCommand), typeof(MyMisorderedBackstopHandler)); var pipelineBuilder = new PipelineBuilder(registry); - PipelineBuilder.ClearPipelineCache(); - // No publications or subscriptions — only handler path runs var validator = new PipelineValidator(pipelineBuilder); - // Act var result = validator.Validate(); - // Assert — warnings present but IsValid is still true - Assert.NotEmpty(result.Warnings); - Assert.Empty(result.Errors); - Assert.True(result.IsValid); + await Assert.That(result.Warnings).IsNotEmpty(); + await Assert.That(result.Errors).IsEmpty(); + await Assert.That(result.IsValid).IsTrue(); } -} +} \ No newline at end of file diff --git a/tests/Paramore.Brighter.Core.Tests/Workflows/TestDoubles/MyCommandHandlerAsync.cs b/tests/Paramore.Brighter.Core.Tests/Workflows/TestDoubles/MyCommandHandlerAsync.cs index 5fd95797f0..fc89f2a3fe 100644 --- a/tests/Paramore.Brighter.Core.Tests/Workflows/TestDoubles/MyCommandHandlerAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/Workflows/TestDoubles/MyCommandHandlerAsync.cs @@ -28,11 +28,8 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Core.Tests.Workflows.TestDoubles { - internal class MyCommandHandlerAsync(IAmACommandProcessor? commandProcessor, bool raiseFault = false) : RequestHandlerAsync + internal class MyCommandHandlerAsync(IAmACommandProcessor? commandProcessor, WorkflowExecutionLog executionLog, bool raiseFault = false) : RequestHandlerAsync { - public static List ReceivedCommands { get; } = []; - - public override async Task HandleAsync(MyCommand command, CancellationToken cancellationToken = default) { LogCommand(command); @@ -47,7 +44,7 @@ public override async Task HandleAsync(MyCommand command, Cancellatio private void LogCommand(MyCommand request) { - ReceivedCommands.Add(request); + executionLog.Commands.Add(request); } } } diff --git a/tests/Paramore.Brighter.Core.Tests/Workflows/TestDoubles/MyEventHandlerAsync.cs b/tests/Paramore.Brighter.Core.Tests/Workflows/TestDoubles/MyEventHandlerAsync.cs index 6da286c4f9..ce9f51fdd6 100644 --- a/tests/Paramore.Brighter.Core.Tests/Workflows/TestDoubles/MyEventHandlerAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/Workflows/TestDoubles/MyEventHandlerAsync.cs @@ -29,10 +29,8 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Core.Tests.Workflows.TestDoubles { - internal class MyEventHandlerAsync(Scheduler? scheduler) : RequestHandlerAsync + internal class MyEventHandlerAsync(Scheduler? scheduler, WorkflowExecutionLog executionLog) : RequestHandlerAsync { - public static List ReceivedEvents { get; } = []; - public override async Task HandleAsync(MyEvent @event, CancellationToken cancellationToken = default) { LogEvent(@event); @@ -42,7 +40,7 @@ public override async Task HandleAsync(MyEvent @event, CancellationToke private void LogEvent(MyEvent request) { - ReceivedEvents.Add(request); + executionLog.Events.Add(request); } } } diff --git a/tests/Paramore.Brighter.Core.Tests/Workflows/TestDoubles/MyFaultHandlerAsync.cs b/tests/Paramore.Brighter.Core.Tests/Workflows/TestDoubles/MyFaultHandlerAsync.cs index fb4161bab1..ac96e7a65d 100644 --- a/tests/Paramore.Brighter.Core.Tests/Workflows/TestDoubles/MyFaultHandlerAsync.cs +++ b/tests/Paramore.Brighter.Core.Tests/Workflows/TestDoubles/MyFaultHandlerAsync.cs @@ -29,10 +29,8 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Core.Tests.Workflows.TestDoubles { - internal class MyFaultHandlerAsync(Scheduler? scheduler) : RequestHandlerAsync + internal class MyFaultHandlerAsync(Scheduler? scheduler, WorkflowExecutionLog executionLog) : RequestHandlerAsync { - public static List ReceivedFaults { get; } = []; - public override async Task HandleAsync(MyFault @event, CancellationToken cancellationToken = default) { LogEvent(@event); @@ -42,7 +40,7 @@ public override async Task HandleAsync(MyFault @event, CancellationToke private void LogEvent(MyFault request) { - ReceivedFaults.Add(request); + executionLog.Faults.Add(request); } } } diff --git a/tests/Paramore.Brighter.Core.Tests/Workflows/TestDoubles/MyOtherCommandHandler.cs b/tests/Paramore.Brighter.Core.Tests/Workflows/TestDoubles/MyOtherCommandHandler.cs index 650f0fb4e1..a515ba8829 100644 --- a/tests/Paramore.Brighter.Core.Tests/Workflows/TestDoubles/MyOtherCommandHandler.cs +++ b/tests/Paramore.Brighter.Core.Tests/Workflows/TestDoubles/MyOtherCommandHandler.cs @@ -4,10 +4,8 @@ namespace Paramore.Brighter.Core.Tests.Workflows.TestDoubles; -public class MyOtherCommandHandlerAsync(IAmACommandProcessor commandProcessor) : RequestHandlerAsync +internal class MyOtherCommandHandlerAsync(IAmACommandProcessor commandProcessor, WorkflowExecutionLog executionLog) : RequestHandlerAsync { - public static List ReceivedCommands { get; set; } = []; - public override async Task HandleAsync(MyOtherCommand command, CancellationToken cancellationToken = default) { LogCommand(command); @@ -17,7 +15,7 @@ public override async Task HandleAsync(MyOtherCommand command, C private void LogCommand(MyOtherCommand request) { - ReceivedCommands.Add(request); + executionLog.OtherCommands.Add(request); } } diff --git a/tests/Paramore.Brighter.Core.Tests/Workflows/TestDoubles/WorkflowExecutionLog.cs b/tests/Paramore.Brighter.Core.Tests/Workflows/TestDoubles/WorkflowExecutionLog.cs new file mode 100644 index 0000000000..793fee1e0a --- /dev/null +++ b/tests/Paramore.Brighter.Core.Tests/Workflows/TestDoubles/WorkflowExecutionLog.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace Paramore.Brighter.Core.Tests.Workflows.TestDoubles; + +internal sealed class WorkflowExecutionLog +{ + public List Commands { get; } = []; + + public List OtherCommands { get; } = []; + + public List Events { get; } = []; + + public List Faults { get; } = []; +} diff --git a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_blocking_wait_workflow.cs b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_blocking_wait_workflow.cs index d855d4488f..66d92e4773 100644 --- a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_blocking_wait_workflow.cs +++ b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_blocking_wait_workflow.cs @@ -1,93 +1,63 @@ -using System; +using System; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Core.Tests.Workflows.TestDoubles; using Paramore.Brighter.Mediator; using Polly.Registry; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Core.Tests.Workflows; - -public class MediatorWaitStepFlowTests +public class MediatorWaitStepFlowTests { private readonly Scheduler _scheduler; private readonly Runner _runner; private readonly Job _job; + private readonly WorkflowExecutionLog _executionLog = new(); private bool _stepCompleted; - private readonly ITestOutputHelper _testOutputHelper; private readonly FakeTimeProvider _timeProvider = new(); private readonly Waker _waker; - - public MediatorWaitStepFlowTests(ITestOutputHelper testOutputHelper) + public MediatorWaitStepFlowTests() { - _testOutputHelper = testOutputHelper; var registry = new SubscriberRegistry(); registry.RegisterAsync(); - CommandProcessor commandProcessor = null; - var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyCommandHandlerAsync(commandProcessor)); - - commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); - - var workflowData= new WorkflowTestData(); + var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyCommandHandlerAsync(commandProcessor, _executionLog)); + commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); + var workflowData = new WorkflowTestData(); workflowData.Bag["MyValue"] = "Test"; - _job = new Job(workflowData); - - var secondStep = new Sequential( - "Test of Job", - new ChangeAsync( (_) => Task.CompletedTask), - () => { _stepCompleted = true; }, - null - ); - - var firstStep = new Wait("Test of Job", - TimeSpan.FromMilliseconds(100), - secondStep - ); - + var secondStep = new Sequential("Test of Job", new ChangeAsync((_) => Task.CompletedTask), () => + { + _stepCompleted = true; + }, null); + var firstStep = new Wait("Test of Job", TimeSpan.FromMilliseconds(100), secondStep); _job.InitSteps(firstStep); - InMemoryStateStoreAsync store = new(_timeProvider); InMemoryJobChannel channel = new(); - - _scheduler = new Scheduler( - channel, - store - ); - + _scheduler = new Scheduler(channel, store); _runner = new Runner(channel, store, commandProcessor, _scheduler); _waker = new Waker(TimeSpan.FromMilliseconds(100), _scheduler); } - - [Fact] + + [Test] public async Task When_running_a_wait_workflow() { var ct = new CancellationTokenSource(); - ct.CancelAfter( TimeSpan.FromSeconds(3)); - + ct.CancelAfter(TimeSpan.FromSeconds(3)); try { await _scheduler.ScheduleAsync(_job); - _timeProvider.Advance(TimeSpan.FromMilliseconds(1000)); - _runner.RunAsync(ct.Token); _waker.RunAsync(ct.Token); - await Task.Delay(5, ct.Token); - } catch (Exception e) { - _testOutputHelper.WriteLine(e.ToString()); + Console.WriteLine(e.ToString()); } - Assert.True(_stepCompleted); - Assert.Equal(JobState.Done, _job.State); + await Assert.That(_stepCompleted).IsTrue(); + await Assert.That(_job.State).IsEqualTo(JobState.Done); } } diff --git a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_change_workflow.cs b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_change_workflow.cs index 05630f2258..3fea471191 100644 --- a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_change_workflow.cs +++ b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_change_workflow.cs @@ -1,85 +1,68 @@ -using System; +using System; using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.Workflows.TestDoubles; using Paramore.Brighter.Mediator; using Polly.Registry; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Core.Tests.Workflows; - -public class MediatorChangeStepFlowTests +public class MediatorChangeStepFlowTests { - private readonly ITestOutputHelper _testOutputHelper; private readonly Scheduler _scheduler; private readonly Runner _runner; private readonly Job _job; + private readonly WorkflowExecutionLog _executionLog = new(); private bool _stepCompleted; - - public MediatorChangeStepFlowTests (ITestOutputHelper testOutputHelper) + public MediatorChangeStepFlowTests() { - _testOutputHelper = testOutputHelper; var registry = new SubscriberRegistry(); registry.RegisterAsync(); - CommandProcessor? commandProcessor = null; - var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyCommandHandlerAsync(commandProcessor)); - - commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); - - var workflowData= new WorkflowTestData { Bag = { ["MyValue"] = "Test" } }; - - _job = new Job(workflowData) ; - - var firstStep = new Sequential( - "Test of Job", - new ChangeAsync( (data) => + var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyCommandHandlerAsync(commandProcessor, _executionLog)); + commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); + var workflowData = new WorkflowTestData + { + Bag = { - var tcs = new TaskCompletionSource(); - data.Bag["MyValue"] = "Altered"; - tcs.SetResult(); - return tcs.Task; - }), - () => { _stepCompleted = true; }, - null - ); - + ["MyValue"] = "Test" + } + }; + _job = new Job(workflowData); + var firstStep = new Sequential("Test of Job", new ChangeAsync((data) => + { + var tcs = new TaskCompletionSource(); + data.Bag["MyValue"] = "Altered"; + tcs.SetResult(); + return tcs.Task; + }), () => + { + _stepCompleted = true; + }, null); _job.InitSteps(firstStep); - - var store = new InMemoryStateStoreAsync (); + var store = new InMemoryStateStoreAsync(); InMemoryJobChannel channel = new(); - - _scheduler = new Scheduler( - channel, - store - ); - + _scheduler = new Scheduler(channel, store); _runner = new Runner(channel, store, commandProcessor, _scheduler); } - - [Fact] + + [Test] public async Task When_running_a_change_workflow() { await _scheduler.ScheduleAsync(_job); - //let it run long enough to finish work, then terminate var ct = new CancellationTokenSource(); - ct.CancelAfter( TimeSpan.FromSeconds(1) ); + ct.CancelAfter(TimeSpan.FromSeconds(1)); try { _runner.RunAsync(ct.Token); } catch (Exception ex) { - // swallow the exception, we expect it to be cancelled - _testOutputHelper.WriteLine(ex.ToString()); + Console.WriteLine(ex.ToString()); } - - Assert.Equal(JobState.Done, _job.State); - Assert.True(_stepCompleted); - Assert.Equal("Altered", _job.Data.Bag["MyValue"]); + + await Assert.That(_job.State).IsEqualTo(JobState.Done); + await Assert.That(_stepCompleted).IsTrue(); + await Assert.That(_job.Data.Bag["MyValue"]).IsEqualTo("Altered"); } } diff --git a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_failing_choice_workflow_step.cs b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_failing_choice_workflow_step.cs index 07d7870f53..9fc8e75d31 100644 --- a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_failing_choice_workflow_step.cs +++ b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_failing_choice_workflow_step.cs @@ -1,110 +1,76 @@ -using System; +using System; using System.Linq; using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.Workflows.TestDoubles; using Paramore.Brighter.Mediator; using Polly.Registry; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Core.Tests.Workflows; - -public class MediatorFailingChoiceFlowTests +public class MediatorFailingChoiceFlowTests { - private readonly ITestOutputHelper _testOutputHelper; private readonly Scheduler _scheduler; private readonly Runner _runner; private readonly Job _job; + private readonly WorkflowExecutionLog _executionLog = new(); private bool _stepCompletedOne; private bool _stepCompletedTwo; private bool _stepCompletedThree; - - public MediatorFailingChoiceFlowTests(ITestOutputHelper testOutputHelper) + public MediatorFailingChoiceFlowTests() { - _testOutputHelper = testOutputHelper; // arrange var registry = new SubscriberRegistry(); registry.RegisterAsync(); registry.RegisterAsync(); - IAmACommandProcessor? commandProcessor = null; - var handlerFactory = new SimpleHandlerFactoryAsync((handlerType) => - handlerType switch - { - _ when handlerType == typeof(MyCommandHandlerAsync) => new MyCommandHandlerAsync(commandProcessor), - _ when handlerType == typeof(MyOtherCommandHandlerAsync) => new MyOtherCommandHandlerAsync(commandProcessor), - _ => throw new InvalidOperationException($"The handler type {handlerType} is not supported") - }); - - commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); - - var workflowData= new WorkflowTestData(); + var handlerFactory = new SimpleHandlerFactoryAsync((handlerType) => handlerType switch + { + _ when handlerType == typeof(MyCommandHandlerAsync) => new MyCommandHandlerAsync(commandProcessor, _executionLog), + _ when handlerType == typeof(MyOtherCommandHandlerAsync) => new MyOtherCommandHandlerAsync(commandProcessor, _executionLog), + _ => throw new InvalidOperationException($"The handler type {handlerType} is not supported")}); + commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); + var workflowData = new WorkflowTestData(); workflowData.Bag["MyValue"] = "Fail"; - - _job = new Job(workflowData) ; - - var stepThree = new Sequential( - "Test of Job SequenceStep Three", - new FireAndForgetAsync((data) => - new MyOtherCommand { Value = (data.Bag["MyValue"] as string)! }), - () => { _stepCompletedThree = true; }, - null); - - var stepTwo = new Sequential( - "Test of Job SequenceStep Two", - new FireAndForgetAsync((data) => - new MyCommand { Value = (data.Bag["MyValue"] as string)! }), - () => { _stepCompletedTwo = true; }, - null); - - var stepOne = new ExclusiveChoice( - "Test of Job SequenceStep One", - new Specification(data => data.Bag["MyValue"] as string == "Pass"), - () => { _stepCompletedOne = true; }, - stepTwo, - stepThree); - + _job = new Job(workflowData); + var stepThree = new Sequential("Test of Job SequenceStep Three", new FireAndForgetAsync((data) => new MyOtherCommand { Value = (data.Bag["MyValue"] as string)! }), () => + { + _stepCompletedThree = true; + }, null); + var stepTwo = new Sequential("Test of Job SequenceStep Two", new FireAndForgetAsync((data) => new MyCommand { Value = (data.Bag["MyValue"] as string)! }), () => + { + _stepCompletedTwo = true; + }, null); + var stepOne = new ExclusiveChoice("Test of Job SequenceStep One", new Specification(data => data.Bag["MyValue"] as string == "Pass"), () => + { + _stepCompletedOne = true; + }, stepTwo, stepThree); _job.InitSteps(stepOne); - InMemoryStateStoreAsync store = new(); InMemoryJobChannel channel = new(); - - _scheduler = new Scheduler( - channel, - store - ); - + _scheduler = new Scheduler(channel, store); _runner = new Runner(channel, store, commandProcessor, _scheduler); } - - [Fact] + + [Test] public async Task When_running_a_choice_workflow_step() { - MyCommandHandlerAsync.ReceivedCommands.Clear(); - MyOtherCommandHandlerAsync.ReceivedCommands.Clear(); - await _scheduler.ScheduleAsync(_job); - var ct = new CancellationTokenSource(); - ct.CancelAfter( TimeSpan.FromSeconds(1) ); - + ct.CancelAfter(TimeSpan.FromSeconds(1)); try { _runner.RunAsync(ct.Token); } catch (Exception e) { - _testOutputHelper.WriteLine(e.ToString()); + Console.WriteLine(e.ToString()); } // Assert - Assert.True(_stepCompletedOne); - Assert.False(_stepCompletedTwo); - Assert.True(_stepCompletedThree); - Assert.Contains(MyOtherCommandHandlerAsync.ReceivedCommands, c => c.Value == "Fail"); - Assert.False(MyCommandHandlerAsync.ReceivedCommands.Any()); + await Assert.That(_stepCompletedOne).IsTrue(); + await Assert.That(_stepCompletedTwo).IsFalse(); + await Assert.That(_stepCompletedThree).IsTrue(); + await Assert.That(_executionLog.OtherCommands).Contains(c => c.Value == "Fail"); + await Assert.That(_executionLog.Commands.Any()).IsFalse(); } } diff --git a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_multistep_workflow_with_reply.cs b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_multistep_workflow_with_reply.cs index aae9ac317f..074459fd9a 100644 --- a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_multistep_workflow_with_reply.cs +++ b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_multistep_workflow_with_reply.cs @@ -1,101 +1,68 @@ -using System; +using System; using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.Workflows.TestDoubles; using Paramore.Brighter.Mediator; using Polly.Registry; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Core.Tests.Workflows; - -public class MediatorReplyMultiStepFlowTests +public class MediatorReplyMultiStepFlowTests { - private readonly ITestOutputHelper _testOutputHelper; private readonly Scheduler _scheduler; private readonly Runner _runner; private readonly Job _job; + private readonly WorkflowExecutionLog _executionLog = new(); private bool _stepCompletedOne; private bool _stepCompletedTwo; - - public MediatorReplyMultiStepFlowTests(ITestOutputHelper testOutputHelper) + public MediatorReplyMultiStepFlowTests() { - _testOutputHelper = testOutputHelper; var registry = new SubscriberRegistry(); registry.RegisterAsync(); registry.RegisterAsync(); - IAmACommandProcessor? commandProcessor = null; - var handlerFactory = new SimpleHandlerFactoryAsync((handlerType) => - handlerType switch - { - _ when handlerType == typeof(MyCommandHandlerAsync) => new MyCommandHandlerAsync(commandProcessor), - _ when handlerType == typeof(MyEventHandlerAsync) => new MyEventHandlerAsync(_scheduler), - _ => throw new InvalidOperationException($"The handler type {handlerType} is not supported") - }); - - commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); - - var workflowData= new WorkflowTestData(); + var handlerFactory = new SimpleHandlerFactoryAsync((handlerType) => handlerType switch + { + _ when handlerType == typeof(MyCommandHandlerAsync) => new MyCommandHandlerAsync(commandProcessor, _executionLog), + _ when handlerType == typeof(MyEventHandlerAsync) => new MyEventHandlerAsync(_scheduler, _executionLog), + _ => throw new InvalidOperationException($"The handler type {handlerType} is not supported")}); + commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); + var workflowData = new WorkflowTestData(); workflowData.Bag["MyValue"] = "Test"; - - _job = new Job(workflowData) ; - - var stepTwo = new Sequential( - "Test of Job SequenceStep Two", - new FireAndForgetAsync((data) => - new MyCommand { Value = (data.Bag["MyValue"] as string)! }), - () => { _stepCompletedTwo = true; }, - null); - - Sequential stepOne = new( - "Test of Job SequenceStep One", - new RequestAndReactionAsync( - (data) => new MyCommand { Value = (data.Bag["MyValue"] as string)! }, - (reply, data) => data.Bag["MyReply"] = ((MyEvent)reply).Value), - () => { _stepCompletedOne = true; }, - stepTwo); - - _job.InitSteps(stepOne); - + _job = new Job(workflowData); + var stepTwo = new Sequential("Test of Job SequenceStep Two", new FireAndForgetAsync((data) => new MyCommand { Value = (data.Bag["MyValue"] as string)! }), () => + { + _stepCompletedTwo = true; + }, null); + Sequential stepOne = new("Test of Job SequenceStep One", new RequestAndReactionAsync((data) => new MyCommand { Value = (data.Bag["MyValue"] as string)! }, (reply, data) => data.Bag["MyReply"] = ((MyEvent)reply).Value), () => + { + _stepCompletedOne = true; + }, stepTwo); + _job.InitSteps(stepOne); InMemoryStateStoreAsync store = new(); InMemoryJobChannel channel = new(); - - _scheduler = new Scheduler( - channel, - store - ); - + _scheduler = new Scheduler(channel, store); _runner = new Runner(channel, store, commandProcessor, _scheduler); } - - [Fact] + + [Test] public async Task When_running_a_workflow_with_reply() { - MyCommandHandlerAsync.ReceivedCommands.Clear(); - MyEventHandlerAsync.ReceivedEvents.Clear(); - await _scheduler.ScheduleAsync(_job); - var ct = new CancellationTokenSource(); - ct.CancelAfter( TimeSpan.FromSeconds(1) ); - + ct.CancelAfter(TimeSpan.FromSeconds(1)); try { _runner.RunAsync(ct.Token); } catch (Exception e) { - _testOutputHelper.WriteLine(e.ToString()); + Console.WriteLine(e.ToString()); } - - Assert.True(_stepCompletedOne); - Assert.True(_stepCompletedTwo); - Assert.Contains(MyCommandHandlerAsync.ReceivedCommands, c => c.Value == "Test"); - Assert.Contains(MyEventHandlerAsync.ReceivedEvents, e => e.Value == "Test"); - Assert.Equal(JobState.Done, _job.State); + await Assert.That(_stepCompletedOne).IsTrue(); + await Assert.That(_stepCompletedTwo).IsTrue(); + await Assert.That(_executionLog.Commands).Contains(c => c.Value == "Test"); + await Assert.That(_executionLog.Events).Contains(e => e.Value == "Test"); + await Assert.That(_job.State).IsEqualTo(JobState.Done); } } diff --git a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_passing_choice_workflow_step.cs b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_passing_choice_workflow_step.cs index 457119aca6..d8fb784142 100644 --- a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_passing_choice_workflow_step.cs +++ b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_passing_choice_workflow_step.cs @@ -1,109 +1,76 @@ -using System; +using System; using System.Linq; using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.Workflows.TestDoubles; using Paramore.Brighter.Mediator; using Polly.Registry; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Core.Tests.Workflows; - -public class MediatorPassingChoiceFlowTests +public class MediatorPassingChoiceFlowTests { - private readonly ITestOutputHelper _testOutputHelper; private readonly Scheduler _scheduler; private readonly Runner _runner; private readonly Job _job; + private readonly WorkflowExecutionLog _executionLog = new(); private bool _stepCompletedOne; private bool _stepCompletedTwo; private bool _stepCompletedThree; - - public MediatorPassingChoiceFlowTests(ITestOutputHelper testOutputHelper) + public MediatorPassingChoiceFlowTests() { - _testOutputHelper = testOutputHelper; // arrange var registry = new SubscriberRegistry(); registry.RegisterAsync(); registry.RegisterAsync(); - IAmACommandProcessor? commandProcessor = null; - var handlerFactory = new SimpleHandlerFactoryAsync((handlerType) => - handlerType switch - { - _ when handlerType == typeof(MyCommandHandlerAsync) => new MyCommandHandlerAsync(commandProcessor), - _ when handlerType == typeof(MyOtherCommandHandlerAsync) => new (commandProcessor), - _ => throw new InvalidOperationException($"The handler type {handlerType} is not supported") - }); - - commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); - - var workflowData= new WorkflowTestData(); + var handlerFactory = new SimpleHandlerFactoryAsync((handlerType) => handlerType switch + { + _ when handlerType == typeof(MyCommandHandlerAsync) => new MyCommandHandlerAsync(commandProcessor, _executionLog), + _ when handlerType == typeof(MyOtherCommandHandlerAsync) => new(commandProcessor, _executionLog), + _ => throw new InvalidOperationException($"The handler type {handlerType} is not supported")}); + commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); + var workflowData = new WorkflowTestData(); workflowData.Bag["MyValue"] = "Pass"; - - _job = new Job(workflowData) ; - - var stepThree = new Sequential( - "Test of Job SequenceStep Three", - new FireAndForgetAsync((data) => - new MyOtherCommand { Value = (data.Bag["MyValue"] as string)! }), - () => { _stepCompletedThree = true; }, - null); - - var stepTwo = new Sequential( - "Test of Job SequenceStep Two", - new FireAndForgetAsync((data) => - new MyCommand { Value = (data.Bag["MyValue"] as string)! }), - () => { _stepCompletedTwo = true; }, - null); - - var stepOne = new ExclusiveChoice( - "Test of Job SequenceStep One", - new Specification(x => x.Bag["MyValue"] as string == "Pass"), - () => { _stepCompletedOne = true; }, - stepTwo, - stepThree); - - _job.InitSteps(stepOne); - + _job = new Job(workflowData); + var stepThree = new Sequential("Test of Job SequenceStep Three", new FireAndForgetAsync((data) => new MyOtherCommand { Value = (data.Bag["MyValue"] as string)! }), () => + { + _stepCompletedThree = true; + }, null); + var stepTwo = new Sequential("Test of Job SequenceStep Two", new FireAndForgetAsync((data) => new MyCommand { Value = (data.Bag["MyValue"] as string)! }), () => + { + _stepCompletedTwo = true; + }, null); + var stepOne = new ExclusiveChoice("Test of Job SequenceStep One", new Specification(x => x.Bag["MyValue"] as string == "Pass"), () => + { + _stepCompletedOne = true; + }, stepTwo, stepThree); + _job.InitSteps(stepOne); InMemoryStateStoreAsync store = new(); InMemoryJobChannel channel = new(); - - _scheduler = new Scheduler( - channel, - store - ); - + _scheduler = new Scheduler(channel, store); _runner = new Runner(channel, store, commandProcessor, _scheduler); } - - [Fact] + + [Test] public async Task When_running_a_choice_workflow_step() { - MyCommandHandlerAsync.ReceivedCommands.Clear(); - MyOtherCommandHandlerAsync.ReceivedCommands.Clear(); - await _scheduler.ScheduleAsync(_job); - var ct = new CancellationTokenSource(); - ct.CancelAfter( TimeSpan.FromSeconds(1) ); - + ct.CancelAfter(TimeSpan.FromSeconds(1)); try { _runner.RunAsync(ct.Token); } catch (Exception e) { - _testOutputHelper.WriteLine(e.ToString()); + Console.WriteLine(e.ToString()); } - Assert.True(_stepCompletedOne); - Assert.True(_stepCompletedTwo); - Assert.False(_stepCompletedThree); - Assert.Contains(MyCommandHandlerAsync.ReceivedCommands, c => c.Value == "Pass"); - Assert.False(MyOtherCommandHandlerAsync.ReceivedCommands.Any()); - Assert.True(_stepCompletedOne); + + await Assert.That(_stepCompletedOne).IsTrue(); + await Assert.That(_stepCompletedTwo).IsTrue(); + await Assert.That(_stepCompletedThree).IsFalse(); + await Assert.That(_executionLog.Commands).Contains(c => c.Value == "Pass"); + await Assert.That(_executionLog.OtherCommands.Any()).IsFalse(); + await Assert.That(_stepCompletedOne).IsTrue(); } } diff --git a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_single_step_workflow.cs b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_single_step_workflow.cs index 56dc753f03..be04899f47 100644 --- a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_single_step_workflow.cs +++ b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_single_step_workflow.cs @@ -1,82 +1,56 @@ -using System; +using System; using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.Workflows.TestDoubles; using Paramore.Brighter.Mediator; using Polly.Registry; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Core.Tests.Workflows; - -public class MediatorOneStepFlowTests +public class MediatorOneStepFlowTests { - private readonly ITestOutputHelper _testOutputHelper; private readonly Scheduler _scheduler; private readonly Runner _runner; private readonly Job _job; + private readonly WorkflowExecutionLog _executionLog = new(); private bool _stepCompleted; - - public MediatorOneStepFlowTests(ITestOutputHelper testOutputHelper) + public MediatorOneStepFlowTests() { - _testOutputHelper = testOutputHelper; var registry = new SubscriberRegistry(); registry.RegisterAsync(); - CommandProcessor commandProcessor = null; - var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyCommandHandlerAsync(commandProcessor)); - - commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); - - var workflowData= new WorkflowTestData(); + var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyCommandHandlerAsync(commandProcessor, _executionLog)); + commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); + var workflowData = new WorkflowTestData(); workflowData.Bag["MyValue"] = "Test"; - - _job = new Job(workflowData) ; - - var firstStep = new Sequential( - "Test of Job", - new FireAndForgetAsync((data) => - new MyCommand { Value = (workflowData.Bag["MyValue"] as string)!}), - () => { _stepCompleted = true; }, - null - ); - + _job = new Job(workflowData); + var firstStep = new Sequential("Test of Job", new FireAndForgetAsync((data) => new MyCommand { Value = (workflowData.Bag["MyValue"] as string)! }), () => + { + _stepCompleted = true; + }, null); _job.InitSteps(firstStep); - InMemoryStateStoreAsync store = new(); InMemoryJobChannel channel = new(); - - _scheduler = new Scheduler( - channel, - store - ); - + _scheduler = new Scheduler(channel, store); _runner = new Runner(channel, store, commandProcessor, _scheduler); } - - [Fact] + + [Test] public async Task When_running_a_single_step_workflow() { - MyCommandHandlerAsync.ReceivedCommands.Clear(); - - await _scheduler.ScheduleAsync(_job); - + await _scheduler.ScheduleAsync(_job); var ct = new CancellationTokenSource(); - ct.CancelAfter( TimeSpan.FromSeconds(1) ); - + ct.CancelAfter(TimeSpan.FromSeconds(1)); try { _runner.RunAsync(ct.Token); } catch (Exception e) { - _testOutputHelper.WriteLine(e.ToString()); + Console.WriteLine(e.ToString()); } - - Assert.Contains(MyCommandHandlerAsync.ReceivedCommands, c => c.Value == "Test"); - Assert.Equal(JobState.Done, _job.State); - Assert.True(_stepCompleted); + + await Assert.That(_executionLog.Commands).Contains(c => c.Value == "Test"); + await Assert.That(_job.State).IsEqualTo(JobState.Done); + await Assert.That(_stepCompleted).IsTrue(); } } diff --git a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_two_step_workflow.cs b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_two_step_workflow.cs index 626022ac06..440dcc861f 100644 --- a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_two_step_workflow.cs +++ b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_two_step_workflow.cs @@ -1,90 +1,61 @@ -using System; +using System; using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.Workflows.TestDoubles; using Paramore.Brighter.Mediator; using Polly.Registry; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Core.Tests.Workflows; - -public class MediatorTwoStepFlowTests +public class MediatorTwoStepFlowTests { - private readonly ITestOutputHelper _testOutputHelper; private readonly Scheduler _scheduler; private readonly Runner _runner; private readonly Job _job; + private readonly WorkflowExecutionLog _executionLog = new(); private bool _stepsCompleted; - - public MediatorTwoStepFlowTests(ITestOutputHelper testOutputHelper) + public MediatorTwoStepFlowTests() { - _testOutputHelper = testOutputHelper; var registry = new SubscriberRegistry(); registry.RegisterAsync(); - CommandProcessor commandProcessor = null; - var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyCommandHandlerAsync(commandProcessor)); - - commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); - - var workflowData= new WorkflowTestData(); + var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyCommandHandlerAsync(commandProcessor, _executionLog)); + commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); + var workflowData = new WorkflowTestData(); workflowData.Bag["MyValue"] = "Test"; - - _job = new Job(workflowData) ; - - var secondStep = new Sequential( - "Test of Job Two", - new FireAndForgetAsync((data) => - new MyCommand { Value = (data.Bag["MyValue"] as string)! }), - () => { _stepsCompleted = true; }, - null - ); - - var firstStep = new Sequential( - "Test of Job One", - new FireAndForgetAsync((data) => - new MyCommand { Value = (data.Bag["MyValue"] as string)! }), - () => { workflowData.Bag["MyValue"] = "TestTwo"; }, - secondStep - ); - - _job.InitSteps(firstStep); - + _job = new Job(workflowData); + var secondStep = new Sequential("Test of Job Two", new FireAndForgetAsync((data) => new MyCommand { Value = (data.Bag["MyValue"] as string)! }), () => + { + _stepsCompleted = true; + }, null); + var firstStep = new Sequential("Test of Job One", new FireAndForgetAsync((data) => new MyCommand { Value = (data.Bag["MyValue"] as string)! }), () => + { + workflowData.Bag["MyValue"] = "TestTwo"; + }, secondStep); + _job.InitSteps(firstStep); InMemoryStateStoreAsync store = new(); InMemoryJobChannel channel = new(); - - _scheduler = new Scheduler( - channel, - store - ); - + _scheduler = new Scheduler(channel, store); _runner = new Runner(channel, store, commandProcessor, _scheduler); } - - [Fact] + + [Test] public async Task When_running_a_two_step_workflow() { - MyCommandHandlerAsync.ReceivedCommands.Clear(); await _scheduler.ScheduleAsync(_job); - var ct = new CancellationTokenSource(); - ct.CancelAfter( TimeSpan.FromSeconds(1) ); - + ct.CancelAfter(TimeSpan.FromSeconds(1)); try { _runner.RunAsync(ct.Token); } catch (Exception e) { - _testOutputHelper.WriteLine(e.ToString()); + Console.WriteLine(e.ToString()); } - - Assert.Contains(MyCommandHandlerAsync.ReceivedCommands, c => c.Value == "Test"); - Assert.Contains(MyCommandHandlerAsync.ReceivedCommands, c => c.Value == "TestTwo"); - Assert.Equal(JobState.Done, _job.State); - Assert.True(_stepsCompleted); + + await Assert.That(_executionLog.Commands).Contains(c => c.Value == "Test"); + await Assert.That(_executionLog.Commands).Contains(c => c.Value == "TestTwo"); + await Assert.That(_job.State).IsEqualTo(JobState.Done); + await Assert.That(_stepsCompleted).IsTrue(); } } diff --git a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_workflow_with_a_parallel_split.cs b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_workflow_with_a_parallel_split.cs index 23a79ac708..e722ef7210 100644 --- a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_workflow_with_a_parallel_split.cs +++ b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_workflow_with_a_parallel_split.cs @@ -1,103 +1,68 @@ -using System; +using System; using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.Workflows.TestDoubles; using Paramore.Brighter.Mediator; using Polly.Registry; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Core.Tests.Workflows; - -public class MediatorParallelSplitFlowTests +public class MediatorParallelSplitFlowTests { - private readonly ITestOutputHelper _testOutputHelper; private readonly Scheduler _scheduler; private readonly Runner _runner; private readonly Job _job; + private readonly WorkflowExecutionLog _executionLog = new(); private bool _firstBranchFinished; private bool _secondBranchFinished; - - public MediatorParallelSplitFlowTests(ITestOutputHelper testOutputHelper) + public MediatorParallelSplitFlowTests() { - _testOutputHelper = testOutputHelper; var registry = new SubscriberRegistry(); registry.RegisterAsync(); - CommandProcessor commandProcessor = null; - var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyCommandHandlerAsync(commandProcessor)); - - commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); - - var workflowData= new WorkflowTestData(); - - _job = new Job(workflowData) ; - - var parallelSplit = new ParallelSplit( - "Test of Job Parallel Split", - (data) => - { - data.Bag.TryAdd("MyValue", "Test"); - data.Bag.TryAdd("MyOtherValue", "TestTwo"); - - var secondBranch = new Sequential( - "Test of Job Two", - new FireAndForgetAsync((d) => - new MyCommand { Value = (d.Bag["MyOtherValue"] as string)! }), - () => { _secondBranchFinished = true; }, - null - ); - - var firstBranch = new Sequential( - "Test of Job One", - new FireAndForgetAsync((d) => - new MyCommand { Value = (d.Bag["MyValue"] as string)! }), - () => { _firstBranchFinished = true; }, - null - ); - - return [firstBranch, secondBranch]; - } - ); - + var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyCommandHandlerAsync(commandProcessor, _executionLog)); + commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); + var workflowData = new WorkflowTestData(); + _job = new Job(workflowData); + var parallelSplit = new ParallelSplit("Test of Job Parallel Split", (data) => + { + data.Bag.TryAdd("MyValue", "Test"); + data.Bag.TryAdd("MyOtherValue", "TestTwo"); + var secondBranch = new Sequential("Test of Job Two", new FireAndForgetAsync((d) => new MyCommand { Value = (d.Bag["MyOtherValue"] as string)! }), () => + { + _secondBranchFinished = true; + }, null); + var firstBranch = new Sequential("Test of Job One", new FireAndForgetAsync((d) => new MyCommand { Value = (d.Bag["MyValue"] as string)! }), () => + { + _firstBranchFinished = true; + }, null); + return[firstBranch, secondBranch]; + }); _job.InitSteps(parallelSplit); - InMemoryStateStoreAsync store = new(); InMemoryJobChannel channel = new(); - - _scheduler = new Scheduler( - channel, - store - ); - + _scheduler = new Scheduler(channel, store); _runner = new Runner(channel, store, commandProcessor, _scheduler); } - - [Fact] - public async Task When_running_a_workflow_with_a_parallel_split() + + [Test] + public async Task When_running_a_workflow_with_a_parallel_split() { - MyCommandHandlerAsync.ReceivedCommands.Clear(); - await _scheduler.ScheduleAsync(_job); - var ct = new CancellationTokenSource(); - ct.CancelAfter( TimeSpan.FromSeconds(3) ); - + ct.CancelAfter(TimeSpan.FromSeconds(3)); try { _runner.RunAsync(ct.Token); } catch (Exception e) { - _testOutputHelper.WriteLine(e.ToString()); + Console.WriteLine(e.ToString()); } - - Assert.Contains(MyCommandHandlerAsync.ReceivedCommands, c => c.Value == "Test"); - Assert.Contains(MyCommandHandlerAsync.ReceivedCommands, c => c.Value == "TestTwo"); - Assert.True(_firstBranchFinished); - Assert.True(_secondBranchFinished); - Assert.Equal(JobState.Done, _job.State); + + await Assert.That(_executionLog.Commands).Contains(c => c.Value == "Test"); + await Assert.That(_executionLog.Commands).Contains(c => c.Value == "TestTwo"); + await Assert.That(_firstBranchFinished).IsTrue(); + await Assert.That(_secondBranchFinished).IsTrue(); + await Assert.That(_job.State).IsEqualTo(JobState.Done); } } diff --git a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_workflow_with_reply.cs b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_workflow_with_reply.cs index adf0f8124d..2817eeb336 100644 --- a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_workflow_with_reply.cs +++ b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_workflow_with_reply.cs @@ -1,96 +1,69 @@ -using System; +using System; using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.Workflows.TestDoubles; using Paramore.Brighter.Mediator; using Polly.Registry; -using Xunit; -using Xunit.Abstractions; using MyCommand = Paramore.Brighter.Core.Tests.Workflows.TestDoubles.MyCommand; using MyCommandHandlerAsync = Paramore.Brighter.Core.Tests.Workflows.TestDoubles.MyCommandHandlerAsync; using MyEvent = Paramore.Brighter.Core.Tests.Workflows.TestDoubles.MyEvent; using MyEventHandlerAsync = Paramore.Brighter.Core.Tests.Workflows.TestDoubles.MyEventHandlerAsync; namespace Paramore.Brighter.Core.Tests.Workflows; - -public class MediatorReplyStepFlowTests +public class MediatorReplyStepFlowTests { - private readonly ITestOutputHelper _testOutputHelper; private readonly Scheduler _scheduler; private readonly Runner _runner; private readonly Job _job; + private readonly WorkflowExecutionLog _executionLog = new(); private bool _stepCompleted; - - public MediatorReplyStepFlowTests(ITestOutputHelper testOutputHelper) + public MediatorReplyStepFlowTests() { - _testOutputHelper = testOutputHelper; var registry = new SubscriberRegistry(); registry.RegisterAsync(); registry.RegisterAsync(); - IAmACommandProcessor? commandProcessor = null; - var handlerFactory = new SimpleHandlerFactoryAsync((handlerType) => - handlerType switch - { - _ when handlerType == typeof(MyCommandHandlerAsync) => new MyCommandHandlerAsync(commandProcessor), - _ when handlerType == typeof(MyEventHandlerAsync) => new MyEventHandlerAsync(_scheduler), - _ => throw new InvalidOperationException($"The handler type {handlerType} is not supported") - }); - - commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); - PipelineBuilder.ClearPipelineCache(); - - var workflowData= new WorkflowTestData(); + var handlerFactory = new SimpleHandlerFactoryAsync((handlerType) => handlerType switch + { + _ when handlerType == typeof(MyCommandHandlerAsync) => new MyCommandHandlerAsync(commandProcessor, _executionLog), + _ when handlerType == typeof(MyEventHandlerAsync) => new MyEventHandlerAsync(_scheduler, _executionLog), + _ => throw new InvalidOperationException($"The handler type {handlerType} is not supported")}); + commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); + var workflowData = new WorkflowTestData(); workflowData.Bag["MyValue"] = "Test"; - - _job = new Job(workflowData) ; - - var firstStep = new Sequential( - "Test of Job", - new RequestAndReactionAsync( - (data) => new MyCommand { Value = (data.Bag["MyValue"] as string)! }, - (reply,data) => { data.Bag["MyReply"] = reply!.Value; }), - () => { _stepCompleted = true; }, - null); - - _job.InitSteps(firstStep); - - InMemoryStateStoreAsync store = new(); - InMemoryJobChannel channel = new(); - - _scheduler = new Scheduler( - channel, - store - ); - - _runner = new Runner(channel, store, commandProcessor, _scheduler); + _job = new Job(workflowData); + var firstStep = new Sequential("Test of Job", new RequestAndReactionAsync((data) => new MyCommand { Value = (data.Bag["MyValue"] as string)! }, (reply, data) => + { + data.Bag["MyReply"] = reply!.Value; + }), () => + { + _stepCompleted = true; + }, null); + _job.InitSteps(firstStep); + InMemoryStateStoreAsync store = new(); + InMemoryJobChannel channel = new(); + _scheduler = new Scheduler(channel, store); + _runner = new Runner(channel, store, commandProcessor, _scheduler); } - - [Fact] + + [Test] public async Task When_running_a_workflow_with_reply() { - MyCommandHandlerAsync.ReceivedCommands.Clear(); - MyEventHandlerAsync.ReceivedEvents.Clear(); - await _scheduler.ScheduleAsync(_job); - var ct = new CancellationTokenSource(); - ct.CancelAfter( TimeSpan.FromSeconds(3) ); - + ct.CancelAfter(TimeSpan.FromSeconds(3)); try { _runner.RunAsync(ct.Token); } catch (Exception e) { - _testOutputHelper.WriteLine(e.ToString()); + Console.WriteLine(e.ToString()); } - Assert.True(_stepCompleted); - - Assert.Contains(MyCommandHandlerAsync.ReceivedCommands, c => c.Value == "Test"); - Assert.Contains(MyEventHandlerAsync.ReceivedEvents, e => e.Value == "Test"); - Assert.Equal(JobState.Done, _job.State); + await Assert.That(_stepCompleted).IsTrue(); + await Assert.That(_executionLog.Commands).Contains(c => c.Value == "Test"); + await Assert.That(_executionLog.Events).Contains(e => e.Value == "Test"); + await Assert.That(_job.State).IsEqualTo(JobState.Done); } } diff --git a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_workflow_with_robust_reply_nofault.cs b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_workflow_with_robust_reply_nofault.cs index 6865ae3e64..73052f3d00 100644 --- a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_workflow_with_robust_reply_nofault.cs +++ b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_workflow_with_robust_reply_nofault.cs @@ -1,102 +1,76 @@ -using System; +using System; using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.Workflows.TestDoubles; using Paramore.Brighter.Mediator; using Polly.Registry; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Core.Tests.Workflows; - -public class MediatorRobustReplyNoFaultStepFlowTests +public class MediatorRobustReplyNoFaultStepFlowTests { - private readonly ITestOutputHelper _testOutputHelper; private readonly Scheduler _scheduler; private readonly Runner _runner; private readonly Job _job; + private readonly WorkflowExecutionLog _executionLog = new(); private bool _stepCompleted; private bool _stepFaulted; - - public MediatorRobustReplyNoFaultStepFlowTests(ITestOutputHelper testOutputHelper) + public MediatorRobustReplyNoFaultStepFlowTests() { - _testOutputHelper = testOutputHelper; var registry = new SubscriberRegistry(); registry.RegisterAsync(); registry.RegisterAsync(); - IAmACommandProcessor commandProcessor = null; - var handlerFactory = new SimpleHandlerFactoryAsync((handlerType) => - handlerType switch - { - _ when handlerType == typeof(MyCommandHandlerAsync) => new MyCommandHandlerAsync(commandProcessor), - _ when handlerType == typeof(MyEventHandlerAsync) => new MyEventHandlerAsync(_scheduler), - _ => throw new InvalidOperationException($"The handler type {handlerType} is not supported") - }); - - commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); - - PipelineBuilder.ClearPipelineCache(); - - var workflowData= new WorkflowTestData(); + var handlerFactory = new SimpleHandlerFactoryAsync((handlerType) => handlerType switch + { + _ when handlerType == typeof(MyCommandHandlerAsync) => new MyCommandHandlerAsync(commandProcessor, _executionLog), + _ when handlerType == typeof(MyEventHandlerAsync) => new MyEventHandlerAsync(_scheduler, _executionLog), + _ => throw new InvalidOperationException($"The handler type {handlerType} is not supported")}); + commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); + var workflowData = new WorkflowTestData(); workflowData.Bag["MyValue"] = "Test"; - - _job = new Job(workflowData) ; - - var firstStep = new Sequential( - "Test of Job", - new RobustRequestAndReactionAsync( - (data) => new MyCommand { Value = (data.Bag["MyValue"] as string)! }, - (reply, data) => { data.Bag["MyReply"] = ((MyEvent)reply).Value; }, - (fault, data) => { data.Bag["MyFault"] = ((MyFault)fault).Value; }), - () => { _stepCompleted = true; }, - null, - () => { _stepFaulted = true; }, - null); - - _job.InitSteps(firstStep); - - InMemoryStateStoreAsync store = new(); - InMemoryJobChannel channel = new(); - - _scheduler = new Scheduler( - channel, - store - ); - - _runner = new Runner(channel, store, commandProcessor, _scheduler); + _job = new Job(workflowData); + var firstStep = new Sequential("Test of Job", new RobustRequestAndReactionAsync((data) => new MyCommand { Value = (data.Bag["MyValue"] as string)! }, (reply, data) => + { + data.Bag["MyReply"] = ((MyEvent)reply).Value; + }, (fault, data) => + { + data.Bag["MyFault"] = ((MyFault)fault).Value; + }), () => + { + _stepCompleted = true; + }, null, () => + { + _stepFaulted = true; + }, null); + _job.InitSteps(firstStep); + InMemoryStateStoreAsync store = new(); + InMemoryJobChannel channel = new(); + _scheduler = new Scheduler(channel, store); + _runner = new Runner(channel, store, commandProcessor, _scheduler); } - - [Fact] + + [Test] public async Task When_running_a_workflow_with_reply() { - MyCommandHandlerAsync.ReceivedCommands.Clear(); - MyEventHandlerAsync.ReceivedEvents.Clear(); - MyFaultHandlerAsync.ReceivedFaults.Clear(); - await _scheduler.ScheduleAsync(_job); - - var ct = new CancellationTokenSource(); - ct.CancelAfter( TimeSpan.FromSeconds(1) ); - + ct.CancelAfter(TimeSpan.FromSeconds(1)); try { _runner.RunAsync(ct.Token); } catch (Exception e) { - _testOutputHelper.WriteLine(e.ToString()); + Console.WriteLine(e.ToString()); } - - Assert.Contains(MyCommandHandlerAsync.ReceivedCommands, c => c.Value == "Test"); - Assert.Contains(MyEventHandlerAsync.ReceivedEvents, e => e.Value == "Test"); - Assert.Empty(MyFaultHandlerAsync.ReceivedFaults); - Assert.Equal("Test", _job.Data.Bag["MyValue"]); - Assert.Equal("Test", _job.Data.Bag["MyReply"]); - Assert.Equal(JobState.Done, _job.State); - Assert.True(_stepCompleted); - Assert.False(_stepFaulted); + + await Assert.That(_executionLog.Commands).Contains(c => c.Value == "Test"); + await Assert.That(_executionLog.Events).Contains(e => e.Value == "Test"); + await Assert.That(_executionLog.Faults).IsEmpty(); + await Assert.That(_job.Data.Bag["MyValue"]).IsEqualTo("Test"); + await Assert.That(_job.Data.Bag["MyReply"]).IsEqualTo("Test"); + await Assert.That(_job.State).IsEqualTo(JobState.Done); + await Assert.That(_stepCompleted).IsTrue(); + await Assert.That(_stepFaulted).IsFalse(); } } diff --git a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_workflow_with_robust_reply_with_fault.cs b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_workflow_with_robust_reply_with_fault.cs index 11b7da28dc..48969cdbfb 100644 --- a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_workflow_with_robust_reply_with_fault.cs +++ b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_a_workflow_with_robust_reply_with_fault.cs @@ -1,104 +1,78 @@ -using System; +using System; using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.Workflows.TestDoubles; using Paramore.Brighter.Mediator; using Polly.Registry; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Core.Tests.Workflows; - -public class MediatorRobustReplyFaultStepFlowTests +public class MediatorRobustReplyFaultStepFlowTests { - private readonly ITestOutputHelper _testOutputHelper; private readonly Scheduler _scheduler; private readonly Runner _runner; private readonly Job _job; + private readonly WorkflowExecutionLog _executionLog = new(); private bool _stepCompleted; private bool _stepFaulted; - - public MediatorRobustReplyFaultStepFlowTests(ITestOutputHelper testOutputHelper) + public MediatorRobustReplyFaultStepFlowTests() { - _testOutputHelper = testOutputHelper; var registry = new SubscriberRegistry(); registry.RegisterAsync(); registry.RegisterAsync(); registry.RegisterAsync(); - IAmACommandProcessor commandProcessor = null; - var handlerFactory = new SimpleHandlerFactoryAsync((handlerType) => - handlerType switch - { - _ when handlerType == typeof(MyCommandHandlerAsync) => new MyCommandHandlerAsync(commandProcessor, raiseFault: true), - _ when handlerType == typeof(MyEventHandlerAsync) => new MyEventHandlerAsync(_scheduler), - _ when handlerType == typeof(MyFaultHandlerAsync) => new MyFaultHandlerAsync(_scheduler), - _ => throw new InvalidOperationException($"The handler type {handlerType} is not supported") - }); - - commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); - - PipelineBuilder.ClearPipelineCache(); - - var workflowData= new WorkflowTestData(); + var handlerFactory = new SimpleHandlerFactoryAsync((handlerType) => handlerType switch + { + _ when handlerType == typeof(MyCommandHandlerAsync) => new MyCommandHandlerAsync(commandProcessor, _executionLog, raiseFault: true), + _ when handlerType == typeof(MyEventHandlerAsync) => new MyEventHandlerAsync(_scheduler, _executionLog), + _ when handlerType == typeof(MyFaultHandlerAsync) => new MyFaultHandlerAsync(_scheduler, _executionLog), + _ => throw new InvalidOperationException($"The handler type {handlerType} is not supported")}); + commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); + var workflowData = new WorkflowTestData(); workflowData.Bag["MyValue"] = "Test"; - - _job = new Job(workflowData) ; - - var firstStep = new Sequential( - "Test of Job", - new RobustRequestAndReactionAsync( - (data) => new MyCommand { Value = (data.Bag["MyValue"] as string)! }, - (reply, data) => { data.Bag["MyReply"] = reply!.Value; }, - (fault, data) => { data.Bag["MyFault"] = fault!.Value; }), - () => { _stepCompleted = true; }, - null, - () => { _stepFaulted = true; }, - null); - - _job.InitSteps(firstStep); - - InMemoryStateStoreAsync store = new(); - InMemoryJobChannel channel = new(); - - _scheduler = new Scheduler( - channel, - store - ); - - _runner = new Runner(channel, store, commandProcessor, _scheduler); + _job = new Job(workflowData); + var firstStep = new Sequential("Test of Job", new RobustRequestAndReactionAsync((data) => new MyCommand { Value = (data.Bag["MyValue"] as string)! }, (reply, data) => + { + data.Bag["MyReply"] = reply!.Value; + }, (fault, data) => + { + data.Bag["MyFault"] = fault!.Value; + }), () => + { + _stepCompleted = true; + }, null, () => + { + _stepFaulted = true; + }, null); + _job.InitSteps(firstStep); + InMemoryStateStoreAsync store = new(); + InMemoryJobChannel channel = new(); + _scheduler = new Scheduler(channel, store); + _runner = new Runner(channel, store, commandProcessor, _scheduler); } - - [Fact] + + [Test] public async Task When_running_a_workflow_with_reply() { - MyCommandHandlerAsync.ReceivedCommands.Clear(); - MyEventHandlerAsync.ReceivedEvents.Clear(); - MyFaultHandlerAsync.ReceivedFaults.Clear(); - await _scheduler.ScheduleAsync(_job); - - var ct = new CancellationTokenSource(); - ct.CancelAfter( TimeSpan.FromSeconds(1) ); - + ct.CancelAfter(TimeSpan.FromSeconds(1)); try { _runner.RunAsync(ct.Token); } catch (Exception e) { - _testOutputHelper.WriteLine(e.ToString()); + Console.WriteLine(e.ToString()); } - - Assert.Contains(MyCommandHandlerAsync.ReceivedCommands, c => c.Value == "Test"); - Assert.Contains(MyFaultHandlerAsync.ReceivedFaults, e => e.Value == "Test"); - Assert.Empty(MyEventHandlerAsync.ReceivedEvents); - Assert.Equal("Test", _job.Data.Bag["MyValue"]); - Assert.Equal("Test", _job.Data.Bag["MyFault"]); - Assert.Equal(JobState.Done, _job.State); - Assert.True(_stepCompleted); - Assert.False(_stepFaulted); + + await Assert.That(_executionLog.Commands).Contains(c => c.Value == "Test"); + await Assert.That(_executionLog.Faults).Contains(e => e.Value == "Test"); + await Assert.That(_executionLog.Events).IsEmpty(); + await Assert.That(_job.Data.Bag["MyValue"]).IsEqualTo("Test"); + await Assert.That(_job.Data.Bag["MyFault"]).IsEqualTo("Test"); + await Assert.That(_job.State).IsEqualTo(JobState.Done); + await Assert.That(_stepCompleted).IsTrue(); + await Assert.That(_stepFaulted).IsFalse(); } } diff --git a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_multiple_workflows.cs b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_multiple_workflows.cs index 7068e8c85c..8c7ed62cd4 100644 --- a/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_multiple_workflows.cs +++ b/tests/Paramore.Brighter.Core.Tests/Workflows/When_running_multiple_workflows.cs @@ -1,101 +1,74 @@ -using System; +using System; using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.Core.Tests.Workflows.TestDoubles; using Paramore.Brighter.Mediator; using Polly.Registry; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Core.Tests.Workflows; - -public class MediatorMultipleWorkflowFlowTests +public class MediatorMultipleWorkflowFlowTests { - private readonly ITestOutputHelper _testOutputHelper; private readonly Scheduler _scheduler; private readonly Runner _runner; private readonly Job _firstJob; private readonly Job _secondJob; + private readonly WorkflowExecutionLog _executionLog = new(); private bool _jobOneCompleted; private bool _jobTwoCompleted; - - public MediatorMultipleWorkflowFlowTests(ITestOutputHelper testOutputHelper) + public MediatorMultipleWorkflowFlowTests() { - _testOutputHelper = testOutputHelper; var registry = new SubscriberRegistry(); registry.RegisterAsync(); - CommandProcessor? commandProcessor = null; - var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyCommandHandlerAsync(commandProcessor)); - - commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), - new PolicyRegistry(), new ResiliencePipelineRegistry(),new InMemorySchedulerFactory()); - - PipelineBuilder.ClearPipelineCache(); - - var firstWorkflowData= new WorkflowTestData { Bag = { ["MyValue"] = "Test" } }; - - _firstJob = new Job(firstWorkflowData) ; - - var firstStep = new Sequential( - "Test of Job", - new FireAndForgetAsync((data) => - new MyCommand { Value = (data.Bag["MyValue"] as string)!}), - () => { _jobOneCompleted = true; }, - null - ); - + var handlerFactory = new SimpleHandlerFactoryAsync(_ => new MyCommandHandlerAsync(commandProcessor, _executionLog)); + commandProcessor = new CommandProcessor(registry, handlerFactory, new InMemoryRequestContextFactory(), new PolicyRegistry(), new ResiliencePipelineRegistry(), new InMemorySchedulerFactory()); + var firstWorkflowData = new WorkflowTestData + { + Bag = + { + ["MyValue"] = "Test" + } + }; + _firstJob = new Job(firstWorkflowData); + var firstStep = new Sequential("Test of Job", new FireAndForgetAsync((data) => new MyCommand { Value = (data.Bag["MyValue"] as string)! }), () => + { + _jobOneCompleted = true; + }, null); _firstJob.InitSteps(firstStep); - var secondWorkflowData = new WorkflowTestData(); secondWorkflowData.Bag["MyValue"] = "TestTwo"; _secondJob = new Job(secondWorkflowData); - - var secondStep = new Sequential( - "Second Test of Job", - new FireAndForgetAsync((data) => - new MyCommand { Value = (data.Bag["MyValue"] as string)! }), - () => { _jobTwoCompleted = true; }, - null - ); - + var secondStep = new Sequential("Second Test of Job", new FireAndForgetAsync((data) => new MyCommand { Value = (data.Bag["MyValue"] as string)! }), () => + { + _jobTwoCompleted = true; + }, null); _secondJob.InitSteps(secondStep); - InMemoryStateStoreAsync store = new(); InMemoryJobChannel channel = new(); - - _scheduler = new Scheduler( - channel, - store - ); - + _scheduler = new Scheduler(channel, store); _runner = new Runner(channel, store, commandProcessor, _scheduler); } - - [Fact] + + [Test] public async Task When_running_a_single_step_workflow() { - MyCommandHandlerAsync.ReceivedCommands.Clear(); - - await _scheduler.ScheduleAsync([_firstJob, _secondJob]); - + await _scheduler.ScheduleAsync([_firstJob, _secondJob]); var ct = new CancellationTokenSource(); - ct.CancelAfter( TimeSpan.FromSeconds(120) ); - + ct.CancelAfter(TimeSpan.FromSeconds(120)); try { _runner.RunAsync(ct.Token); } catch (Exception e) { - _testOutputHelper.WriteLine(e.ToString()); + Console.WriteLine(e.ToString()); } - - Assert.Contains(MyCommandHandlerAsync.ReceivedCommands, c => c.Value == "Test"); - Assert.Contains(MyCommandHandlerAsync.ReceivedCommands, c => c.Value == "TestTwo"); - Assert.Equal(JobState.Done, _firstJob.State); - Assert.Equal(JobState.Done, _secondJob.State); - Assert.True(_jobOneCompleted); - Assert.True(_jobTwoCompleted); + + await Assert.That(_executionLog.Commands).Contains(c => c.Value == "Test"); + await Assert.That(_executionLog.Commands).Contains(c => c.Value == "TestTwo"); + await Assert.That(_firstJob.State).IsEqualTo(JobState.Done); + await Assert.That(_secondJob.State).IsEqualTo(JobState.Done); + await Assert.That(_jobOneCompleted).IsTrue(); + await Assert.That(_jobTwoCompleted).IsTrue(); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Building_A_Table_Omit_Non_Key_Schema_Attributes.cs b/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Building_A_Table_Omit_Non_Key_Schema_Attributes.cs index 735790e8a5..87f7e9bbf6 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Building_A_Table_Omit_Non_Key_Schema_Attributes.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Building_A_Table_Omit_Non_Key_Schema_Attributes.cs @@ -5,14 +5,13 @@ using Amazon.Runtime; using Paramore.Brighter.DynamoDb; using Paramore.Brighter.Outbox.DynamoDB; -using Xunit; namespace Paramore.Brighter.DynamoDB.Tests.DynamoDbExtensions { public class DynamoDbDropNonKeyAttributesForCreationTests { - [Fact] - public void When_Building_A_Table_Omit_Non_Key_Schema_Attributes() + [Test] + public async Task When_Building_A_Table_Omit_Non_Key_Schema_Attributes() { var tableRequestFactory = new DynamoDbTableFactory(); var builder = new DynamoDbTableBuilder(CreateClient()); @@ -34,14 +33,14 @@ public void When_Building_A_Table_Omit_Non_Key_Schema_Attributes() var modifiedTableRequest = builder.RemoveNonSchemaAttributes(tableRequest); //assert - Assert.DoesNotContain(modifiedTableRequest.AttributeDefinitions, attr => attr.AttributeName == "StringProperty" && attr.AttributeType == ScalarAttributeType.S); - Assert.DoesNotContain(modifiedTableRequest.AttributeDefinitions, attr => attr.AttributeName == "NumberProperty" && attr.AttributeType == ScalarAttributeType.N); - Assert.DoesNotContain(modifiedTableRequest.AttributeDefinitions, attr => attr.AttributeName == "ByteArrayProperty" && attr.AttributeType == ScalarAttributeType.B); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "Id" && attr.AttributeType == ScalarAttributeType.S); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "RangeKey" && attr.AttributeType == ScalarAttributeType.S); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "GlobalSecondaryId" && attr.AttributeType == ScalarAttributeType.S); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "GlobalSecondaryRangeKey" && attr.AttributeType == ScalarAttributeType.S); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "LocalSecondaryRangeKey" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(modifiedTableRequest.AttributeDefinitions).DoesNotContain(attr => attr.AttributeName == "StringProperty" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(modifiedTableRequest.AttributeDefinitions).DoesNotContain(attr => attr.AttributeName == "NumberProperty" && attr.AttributeType == ScalarAttributeType.N); + await Assert.That(modifiedTableRequest.AttributeDefinitions).DoesNotContain(attr => attr.AttributeName == "ByteArrayProperty" && attr.AttributeType == ScalarAttributeType.B); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "Id" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "RangeKey" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "GlobalSecondaryId" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "GlobalSecondaryRangeKey" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "LocalSecondaryRangeKey" && attr.AttributeType == ScalarAttributeType.S); } private AmazonDynamoDBClient CreateClient() diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_From_A_Class_Missing_A_Hash_Key.cs b/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_From_A_Class_Missing_A_Hash_Key.cs index acc95fefb3..81a7faf2a0 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_From_A_Class_Missing_A_Hash_Key.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_From_A_Class_Missing_A_Hash_Key.cs @@ -2,21 +2,21 @@ using Amazon.DynamoDBv2.DataModel; using Paramore.Brighter.DynamoDb; using Paramore.Brighter.Outbox.DynamoDB; -using Xunit; namespace Paramore.Brighter.DynamoDB.Tests.DynamoDbExtensions { public class DynanmoDbMissingHashKeyTests { - [Fact] - public void When_Creating_A_Table_From_A_Class_Missing_A_Hash_Key() + [Test] + public Task When_Creating_A_Table_From_A_Class_Missing_A_Hash_Key() { //arrange, act, assert - Assert.Throws(() => + Assert.ThrowsExactly(() => { var tableRequestFactory = new DynamoDbTableFactory(); tableRequestFactory.GenerateCreateTableRequest(new DynamoDbCreateProvisionedThroughput()); }); + return Task.CompletedTask; } [DynamoDBTable("DnyamoDbEntity")] diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_From_A_Class_Missing_Table_Attribute.cs b/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_From_A_Class_Missing_Table_Attribute.cs index 03d288a9d5..c758cd3600 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_From_A_Class_Missing_Table_Attribute.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_From_A_Class_Missing_Table_Attribute.cs @@ -1,21 +1,21 @@ using System; using Paramore.Brighter.DynamoDb; using Paramore.Brighter.Outbox.DynamoDB; -using Xunit; namespace Paramore.Brighter.DynamoDB.Tests.DynamoDbExtensions { public class DynamoDbFactoryMissingTableAttributeTests { - [Fact] - public void When_Creating_A_Table_From_A_Class_Missing_Table_Attribute() + [Test] + public Task When_Creating_A_Table_From_A_Class_Missing_Table_Attribute() { //arrange, act, assert - Assert.Throws(() => + Assert.ThrowsExactly(() => { var tableRequestFactory = new DynamoDbTableFactory(); tableRequestFactory.GenerateCreateTableRequest(new DynamoDbCreateProvisionedThroughput()); }); + return Task.CompletedTask; } private sealed class DynamoDbEntity; diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_From_An_Attributed_Class.cs b/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_From_An_Attributed_Class.cs index 89f27725e4..32fcd6e34a 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_From_An_Attributed_Class.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_From_An_Attributed_Class.cs @@ -5,14 +5,13 @@ using Amazon.DynamoDBv2.Model; using Paramore.Brighter.DynamoDb; using Paramore.Brighter.Outbox.DynamoDB; -using Xunit; namespace Paramore.Brighter.DynamoDB.Tests.DynamoDbExtensions { public class DynamboDbFactoryGenerateCreateRequestTests { - [Fact] - public void When_Creating_A_Table_From_An_Attributed_Class() + [Test] + public async Task When_Creating_A_Table_From_An_Attributed_Class() { //arrange var tableRequestFactory = new DynamoDbTableFactory(); @@ -32,19 +31,19 @@ public void When_Creating_A_Table_From_An_Attributed_Class() ); //assert - Assert.Equal("MyEntity", tableRequest.TableName); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "StringProperty" && attr.AttributeType == ScalarAttributeType.S); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "NumberProperty" && attr.AttributeType == ScalarAttributeType.N); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "ByteArrayProperty" && attr.AttributeType == ScalarAttributeType.B); - Assert.DoesNotContain(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "UnmarkedProperty"); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "MappedName" && attr.AttributeType == ScalarAttributeType.S); - Assert.DoesNotContain(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "IgnoredProperty"); - Assert.Contains(tableRequest.KeySchema, kse => kse.AttributeName == "Id" && kse.KeyType == KeyType.HASH); - Assert.Contains(tableRequest.GlobalSecondaryIndexes, + await Assert.That(tableRequest.TableName).IsEqualTo("MyEntity"); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "StringProperty" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "NumberProperty" && attr.AttributeType == ScalarAttributeType.N); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "ByteArrayProperty" && attr.AttributeType == ScalarAttributeType.B); + await Assert.That(tableRequest.AttributeDefinitions).DoesNotContain(attr => attr.AttributeName == "UnmarkedProperty"); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "MappedName" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(tableRequest.AttributeDefinitions).DoesNotContain(attr => attr.AttributeName == "IgnoredProperty"); + await Assert.That(tableRequest.KeySchema).Contains(kse => kse.AttributeName == "Id" && kse.KeyType == KeyType.HASH); + await Assert.That(tableRequest.GlobalSecondaryIndexes).Contains( gsi => gsi.IndexName == "GlobalSecondaryIndex" && Enumerable.Any(gsi.KeySchema, kse => kse.AttributeName == "GlobalSecondaryId" && kse.KeyType == KeyType.HASH) && Enumerable.Any(gsi.KeySchema, kse => kse.AttributeName == "GlobalSecondaryRangeKey" && kse.KeyType == KeyType.RANGE)); - Assert.Contains(tableRequest.LocalSecondaryIndexes, lsi => lsi.IndexName == "LocalSecondaryIndex" + await Assert.That(tableRequest.LocalSecondaryIndexes).Contains(lsi => lsi.IndexName == "LocalSecondaryIndex" && Enumerable.Any(lsi.KeySchema, kse => kse.AttributeName == "LocalSecondaryRangeKey" && kse.KeyType == KeyType.RANGE)); } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Admin_Attributes.cs b/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Admin_Attributes.cs index 0315dd2a3b..7a9d68175f 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Admin_Attributes.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Admin_Attributes.cs @@ -4,14 +4,13 @@ using Amazon.DynamoDBv2.Model; using Paramore.Brighter.DynamoDb; using Paramore.Brighter.Outbox.DynamoDB; -using Xunit; namespace Paramore.Brighter.DynamoDB.Tests.DynamoDbExtensions { public class DynamoDbFactoryOtherTableAttributesTests { - [Fact] - public void When_Creating_A_Table_With_Admin_Attributes() + [Test] + public async Task When_Creating_A_Table_With_Admin_Attributes() { //arrange var tableRequestFactory = new DynamoDbTableFactory(); @@ -25,11 +24,11 @@ public void When_Creating_A_Table_With_Admin_Attributes() tags: new List {new Tag{Key="beta", Value = "True"}, new Tag{Key="paramore", Value = "Brighter"}}); //assert - Assert.Equal(BillingMode.PAY_PER_REQUEST, tableRequest.BillingMode); - Assert.False(tableRequest.SSESpecification.Enabled); - Assert.False(tableRequest.SSESpecification.Enabled); - Assert.Contains(tableRequest.Tags, tag => tag.Key == "beta" && tag.Value == "True"); - Assert.Contains(tableRequest.Tags, tag => tag.Key == "paramore" && tag.Value == "Brighter"); + await Assert.That(tableRequest.BillingMode).IsEqualTo(BillingMode.PAY_PER_REQUEST); + await Assert.That(tableRequest.SSESpecification.Enabled).IsFalse(); + await Assert.That(tableRequest.SSESpecification.Enabled).IsFalse(); + await Assert.That(tableRequest.Tags).Contains(tag => tag.Key == "beta" && tag.Value == "True"); + await Assert.That(tableRequest.Tags).Contains(tag => tag.Key == "paramore" && tag.Value == "Brighter"); } [DynamoDBTable("MyEntity")] diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Collection_Properties.cs b/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Collection_Properties.cs index 782f4a1e60..8da7eb7a22 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Collection_Properties.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Collection_Properties.cs @@ -4,14 +4,13 @@ using Amazon.DynamoDBv2.Model; using Paramore.Brighter.DynamoDb; using Paramore.Brighter.Outbox.DynamoDB; -using Xunit; namespace Paramore.Brighter.DynamoDB.Tests.DynamoDbExtensions { public class DynamoDbCollectionProperties { - [Fact] - public void When_Creating_A_Table_With_Collection_Properties() + [Test] + public async Task When_Creating_A_Table_With_Collection_Properties() { //arrange var tableRequestFactory = new DynamoDbTableFactory(); @@ -25,12 +24,12 @@ public void When_Creating_A_Table_With_Collection_Properties() ); //assert - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "Id" && attr.AttributeType == ScalarAttributeType.S); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "StringArray" && attr.AttributeType.Value == "SS"); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "IntArray" && attr.AttributeType.Value == "NS"); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "DoubleArray" && attr.AttributeType.Value == "NS"); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "GenericList" && attr.AttributeType.Value == "L"); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "GenericMap" && attr.AttributeType.Value == "M"); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "Id" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "StringArray" && attr.AttributeType.Value == "SS"); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "IntArray" && attr.AttributeType.Value == "NS"); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "DoubleArray" && attr.AttributeType.Value == "NS"); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "GenericList" && attr.AttributeType.Value == "L"); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "GenericMap" && attr.AttributeType.Value == "M"); } [DynamoDBTable("MyEntity")] diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Custom_Properties.cs b/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Custom_Properties.cs index 79646fc01e..7e034847e9 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Custom_Properties.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Custom_Properties.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Text.Json; using Amazon.DynamoDBv2; @@ -8,14 +8,13 @@ using Paramore.Brighter.DynamoDb; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Outbox.DynamoDB; -using Xunit; namespace Paramore.Brighter.DynamoDB.Tests.DynamoDbExtensions { public class DynamoDbCustomProperties { - [Fact] - public void When_Creating_A_Table_With_Custom_Properties() + [Test] + public async Task When_Creating_A_Table_With_Custom_Properties() { //arrange var tableRequestFactory = new DynamoDbTableFactory(); @@ -36,8 +35,8 @@ public void When_Creating_A_Table_With_Custom_Properties() ); //assert - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "Id" && attr.AttributeType == ScalarAttributeType.S); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "Amount" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "Id" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "Amount" && attr.AttributeType == ScalarAttributeType.S); } [DynamoDBTable("MyEntity")] diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Multple_GSI_Indexes_Per_Field.cs b/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Multple_GSI_Indexes_Per_Field.cs index 29e74556a2..d7afbb3bec 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Multple_GSI_Indexes_Per_Field.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Multple_GSI_Indexes_Per_Field.cs @@ -5,14 +5,13 @@ using Amazon.DynamoDBv2.Model; using Paramore.Brighter.DynamoDb; using Paramore.Brighter.Outbox.DynamoDB; -using Xunit; namespace Paramore.Brighter.DynamoDB.Tests.DynamoDbExtensions { public class DynamboDbFactoryMultipleGSIIndexesTests { - [Fact] - public void When_Creating_A_Table_With_Multiple_GSI_Inxdexes_Per_Field() + [Test] + public async Task When_Creating_A_Table_With_Multiple_GSI_Inxdexes_Per_Field() { //arrange var tableRequestFactory = new DynamoDbTableFactory(); @@ -32,12 +31,12 @@ public void When_Creating_A_Table_With_Multiple_GSI_Inxdexes_Per_Field() ); //assert - Assert.Equal("MyEntity", tableRequest.TableName); - Assert.Contains(tableRequest.GlobalSecondaryIndexes, + await Assert.That(tableRequest.TableName).IsEqualTo("MyEntity"); + await Assert.That(tableRequest.GlobalSecondaryIndexes).Contains( gsi => gsi.IndexName == "GlobalSecondaryIndex" && Enumerable.Any(gsi.KeySchema, kse => kse.AttributeName == "GlobalSecondaryId" && kse.KeyType == KeyType.HASH) && Enumerable.Any(gsi.KeySchema, kse => kse.AttributeName == "GlobalSecondaryRangeKey" && kse.KeyType == KeyType.RANGE)); - Assert.Contains(tableRequest.GlobalSecondaryIndexes, + await Assert.That(tableRequest.GlobalSecondaryIndexes).Contains( gsi => gsi.IndexName == "AnotherGlobalSecondaryIndex" && Enumerable.Any(gsi.KeySchema, kse => kse.AttributeName == "GlobalSecondaryId" && kse.KeyType == KeyType.HASH) && Enumerable.Any(gsi.KeySchema, kse => kse.AttributeName == "GlobalSecondaryRangeKey" && kse.KeyType == KeyType.RANGE)); diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Projections.cs b/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Projections.cs index ecf6bd2c36..918ee0c7a3 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Projections.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Projections.cs @@ -5,14 +5,13 @@ using Amazon.DynamoDBv2.Model; using Paramore.Brighter.DynamoDb; using Paramore.Brighter.Outbox.DynamoDB; -using Xunit; namespace Paramore.Brighter.DynamoDB.Tests.DynamoDbExtensions { public class DynamoDbFactoryProjectionsTests { - [Fact] - public void When_Creating_A_Table_With_Projections() + [Test] + public async Task When_Creating_A_Table_With_Projections() { var tableRequestFactory = new DynamoDbTableFactory(); var gsiProjection = new DynamoGSIProjections @@ -38,10 +37,8 @@ public void When_Creating_A_Table_With_Projections() ); //assert - Assert.Equal(ProjectionType.KEYS_ONLY, tableRequest.GlobalSecondaryIndexes.First(gsi => gsi.IndexName == "GlobalSecondaryIndex").Projection.ProjectionType); - Assert.Equal( - new List{"Id", "Version"}, - tableRequest.GlobalSecondaryIndexes.First(gsi => gsi.IndexName == "GlobalSecondaryIndex").Projection.NonKeyAttributes); + await Assert.That(tableRequest.GlobalSecondaryIndexes.First(gsi => gsi.IndexName == "GlobalSecondaryIndex").Projection.ProjectionType).IsEqualTo(ProjectionType.KEYS_ONLY); + await Assert.That(tableRequest.GlobalSecondaryIndexes.First(gsi => gsi.IndexName == "GlobalSecondaryIndex").Projection.NonKeyAttributes).IsEquivalentTo(new List{"Id", "Version"}); } [DynamoDBTable("MyEntity")] diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Provisioned_Throughput.cs b/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Provisioned_Throughput.cs index fba7db2bb1..df63afc91a 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Provisioned_Throughput.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Provisioned_Throughput.cs @@ -4,14 +4,13 @@ using Amazon.DynamoDBv2.Model; using Paramore.Brighter.DynamoDb; using Paramore.Brighter.Outbox.DynamoDB; -using Xunit; namespace Paramore.Brighter.DynamoDB.Tests.DynamoDbExtensions { public class DynamoDbDFactoryProvisionedThroughputTests { - [Fact] - public void When_Creating_A_Table_With_Provisioned_Throughput() + [Test] + public async Task When_Creating_A_Table_With_Provisioned_Throughput() { //arrange var tableRequestFactory = new DynamoDbTableFactory(); @@ -28,10 +27,10 @@ public void When_Creating_A_Table_With_Provisioned_Throughput() CreateTableRequest tableRequest = tableRequestFactory.GenerateCreateTableRequest(provisonedThroughput); //assert - Assert.Equal(10, tableRequest.ProvisionedThroughput.ReadCapacityUnits); - Assert.Equal(10, tableRequest.ProvisionedThroughput.WriteCapacityUnits); - Assert.Equal(11,tableRequest.GlobalSecondaryIndexes.First(gsi => gsi.IndexName == "GlobalSecondaryIndex").ProvisionedThroughput.ReadCapacityUnits); - Assert.Equal(11,tableRequest.GlobalSecondaryIndexes.First(gsi => gsi.IndexName == "GlobalSecondaryIndex").ProvisionedThroughput.WriteCapacityUnits); + await Assert.That(tableRequest.ProvisionedThroughput.ReadCapacityUnits).IsEqualTo(10); + await Assert.That(tableRequest.ProvisionedThroughput.WriteCapacityUnits).IsEqualTo(10); + await Assert.That(tableRequest.GlobalSecondaryIndexes.First(gsi => gsi.IndexName == "GlobalSecondaryIndex").ProvisionedThroughput.ReadCapacityUnits).IsEqualTo(11); + await Assert.That(tableRequest.GlobalSecondaryIndexes.First(gsi => gsi.IndexName == "GlobalSecondaryIndex").ProvisionedThroughput.WriteCapacityUnits).IsEqualTo(11); } [DynamoDBTable("MyEntity")] diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/DynamoDBOutboxProvider.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/DynamoDBOutboxProvider.cs index db53446759..a151f27f33 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/DynamoDBOutboxProvider.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/DynamoDBOutboxProvider.cs @@ -1,26 +1,24 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.Model; using Paramore.Brighter.DynamoDb; using Paramore.Brighter.DynamoDB.Tests.Outbox.Async; -using Paramore.Brighter.DynamoDB.Tests.Outbox.Sync; using Paramore.Brighter.Outbox.DynamoDB; namespace Paramore.Brighter.DynamoDB.Tests.Outbox; -public class DynamoDBOutboxProvider : IAmAnOutboxProviderSync, IAmAnOutboxProviderAsync +public class DynamoDBOutboxProvider : IAmAnOutboxProviderAsync { private string _tableName = ""; - public IAmAnOutboxSync CreateOutbox() + public async Task CreateStoreAsync() { - _tableName = DynamoDbOutboxTable - .EnsureTableIsCreatedAsync(Const.DynamoDbClient) - .GetAwaiter() - .GetResult(); + _tableName = await DynamoDbOutboxTable.EnsureTableIsCreatedAsync(Const.DynamoDbClient); + } + public IAmAnOutboxSync CreateOutbox() + { return new DynamoDbOutbox( Const.DynamoDbClient, new DynamoDbConfiguration { TableName = _tableName } @@ -29,34 +27,17 @@ public IAmAnOutboxSync CreateOutbox() public IAmAnOutboxAsync CreateOutboxAsync() { - _tableName = DynamoDbOutboxTable - .EnsureTableIsCreatedAsync(Const.DynamoDbClient) - .GetAwaiter() - .GetResult(); - return new DynamoDbOutbox( Const.DynamoDbClient, new DynamoDbConfiguration { TableName = _tableName } ); } - public void CreateStore() { } - - public Task CreateStoreAsync() - { - return Task.CompletedTask; - } - public IAmABoxTransactionProvider CreateTransactionProvider() { return new DynamoDbUnitOfWork(Const.DynamoDbClient); } - public void DeleteStore(IEnumerable messages) - { - DeleteStoreAsync(messages).GetAwaiter().GetResult(); - } - public async Task DeleteStoreAsync(IEnumerable messages) { var client = Const.DynamoDbClient; @@ -81,18 +62,13 @@ await client.DeleteItemAsync( } } - public IEnumerable GetAllMessages() - { - return GetAllMessagesAsync().GetAwaiter().GetResult(); - } - public async Task> GetAllMessagesAsync() { var receivedMessages = new List(); var outbox = new DynamoDbOutbox( Const.DynamoDbClient, - new DynamoDbConfiguration { TableName = _tableName! } + new DynamoDbConfiguration { TableName = _tableName } ); var client = Const.DynamoDbClient; @@ -105,7 +81,7 @@ public async Task> GetAllMessagesAsync() TableName = _tableName, AttributesToGet = { nameof(MessageItem.MessageId) }, ExclusiveStartKey = lastKey, - Select = Select.SPECIFIC_ATTRIBUTES, + Select = Amazon.DynamoDBv2.Select.SPECIFIC_ATTRIBUTES, } ); diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/IAmAnOutboxProviderAsync.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/IAmAnOutboxProviderAsync.cs index 1d655df266..9387ee4809 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/IAmAnOutboxProviderAsync.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/IAmAnOutboxProviderAsync.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs index f1851dc4a1..35fe867b41 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Async; -public class WhenAddingADuplicateMessageItShouldNotThrowAsync : IAsyncLifetime +public class WhenAddingADuplicateMessageItShouldNotThrowAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenAddingADuplicateMessageItShouldNotThrowAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() { // Arrange @@ -47,6 +49,6 @@ public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs index 774671ee4a..b130771171 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Async; -public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync : IAsyncLifetime +public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async() { // Arrange @@ -49,37 +51,37 @@ public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_ var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs index c93d15b02b..99eafbaa81 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Async; -public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async() { // Arrange @@ -54,6 +56,6 @@ public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Shoul var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs index 80fc0db0eb..060e50eedf 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Async; -public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async() { // Arrange @@ -54,37 +56,37 @@ public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_A var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs index 9a9578c1b8..5f87466a36 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Async; -public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -58,8 +60,8 @@ public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Ou .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs index 6bc8afd328..8d545146c4 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Async; -public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -47,17 +46,20 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -84,8 +86,8 @@ public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Asy .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs index 2a6b9ec32b..3b251c93d1 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Async; -public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync : IAsyncLifetime +public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async() { // Arrange @@ -80,38 +82,38 @@ public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_M var message = await outbox.GetAsync(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs index 356dec31e5..df8f2c06c2 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Async; -public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync : IAsyncLifetime +public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async() { // Arrange @@ -45,6 +47,6 @@ public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_ var message = await outbox.GetAsync(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs index ffb43a0b9f..d45a8e455c 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Async; -public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync : IAsyncLifetime +public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync( _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async() { // Arrange @@ -80,9 +82,9 @@ public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_An var messages = (await _outboxProvider.GetAllMessagesAsync()).ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs index eef6fb5933..cdde79e2fd 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Async; -public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_As var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs index 2d11b3d4a5..31b1d3c0da 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Async; -public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync : IAsyncLifetime +public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async() { // Arrange @@ -82,9 +84,9 @@ public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requeste .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs index 2126742f83..559ce49ff0 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Async; -public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_A var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/IAmAnOutboxProviderSync.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/IAmAnOutboxProviderSync.cs index 76541b0f7a..fb742a1c1a 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/IAmAnOutboxProviderSync.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/IAmAnOutboxProviderSync.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs index 50c71630be..49f256fdff 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,29 +27,27 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Sync; -public class WhenAddingADuplicateMessageItShouldNotThrow : IDisposable +public class WhenAddingADuplicateMessageItShouldNotThrow { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenAddingADuplicateMessageItShouldNotThrow() { _outboxProvider = new Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() + [Test] + public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw() { // Arrange var context = new RequestContext(); @@ -63,11 +61,18 @@ public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs index f0d3923fca..a9ee66736a 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,29 +27,27 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Sync; -public class WhenAddingAMessageItShouldBeStoredWithAllProperties : IDisposable +public class WhenAddingAMessageItShouldBeStoredWithAllProperties { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenAddingAMessageItShouldBeStoredWithAllProperties() { _outboxProvider = new Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() + [Test] + public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() { // Arrange var context = new RequestContext(); @@ -64,42 +62,49 @@ public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs index 91f71f8e02..befb600478 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,35 +27,33 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Sync; -public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored : IDisposable +public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored() { _outboxProvider = new Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,16 +62,23 @@ public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_ // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Rollback(); + await transaction.RollbackAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs index 0d8de03ab4..da464e75a0 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,35 +27,33 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Sync; -public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit : IDisposable +public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit() { _outboxProvider = new Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,47 +62,54 @@ public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_C // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Commit(); + await transaction.CommitAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs index 919e89dfdf..930cdf08a5 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,29 +27,27 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Sync; -public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox : IDisposable +public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox() { _outboxProvider = new Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,13 +72,20 @@ public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs index 8299e616e6..c62df1bdb2 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,29 +27,27 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Sync; -public class WhenDeletingOneMessageItShouldBeRemovedFromOutbox : IDisposable +public class WhenDeletingOneMessageItShouldBeRemovedFromOutbox { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenDeletingOneMessageItShouldBeRemovedFromOutbox() { _outboxProvider = new Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,13 +72,20 @@ public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs index fbc0c8616c..1d7e16e9a6 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,29 +27,27 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Sync; -public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage : IDisposable +public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage() { _outboxProvider = new Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() + [Test] + public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() { // Arrange var context = new RequestContext(); @@ -70,43 +68,50 @@ public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message var message = outbox.Get(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs index 5e9cc0ec04..12442aef44 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,29 +27,27 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Sync; -public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage : IDisposable +public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage() { _outboxProvider = new Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() + [Test] + public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() { // Arrange var context = new RequestContext(); @@ -60,11 +58,18 @@ public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Messag var message = outbox.Get(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs index 184ceefd04..8f0103a614 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,29 +27,27 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Sync; -public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched : IDisposable +public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched() { _outboxProvider = new Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() + [Test] + public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() { // Arrange var context = new RequestContext(); @@ -67,17 +65,24 @@ public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undi outbox.MarkDispatched(dispatched.Id, context, DateTime.UtcNow.AddSeconds(-30)); // Act - var messages = _outboxProvider.GetAllMessages().ToArray(); + var messages = (await _outboxProvider.GetAllMessagesAsync()).ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs index a21429ffae..e63b113c81 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,29 +27,27 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Sync; -public class WhenRetrievingDispatchedMessagesItShouldFilterByAge : IDisposable +public class WhenRetrievingDispatchedMessagesItShouldFilterByAge { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenRetrievingDispatchedMessagesItShouldFilterByAge() { _outboxProvider = new Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,23 +70,30 @@ public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs index ace19615e1..65d0c0a7c5 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,29 +27,27 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Sync; -public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages : IDisposable +public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages() { _outboxProvider = new Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() + [Test] + public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() { // Arrange var context = new RequestContext(); @@ -72,14 +70,21 @@ public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Mess .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs index 930cb00a81..3d09f4f711 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Outbox/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,29 +27,27 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.Tests.Outbox.Sync; -public class WhenRetrievingOutstandingMessagesItShouldFilterByAge : IDisposable +public class WhenRetrievingOutstandingMessagesItShouldFilterByAge { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenRetrievingOutstandingMessagesItShouldFilterByAge() { _outboxProvider = new Paramore.Brighter.DynamoDB.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,23 +70,30 @@ public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.Tests/Paramore.Brighter.DynamoDB.Tests.csproj b/tests/Paramore.Brighter.DynamoDB.Tests/Paramore.Brighter.DynamoDB.Tests.csproj index 9eb78f8f47..1e665d1b7c 100644 --- a/tests/Paramore.Brighter.DynamoDB.Tests/Paramore.Brighter.DynamoDB.Tests.csproj +++ b/tests/Paramore.Brighter.DynamoDB.Tests/Paramore.Brighter.DynamoDB.Tests.csproj @@ -1,33 +1,17 @@ - - - $(BrighterTestTargetFrameworks) - false - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - + + $(BrighterTestTargetFrameworks) + false + Exe + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Building_A_Table_Omit_Non_Key_Schema_Attributes.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Building_A_Table_Omit_Non_Key_Schema_Attributes.cs index 61abf10a87..394468ad6e 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Building_A_Table_Omit_Non_Key_Schema_Attributes.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Building_A_Table_Omit_Non_Key_Schema_Attributes.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.DynamoDb; using Paramore.Brighter.DynamoDb.V4; using Paramore.Brighter.Outbox.DynamoDB; -using Xunit; namespace Paramore.Brighter.DynamoDB.V4.Tests.DynamoDbExtensions; public class DynamoDbDropNonKeyAttributesForCreationTests { - [Fact] - public void When_Building_A_Table_Omit_Non_Key_Schema_Attributes() + [Test] + public async Task When_Building_A_Table_Omit_Non_Key_Schema_Attributes() { var tableRequestFactory = new DynamoDbTableFactory(); var builder = new DynamoDbTableBuilder(CreateClient()); @@ -35,14 +34,14 @@ public void When_Building_A_Table_Omit_Non_Key_Schema_Attributes() var modifiedTableRequest = builder.RemoveNonSchemaAttributes(tableRequest); //assert - Assert.DoesNotContain(modifiedTableRequest.AttributeDefinitions, attr => attr.AttributeName == "StringProperty" && attr.AttributeType == ScalarAttributeType.S); - Assert.DoesNotContain(modifiedTableRequest.AttributeDefinitions, attr => attr.AttributeName == "NumberProperty" && attr.AttributeType == ScalarAttributeType.N); - Assert.DoesNotContain(modifiedTableRequest.AttributeDefinitions, attr => attr.AttributeName == "ByteArrayProperty" && attr.AttributeType == ScalarAttributeType.B); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "Id" && attr.AttributeType == ScalarAttributeType.S); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "RangeKey" && attr.AttributeType == ScalarAttributeType.S); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "GlobalSecondaryId" && attr.AttributeType == ScalarAttributeType.S); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "GlobalSecondaryRangeKey" && attr.AttributeType == ScalarAttributeType.S); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "LocalSecondaryRangeKey" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(modifiedTableRequest.AttributeDefinitions).DoesNotContain(attr => attr.AttributeName == "StringProperty" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(modifiedTableRequest.AttributeDefinitions).DoesNotContain(attr => attr.AttributeName == "NumberProperty" && attr.AttributeType == ScalarAttributeType.N); + await Assert.That(modifiedTableRequest.AttributeDefinitions).DoesNotContain(attr => attr.AttributeName == "ByteArrayProperty" && attr.AttributeType == ScalarAttributeType.B); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "Id" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "RangeKey" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "GlobalSecondaryId" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "GlobalSecondaryRangeKey" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "LocalSecondaryRangeKey" && attr.AttributeType == ScalarAttributeType.S); } private AmazonDynamoDBClient CreateClient() diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_From_A_Class_Missing_A_Hash_Key.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_From_A_Class_Missing_A_Hash_Key.cs index cd8fa90e04..fad115a754 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_From_A_Class_Missing_A_Hash_Key.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_From_A_Class_Missing_A_Hash_Key.cs @@ -3,21 +3,21 @@ using Paramore.Brighter.DynamoDb; using Paramore.Brighter.DynamoDb.V4; using Paramore.Brighter.Outbox.DynamoDB; -using Xunit; namespace Paramore.Brighter.DynamoDB.V4.Tests.DynamoDbExtensions; public class DynanmoDbMissingHashKeyTests { - [Fact] - public void When_Creating_A_Table_From_A_Class_Missing_A_Hash_Key() + [Test] + public Task When_Creating_A_Table_From_A_Class_Missing_A_Hash_Key() { //arrange, act, assert - Assert.Throws(() => + Assert.ThrowsExactly(() => { var tableRequestFactory = new DynamoDbTableFactory(); tableRequestFactory.GenerateCreateTableRequest(new DynamoDbCreateProvisionedThroughput()); }); + return Task.CompletedTask; } [DynamoDBTable("DnyamoDbEntity")] diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_From_A_Class_Missing_Table_Attribute.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_From_A_Class_Missing_Table_Attribute.cs index 1c3b4c3105..13cb8183a9 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_From_A_Class_Missing_Table_Attribute.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_From_A_Class_Missing_Table_Attribute.cs @@ -2,21 +2,21 @@ using Paramore.Brighter.DynamoDb; using Paramore.Brighter.DynamoDb.V4; using Paramore.Brighter.Outbox.DynamoDB; -using Xunit; namespace Paramore.Brighter.DynamoDB.V4.Tests.DynamoDbExtensions; public class DynamoDbFactoryMissingTableAttributeTests { - [Fact] - public void When_Creating_A_Table_From_A_Class_Missing_Table_Attribute() + [Test] + public Task When_Creating_A_Table_From_A_Class_Missing_Table_Attribute() { //arrange, act, assert - Assert.Throws(() => + Assert.ThrowsExactly(() => { var tableRequestFactory = new DynamoDbTableFactory(); tableRequestFactory.GenerateCreateTableRequest(new DynamoDbCreateProvisionedThroughput()); }); + return Task.CompletedTask; } private sealed class DynamoDbEntity; diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_From_An_Attributed_Class.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_From_An_Attributed_Class.cs index 5ad6dbde91..98d2bd7644 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_From_An_Attributed_Class.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_From_An_Attributed_Class.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.DynamoDb; using Paramore.Brighter.DynamoDb.V4; using Paramore.Brighter.Outbox.DynamoDB; -using Xunit; namespace Paramore.Brighter.DynamoDB.V4.Tests.DynamoDbExtensions; public class DynamboDbFactoryGenerateCreateRequestTests { - [Fact] - public void When_Creating_A_Table_From_An_Attributed_Class() + [Test] + public async Task When_Creating_A_Table_From_An_Attributed_Class() { //arrange var tableRequestFactory = new DynamoDbTableFactory(); @@ -33,20 +32,20 @@ public void When_Creating_A_Table_From_An_Attributed_Class() ); //assert - Assert.Equal("MyEntity", tableRequest.TableName); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "StringProperty" && attr.AttributeType == ScalarAttributeType.S); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "NumberProperty" && attr.AttributeType == ScalarAttributeType.N); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "ByteArrayProperty" && attr.AttributeType == ScalarAttributeType.B); - Assert.DoesNotContain(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "UnmarkedProperty"); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "MappedName" && attr.AttributeType == ScalarAttributeType.S); - Assert.DoesNotContain(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "IgnoredProperty"); - Assert.Contains(tableRequest.KeySchema, kse => kse.AttributeName == "Id" && kse.KeyType == KeyType.HASH); - Assert.Contains(tableRequest.GlobalSecondaryIndexes, + await Assert.That(tableRequest.TableName).IsEqualTo("MyEntity"); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "StringProperty" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "NumberProperty" && attr.AttributeType == ScalarAttributeType.N); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "ByteArrayProperty" && attr.AttributeType == ScalarAttributeType.B); + await Assert.That(tableRequest.AttributeDefinitions).DoesNotContain(attr => attr.AttributeName == "UnmarkedProperty"); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "MappedName" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(tableRequest.AttributeDefinitions).DoesNotContain(attr => attr.AttributeName == "IgnoredProperty"); + await Assert.That(tableRequest.KeySchema).Contains(kse => kse.AttributeName == "Id" && kse.KeyType == KeyType.HASH); + await Assert.That(tableRequest.GlobalSecondaryIndexes).Contains( gsi => gsi.IndexName == "GlobalSecondaryIndex" && Enumerable.Any(gsi.KeySchema, kse => kse.AttributeName == "GlobalSecondaryId" && kse.KeyType == KeyType.HASH) && Enumerable.Any(gsi.KeySchema, kse => kse.AttributeName == "GlobalSecondaryRangeKey" && kse.KeyType == KeyType.RANGE)); - Assert.Contains(tableRequest.LocalSecondaryIndexes, lsi => lsi.IndexName == "LocalSecondaryIndex" - && Enumerable.Any(lsi.KeySchema, kse => kse.AttributeName == "LocalSecondaryRangeKey" && kse.KeyType == KeyType.RANGE)); + await Assert.That(tableRequest.LocalSecondaryIndexes).Contains(lsi => lsi.IndexName == "LocalSecondaryIndex" + && Enumerable.Any(lsi.KeySchema, kse => kse.AttributeName == "LocalSecondaryRangeKey" && kse.KeyType == KeyType.RANGE)); } //Required diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Admin_Attributes.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Admin_Attributes.cs index e93c7a2d9a..32bf138524 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Admin_Attributes.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Admin_Attributes.cs @@ -5,14 +5,13 @@ using Paramore.Brighter.DynamoDb; using Paramore.Brighter.DynamoDb.V4; using Paramore.Brighter.Outbox.DynamoDB; -using Xunit; namespace Paramore.Brighter.DynamoDB.V4.Tests.DynamoDbExtensions; public class DynamoDbFactoryOtherTableAttributesTests { - [Fact] - public void When_Creating_A_Table_With_Admin_Attributes() + [Test] + public async Task When_Creating_A_Table_With_Admin_Attributes() { //arrange var tableRequestFactory = new DynamoDbTableFactory(); @@ -26,11 +25,11 @@ public void When_Creating_A_Table_With_Admin_Attributes() tags: new List {new Tag{Key="beta", Value = "True"}, new Tag{Key="paramore", Value = "Brighter"}}); //assert - Assert.Equal(BillingMode.PAY_PER_REQUEST, tableRequest.BillingMode); - Assert.False(tableRequest.SSESpecification.Enabled); - Assert.False(tableRequest.SSESpecification.Enabled); - Assert.Contains(tableRequest.Tags, tag => tag.Key == "beta" && tag.Value == "True"); - Assert.Contains(tableRequest.Tags, tag => tag.Key == "paramore" && tag.Value == "Brighter"); + await Assert.That(tableRequest.BillingMode).IsEqualTo(BillingMode.PAY_PER_REQUEST); + await Assert.That(tableRequest.SSESpecification.Enabled).IsFalse(); + await Assert.That(tableRequest.SSESpecification.Enabled).IsFalse(); + await Assert.That(tableRequest.Tags).Contains(tag => tag.Key == "beta" && tag.Value == "True"); + await Assert.That(tableRequest.Tags).Contains(tag => tag.Key == "paramore" && tag.Value == "Brighter"); } [DynamoDBTable("MyEntity")] diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Collection_Properties.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Collection_Properties.cs index ab44d13fde..bdef4dd0e3 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Collection_Properties.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Collection_Properties.cs @@ -5,14 +5,13 @@ using Paramore.Brighter.DynamoDb; using Paramore.Brighter.DynamoDb.V4; using Paramore.Brighter.Outbox.DynamoDB; -using Xunit; namespace Paramore.Brighter.DynamoDB.V4.Tests.DynamoDbExtensions; public class DynamoDbCollectionProperties { - [Fact] - public void When_Creating_A_Table_With_Collection_Properties() + [Test] + public async Task When_Creating_A_Table_With_Collection_Properties() { //arrange var tableRequestFactory = new DynamoDbTableFactory(); @@ -26,12 +25,12 @@ public void When_Creating_A_Table_With_Collection_Properties() ); //assert - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "Id" && attr.AttributeType == ScalarAttributeType.S); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "StringArray" && attr.AttributeType.Value == "SS"); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "IntArray" && attr.AttributeType.Value == "NS"); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "DoubleArray" && attr.AttributeType.Value == "NS"); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "GenericList" && attr.AttributeType.Value == "L"); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "GenericMap" && attr.AttributeType.Value == "M"); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "Id" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "StringArray" && attr.AttributeType.Value == "SS"); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "IntArray" && attr.AttributeType.Value == "NS"); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "DoubleArray" && attr.AttributeType.Value == "NS"); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "GenericList" && attr.AttributeType.Value == "L"); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "GenericMap" && attr.AttributeType.Value == "M"); } [DynamoDBTable("MyEntity")] diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Custom_Properties.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Custom_Properties.cs index 27b2e9bd97..52d3a657c6 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Custom_Properties.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Custom_Properties.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Text.Json; using Amazon.DynamoDBv2; @@ -9,14 +9,13 @@ using Paramore.Brighter.DynamoDb.V4; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Outbox.DynamoDB; -using Xunit; namespace Paramore.Brighter.DynamoDB.V4.Tests.DynamoDbExtensions; public class DynamoDbCustomProperties { - [Fact] - public void When_Creating_A_Table_With_Custom_Properties() + [Test] + public async Task When_Creating_A_Table_With_Custom_Properties() { //arrange var tableRequestFactory = new DynamoDbTableFactory(); @@ -37,8 +36,8 @@ public void When_Creating_A_Table_With_Custom_Properties() ); //assert - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "Id" && attr.AttributeType == ScalarAttributeType.S); - Assert.Contains(tableRequest.AttributeDefinitions, attr => attr.AttributeName == "Amount" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "Id" && attr.AttributeType == ScalarAttributeType.S); + await Assert.That(tableRequest.AttributeDefinitions).Contains(attr => attr.AttributeName == "Amount" && attr.AttributeType == ScalarAttributeType.S); } [DynamoDBTable("MyEntity")] diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Multple_GSI_Indexes_Per_Field.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Multple_GSI_Indexes_Per_Field.cs index 59b4431ede..87aca0d1c1 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Multple_GSI_Indexes_Per_Field.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Multple_GSI_Indexes_Per_Field.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.DynamoDb; using Paramore.Brighter.DynamoDb.V4; using Paramore.Brighter.Outbox.DynamoDB; -using Xunit; namespace Paramore.Brighter.DynamoDB.V4.Tests.DynamoDbExtensions; public class DynamboDbFactoryMultipleGSIIndexesTests { - [Fact] - public void When_Creating_A_Table_With_Multiple_GSI_Inxdexes_Per_Field() + [Test] + public async Task When_Creating_A_Table_With_Multiple_GSI_Inxdexes_Per_Field() { //arrange var tableRequestFactory = new DynamoDbTableFactory(); @@ -33,12 +32,12 @@ public void When_Creating_A_Table_With_Multiple_GSI_Inxdexes_Per_Field() ); //assert - Assert.Equal("MyEntity", tableRequest.TableName); - Assert.Contains(tableRequest.GlobalSecondaryIndexes, + await Assert.That(tableRequest.TableName).IsEqualTo("MyEntity"); + await Assert.That(tableRequest.GlobalSecondaryIndexes).Contains( gsi => gsi.IndexName == "GlobalSecondaryIndex" && Enumerable.Any(gsi.KeySchema, kse => kse.AttributeName == "GlobalSecondaryId" && kse.KeyType == KeyType.HASH) && Enumerable.Any(gsi.KeySchema, kse => kse.AttributeName == "GlobalSecondaryRangeKey" && kse.KeyType == KeyType.RANGE)); - Assert.Contains(tableRequest.GlobalSecondaryIndexes, + await Assert.That(tableRequest.GlobalSecondaryIndexes).Contains( gsi => gsi.IndexName == "AnotherGlobalSecondaryIndex" && Enumerable.Any(gsi.KeySchema, kse => kse.AttributeName == "GlobalSecondaryId" && kse.KeyType == KeyType.HASH) && Enumerable.Any(gsi.KeySchema, kse => kse.AttributeName == "GlobalSecondaryRangeKey" && kse.KeyType == KeyType.RANGE)); diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Projections.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Projections.cs index 0b799e21ab..7b1c573f8a 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Projections.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Projections.cs @@ -6,14 +6,13 @@ using Paramore.Brighter.DynamoDb; using Paramore.Brighter.DynamoDb.V4; using Paramore.Brighter.Outbox.DynamoDB; -using Xunit; namespace Paramore.Brighter.DynamoDB.V4.Tests.DynamoDbExtensions; public class DynamoDbFactoryProjectionsTests { - [Fact] - public void When_Creating_A_Table_With_Projections() + [Test] + public async Task When_Creating_A_Table_With_Projections() { var tableRequestFactory = new DynamoDbTableFactory(); var gsiProjection = new DynamoGSIProjections @@ -39,10 +38,8 @@ public void When_Creating_A_Table_With_Projections() ); //assert - Assert.Equal(ProjectionType.KEYS_ONLY, tableRequest.GlobalSecondaryIndexes.First(gsi => gsi.IndexName == "GlobalSecondaryIndex").Projection.ProjectionType); - Assert.Equal( - new List{"Id", "Version"}, - tableRequest.GlobalSecondaryIndexes.First(gsi => gsi.IndexName == "GlobalSecondaryIndex").Projection.NonKeyAttributes); + await Assert.That(tableRequest.GlobalSecondaryIndexes.First(gsi => gsi.IndexName == "GlobalSecondaryIndex").Projection.ProjectionType).IsEqualTo(ProjectionType.KEYS_ONLY); + await Assert.That(tableRequest.GlobalSecondaryIndexes.First(gsi => gsi.IndexName == "GlobalSecondaryIndex").Projection.NonKeyAttributes).IsEquivalentTo(new List{"Id", "Version"}); } [DynamoDBTable("MyEntity")] diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Provisioned_Throughput.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Provisioned_Throughput.cs index 2b78f0f3c0..05f7b36e15 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Provisioned_Throughput.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/DynamoDbExtensions/When_Creating_A_Table_With_Provisioned_Throughput.cs @@ -5,14 +5,13 @@ using Paramore.Brighter.DynamoDb; using Paramore.Brighter.DynamoDb.V4; using Paramore.Brighter.Outbox.DynamoDB; -using Xunit; namespace Paramore.Brighter.DynamoDB.V4.Tests.DynamoDbExtensions; public class DynamoDbDFactoryProvisionedThroughputTests { - [Fact] - public void When_Creating_A_Table_With_Provisioned_Throughput() + [Test] + public async Task When_Creating_A_Table_With_Provisioned_Throughput() { //arrange var tableRequestFactory = new DynamoDbTableFactory(); @@ -29,10 +28,10 @@ public void When_Creating_A_Table_With_Provisioned_Throughput() CreateTableRequest tableRequest = tableRequestFactory.GenerateCreateTableRequest(provisonedThroughput); //assert - Assert.Equal(10, tableRequest.ProvisionedThroughput.ReadCapacityUnits); - Assert.Equal(10, tableRequest.ProvisionedThroughput.WriteCapacityUnits); - Assert.Equal(11,tableRequest.GlobalSecondaryIndexes.First(gsi => gsi.IndexName == "GlobalSecondaryIndex").ProvisionedThroughput.ReadCapacityUnits); - Assert.Equal(11,tableRequest.GlobalSecondaryIndexes.First(gsi => gsi.IndexName == "GlobalSecondaryIndex").ProvisionedThroughput.WriteCapacityUnits); + await Assert.That(tableRequest.ProvisionedThroughput.ReadCapacityUnits).IsEqualTo(10); + await Assert.That(tableRequest.ProvisionedThroughput.WriteCapacityUnits).IsEqualTo(10); + await Assert.That(tableRequest.GlobalSecondaryIndexes.First(gsi => gsi.IndexName == "GlobalSecondaryIndex").ProvisionedThroughput.ReadCapacityUnits).IsEqualTo(11); + await Assert.That(tableRequest.GlobalSecondaryIndexes.First(gsi => gsi.IndexName == "GlobalSecondaryIndex").ProvisionedThroughput.WriteCapacityUnits).IsEqualTo(11); } [DynamoDBTable("MyEntity")] diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/DynamoDBOutboxProvider.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/DynamoDBOutboxProvider.cs index e77b4dba93..93c30cd4fd 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/DynamoDBOutboxProvider.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/DynamoDBOutboxProvider.cs @@ -1,26 +1,24 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Amazon.DynamoDBv2; using Amazon.DynamoDBv2.Model; using Paramore.Brighter.DynamoDb.V4; using Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Async; -using Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Sync; using Paramore.Brighter.Outbox.DynamoDB.V4; namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox; -public class DynamoDBOutboxProvider : IAmAnOutboxProviderSync, IAmAnOutboxProviderAsync +public class DynamoDBOutboxProvider : IAmAnOutboxProviderAsync { private string _tableName = ""; - public IAmAnOutboxSync CreateOutbox() + public async Task CreateStoreAsync() { - _tableName = DynamoDbOutboxTable - .EnsureTableIsCreatedAsync(Const.DynamoDbClient) - .GetAwaiter() - .GetResult(); + _tableName = await DynamoDbOutboxTable.EnsureTableIsCreatedAsync(Const.DynamoDbClient); + } + public IAmAnOutboxSync CreateOutbox() + { return new DynamoDbOutbox( Const.DynamoDbClient, new DynamoDbConfiguration { TableName = _tableName } @@ -29,34 +27,17 @@ public IAmAnOutboxSync CreateOutbox() public IAmAnOutboxAsync CreateOutboxAsync() { - _tableName = DynamoDbOutboxTable - .EnsureTableIsCreatedAsync(Const.DynamoDbClient) - .GetAwaiter() - .GetResult(); - return new DynamoDbOutbox( Const.DynamoDbClient, new DynamoDbConfiguration { TableName = _tableName } ); } - public void CreateStore() { } - - public Task CreateStoreAsync() - { - return Task.CompletedTask; - } - public IAmABoxTransactionProvider CreateTransactionProvider() { return new DynamoDbUnitOfWork(Const.DynamoDbClient); } - public void DeleteStore(IEnumerable messages) - { - DeleteStoreAsync(messages).GetAwaiter().GetResult(); - } - public async Task DeleteStoreAsync(IEnumerable messages) { var client = Const.DynamoDbClient; @@ -76,23 +57,17 @@ await client.DeleteItemAsync( } catch { - // Ignoring any error during delete, it's not important at this point } } } - public IEnumerable GetAllMessages() - { - return GetAllMessagesAsync().GetAwaiter().GetResult(); - } - public async Task> GetAllMessagesAsync() { var receivedMessages = new List(); var outbox = new DynamoDbOutbox( Const.DynamoDbClient, - new DynamoDbConfiguration { TableName = _tableName! } + new DynamoDbConfiguration { TableName = _tableName } ); var client = Const.DynamoDbClient; @@ -105,7 +80,7 @@ public async Task> GetAllMessagesAsync() TableName = _tableName, AttributesToGet = [nameof(MessageItem.MessageId)], ExclusiveStartKey = lastKey, - Select = Select.SPECIFIC_ATTRIBUTES, + Select = Amazon.DynamoDBv2.Select.SPECIFIC_ATTRIBUTES, } ); diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/IAmAnOutboxProviderAsync.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/IAmAnOutboxProviderAsync.cs index 2dcdf83407..582542c5f8 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/IAmAnOutboxProviderAsync.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/IAmAnOutboxProviderAsync.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs index 84539548d9..476106683a 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Async; -public class WhenAddingADuplicateMessageItShouldNotThrowAsync : IAsyncLifetime +public class WhenAddingADuplicateMessageItShouldNotThrowAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenAddingADuplicateMessageItShouldNotThrowAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() { // Arrange @@ -47,6 +49,6 @@ public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs index 52b4a5b50e..ca1067ab64 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Async; -public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync : IAsyncLifetime +public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async() { // Arrange @@ -49,37 +51,37 @@ public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_ var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs index fdb6fcb9cd..8903c9c1c7 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Async; -public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async() { // Arrange @@ -54,6 +56,6 @@ public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Shoul var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs index 9d2f13a17a..6db03bd723 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Async; -public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async() { // Arrange @@ -54,37 +56,37 @@ public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_A var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs index 8347e42fd7..a574e95c97 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Async; -public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -58,8 +60,8 @@ public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Ou .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs index e0fa1895ae..5763e98ef8 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Async; -public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -47,17 +46,20 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -84,8 +86,8 @@ public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Asy .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs index 45394c23ca..a6124f2dc0 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Async; -public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync : IAsyncLifetime +public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async() { // Arrange @@ -80,38 +82,38 @@ public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_M var message = await outbox.GetAsync(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs index 4fd19424df..9562ba20c6 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Async; -public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync : IAsyncLifetime +public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async() { // Arrange @@ -45,6 +47,6 @@ public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_ var message = await outbox.GetAsync(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs index bc39344678..9ac498c238 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Async; -public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync : IAsyncLifetime +public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync( _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async() { // Arrange @@ -80,9 +82,9 @@ public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_An var messages = (await _outboxProvider.GetAllMessagesAsync()).ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs index 2ad3820622..1179b44e82 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Async; -public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_As var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs index 254f2ac5cc..3367ae5d59 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Async; -public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync : IAsyncLifetime +public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async() { // Arrange @@ -82,9 +84,9 @@ public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requeste .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs index e12d15b49e..9c7e400e2f 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Async; -public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_A var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/IAmAnOutboxProviderSync.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/IAmAnOutboxProviderSync.cs index 2cb6438310..7bad0a558e 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/IAmAnOutboxProviderSync.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/IAmAnOutboxProviderSync.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs index 14a34f0689..27693d4f5c 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,29 +27,27 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Sync; -public class WhenAddingADuplicateMessageItShouldNotThrow : IDisposable +public class WhenAddingADuplicateMessageItShouldNotThrow { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenAddingADuplicateMessageItShouldNotThrow() { _outboxProvider = new Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() + [Test] + public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw() { // Arrange var context = new RequestContext(); @@ -63,11 +61,18 @@ public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs index bb13aedc13..4fc134faeb 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,29 +27,27 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Sync; -public class WhenAddingAMessageItShouldBeStoredWithAllProperties : IDisposable +public class WhenAddingAMessageItShouldBeStoredWithAllProperties { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenAddingAMessageItShouldBeStoredWithAllProperties() { _outboxProvider = new Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() + [Test] + public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() { // Arrange var context = new RequestContext(); @@ -64,42 +62,49 @@ public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs index a00a2967cc..a2f5e08b84 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,35 +27,33 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Sync; -public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored : IDisposable +public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored() { _outboxProvider = new Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,16 +62,23 @@ public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_ // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Rollback(); + await transaction.RollbackAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs index 896785bcfb..fdbf337a54 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,35 +27,33 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Sync; -public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit : IDisposable +public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit() { _outboxProvider = new Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,47 +62,54 @@ public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_C // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Commit(); + await transaction.CommitAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs index 85b5426eb0..16ba0393ed 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,29 +27,27 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Sync; -public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox : IDisposable +public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox() { _outboxProvider = new Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,13 +72,20 @@ public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs index 6bb06f1683..0c389cf114 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,29 +27,27 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Sync; -public class WhenDeletingOneMessageItShouldBeRemovedFromOutbox : IDisposable +public class WhenDeletingOneMessageItShouldBeRemovedFromOutbox { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenDeletingOneMessageItShouldBeRemovedFromOutbox() { _outboxProvider = new Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,13 +72,20 @@ public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs index 975cb11306..5e209afba8 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,29 +27,27 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Sync; -public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage : IDisposable +public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage() { _outboxProvider = new Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() + [Test] + public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() { // Arrange var context = new RequestContext(); @@ -70,43 +68,50 @@ public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message var message = outbox.Get(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs index 18c25a74ab..400309cfee 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,29 +27,27 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Sync; -public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage : IDisposable +public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage() { _outboxProvider = new Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() + [Test] + public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() { // Arrange var context = new RequestContext(); @@ -60,11 +58,18 @@ public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Messag var message = outbox.Get(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs index dd50e509d7..361e5a935c 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,29 +27,27 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Sync; -public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched : IDisposable +public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched() { _outboxProvider = new Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() + [Test] + public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() { // Arrange var context = new RequestContext(); @@ -67,17 +65,24 @@ public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undi outbox.MarkDispatched(dispatched.Id, context, DateTime.UtcNow.AddSeconds(-30)); // Act - var messages = _outboxProvider.GetAllMessages().ToArray(); + var messages = (await _outboxProvider.GetAllMessagesAsync()).ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs index 104f31c09a..e44dcbd353 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,29 +27,27 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Sync; -public class WhenRetrievingDispatchedMessagesItShouldFilterByAge : IDisposable +public class WhenRetrievingDispatchedMessagesItShouldFilterByAge { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenRetrievingDispatchedMessagesItShouldFilterByAge() { _outboxProvider = new Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,23 +70,30 @@ public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs index 2fc063ee85..97970992f5 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,29 +27,27 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Sync; -public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages : IDisposable +public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages() { _outboxProvider = new Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() + [Test] + public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() { // Arrange var context = new RequestContext(); @@ -72,14 +70,21 @@ public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Mess .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs index 61d782f941..12042d35c0 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Outbox/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,29 +27,27 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.DynamoDB.V4.Tests.Outbox.Sync; -public class WhenRetrievingOutstandingMessagesItShouldFilterByAge : IDisposable +public class WhenRetrievingOutstandingMessagesItShouldFilterByAge { - private readonly IAmAnOutboxProviderSync _outboxProvider; + private readonly Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider _outboxProvider; private readonly IAmAMessageFactory _messageFactory; private List _createdMessages = []; public WhenRetrievingOutstandingMessagesItShouldFilterByAge() { _outboxProvider = new Paramore.Brighter.DynamoDB.V4.Tests.Outbox.DynamoDBOutboxProvider(); - _outboxProvider.CreateStore(); _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,23 +70,30 @@ public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } - public void Dispose() + [Before(HookType.Test)] + public async Task Setup() { - _outboxProvider.DeleteStore(_createdMessages); + await _outboxProvider.CreateStoreAsync(); + } + + [After(HookType.Test)] + public async Task Cleanup() + { + await _outboxProvider.DeleteStoreAsync(_createdMessages); } } diff --git a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Paramore.Brighter.DynamoDB.V4.Tests.csproj b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Paramore.Brighter.DynamoDB.V4.Tests.csproj index 1483528aed..1b811056c0 100644 --- a/tests/Paramore.Brighter.DynamoDB.V4.Tests/Paramore.Brighter.DynamoDB.V4.Tests.csproj +++ b/tests/Paramore.Brighter.DynamoDB.V4.Tests/Paramore.Brighter.DynamoDB.V4.Tests.csproj @@ -1,33 +1,17 @@ - $(BrighterTestTargetFrameworks) false + Exe - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - + - - - + \ No newline at end of file diff --git a/tests/Paramore.Brighter.Extensions.Tests/AssemblyResolutionDefaultTransientTests.cs b/tests/Paramore.Brighter.Extensions.Tests/AssemblyResolutionDefaultTransientTests.cs index 986d10944f..c6f04123f2 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/AssemblyResolutionDefaultTransientTests.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/AssemblyResolutionDefaultTransientTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.Tests.TestDoubles; @@ -9,7 +9,6 @@ using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection; using Tests; -using Xunit; namespace Paramore.Brighter.Extensions.Tests { @@ -27,61 +26,61 @@ public AssemblyResolutionDefaultTransientTests() _provider = _services.BuildServiceProvider(); } - [Fact] - public void ShouldHaveCommandProcessorRegisteredCorrectly() + [Test] + public async Task ShouldHaveCommandProcessorRegisteredCorrectly() { - TestRegistration(typeof(IAmACommandProcessor), ServiceLifetime.Singleton); + await TestRegistration(typeof(IAmACommandProcessor), ServiceLifetime.Singleton); } - [Fact] - public void ShouldHaveServiceActivatorRegisteredCorrectly() + [Test] + public async Task ShouldHaveServiceActivatorRegisteredCorrectly() { - TestRegistration(typeof(IDispatcher), ServiceLifetime.Singleton); + await TestRegistration(typeof(IDispatcher), ServiceLifetime.Singleton); } - [Fact] - public void ShouldHaveTestHandlerRegisteredCorrectly() + [Test] + public async Task ShouldHaveTestHandlerRegisteredCorrectly() { - TestRegistration(typeof(TestEventHandler), ServiceLifetime.Transient); + await TestRegistration(typeof(TestEventHandler), ServiceLifetime.Transient); } - [Fact] - public void ShouldHaveTestMapperRegisteredCorrectly() + [Test] + public async Task ShouldHaveTestMapperRegisteredCorrectly() { - TestRegistration(typeof(TestEventMessageMapper), ServiceLifetime.Transient); + await TestRegistration(typeof(TestEventMessageMapper), ServiceLifetime.Transient); } - [Fact] - public void ShouldHaveDefaultHandlerRegisteredCorrectly() + [Test] + public async Task ShouldHaveDefaultHandlerRegisteredCorrectly() { - TestRegistration(typeof(ExceptionPolicyHandler<>), ServiceLifetime.Transient); - TestRegistration(typeof(FallbackPolicyHandler<>), ServiceLifetime.Transient); - TestRegistration(typeof(TimeoutPolicyHandler<>), ServiceLifetime.Transient); - TestRegistration(typeof(MonitorHandler<>), ServiceLifetime.Transient); - TestRegistration(typeof(UseInboxHandler<>), ServiceLifetime.Transient); - TestRegistration(typeof(RequestLoggingHandler<>), ServiceLifetime.Transient); + await TestRegistration(typeof(ExceptionPolicyHandler<>), ServiceLifetime.Transient); + await TestRegistration(typeof(FallbackPolicyHandler<>), ServiceLifetime.Transient); + await TestRegistration(typeof(TimeoutPolicyHandler<>), ServiceLifetime.Transient); + await TestRegistration(typeof(MonitorHandler<>), ServiceLifetime.Transient); + await TestRegistration(typeof(UseInboxHandler<>), ServiceLifetime.Transient); + await TestRegistration(typeof(RequestLoggingHandler<>), ServiceLifetime.Transient); } - private void TestRegistration(Type expected, ServiceLifetime serviceLifetime) + private async Task TestRegistration(Type expected, ServiceLifetime serviceLifetime) { var serviceDescriptor = _services.SingleOrDefault(x => x.ServiceType == expected); - Assert.Equal(expected, serviceDescriptor.ServiceType); - Assert.Equal(serviceLifetime, serviceDescriptor.Lifetime); + await Assert.That(serviceDescriptor.ServiceType).IsEqualTo(expected); + await Assert.That(serviceDescriptor.Lifetime).IsEqualTo(serviceLifetime); } - [Fact] - public void ShouldHaveCommandProcessor() + [Test] + public async Task ShouldHaveCommandProcessor() { - Assert.Equal(typeof(CommandProcessor), _provider.GetService().GetType()); + await Assert.That(_provider.GetService().GetType()).IsEqualTo(typeof(CommandProcessor)); } - [Fact] - public void ShouldHaveServiceActivator() + [Test] + public async Task ShouldHaveServiceActivator() { - Assert.Equal(typeof(Dispatcher), _provider.GetService().GetType()); + await Assert.That(_provider.GetService().GetType()).IsEqualTo(typeof(Dispatcher)); } } diff --git a/tests/Paramore.Brighter.Extensions.Tests/AssemblyResolutionHandlerLifetimeScopedAndMapperLifetimeSingletonTests.cs b/tests/Paramore.Brighter.Extensions.Tests/AssemblyResolutionHandlerLifetimeScopedAndMapperLifetimeSingletonTests.cs index df5eca91fc..1142bd8e81 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/AssemblyResolutionHandlerLifetimeScopedAndMapperLifetimeSingletonTests.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/AssemblyResolutionHandlerLifetimeScopedAndMapperLifetimeSingletonTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter; @@ -9,7 +9,6 @@ using Paramore.Brighter.Policies.Handlers; using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection; -using Xunit; namespace Tests { @@ -28,66 +27,66 @@ public AssemblyResolutionHandlerLifetimeScopedAndMapperLifetimeSingletonTests() _provider = _services.BuildServiceProvider(); } - [Fact] - public void ShouldHaveCommandProcessorRegisteredCorrectly() + [Test] + public async Task ShouldHaveCommandProcessorRegisteredCorrectly() { - TestRegistration(typeof(IAmACommandProcessor), ServiceLifetime.Singleton); + await TestRegistration(typeof(IAmACommandProcessor), ServiceLifetime.Singleton); } - [Fact] - public void ShouldHaveServiceActivatorRegisteredCorrectly() + [Test] + public async Task ShouldHaveServiceActivatorRegisteredCorrectly() { - TestRegistration(typeof(IDispatcher), ServiceLifetime.Singleton); + await TestRegistration(typeof(IDispatcher), ServiceLifetime.Singleton); } - [Fact] - public void ShouldHaveTestHandlerRegisteredCorrectly() + [Test] + public async Task ShouldHaveTestHandlerRegisteredCorrectly() { - TestRegistration(typeof(TestEventHandler), ServiceLifetime.Transient); + await TestRegistration(typeof(TestEventHandler), ServiceLifetime.Transient); } - [Fact] - public void ShouldHaveTestMapperRegisteredCorrectly() + [Test] + public async Task ShouldHaveTestMapperRegisteredCorrectly() { - TestRegistration(typeof(TestEventMessageMapper), ServiceLifetime.Transient); + await TestRegistration(typeof(TestEventMessageMapper), ServiceLifetime.Transient); } - [Fact] - public void ShouldHaveDefaultHandlerRegisteredCorrectly() + [Test] + public async Task ShouldHaveDefaultHandlerRegisteredCorrectly() { - TestRegistration(typeof(ExceptionPolicyHandler<>), ServiceLifetime.Transient); - TestRegistration(typeof(FallbackPolicyHandler<>), ServiceLifetime.Transient); - TestRegistration(typeof(TimeoutPolicyHandler<>), ServiceLifetime.Transient); - TestRegistration(typeof(MonitorHandler<>), ServiceLifetime.Transient); - TestRegistration(typeof(UseInboxHandler<>), ServiceLifetime.Transient); - TestRegistration(typeof(RequestLoggingHandler<>), ServiceLifetime.Transient); + await TestRegistration(typeof(ExceptionPolicyHandler<>), ServiceLifetime.Transient); + await TestRegistration(typeof(FallbackPolicyHandler<>), ServiceLifetime.Transient); + await TestRegistration(typeof(TimeoutPolicyHandler<>), ServiceLifetime.Transient); + await TestRegistration(typeof(MonitorHandler<>), ServiceLifetime.Transient); + await TestRegistration(typeof(UseInboxHandler<>), ServiceLifetime.Transient); + await TestRegistration(typeof(RequestLoggingHandler<>), ServiceLifetime.Transient); } - private void TestRegistration(Type expected, ServiceLifetime serviceLifetime) + private async Task TestRegistration(Type expected, ServiceLifetime serviceLifetime) { var serviceDescriptor = _services.SingleOrDefault(x => x.ServiceType == expected); - Assert.Equal(expected, serviceDescriptor.ServiceType); - Assert.Equal(serviceLifetime, serviceDescriptor.Lifetime); + await Assert.That(serviceDescriptor.ServiceType).IsEqualTo(expected); + await Assert.That(serviceDescriptor.Lifetime).IsEqualTo(serviceLifetime); } - [Fact] - public void ShouldHaveCommandProcessor() + [Test] + public async Task ShouldHaveCommandProcessor() { - Assert.Equal(typeof(CommandProcessor), _provider.GetService().GetType()); + await Assert.That(_provider.GetService().GetType()).IsEqualTo(typeof(CommandProcessor)); } - [Fact] - public void ShouldHaveHandler() + [Test] + public async Task ShouldHaveHandler() { - Assert.NotNull(_provider.GetService()); + await Assert.That(_provider.GetService()).IsNotNull(); } - [Fact] - public void ShouldHaveMapper() + [Test] + public async Task ShouldHaveMapper() { - Assert.NotNull(_provider.GetService()); + await Assert.That(_provider.GetService()).IsNotNull(); } } } diff --git a/tests/Paramore.Brighter.Extensions.Tests/AssemblyResolutionMissingDependenciesTests.cs b/tests/Paramore.Brighter.Extensions.Tests/AssemblyResolutionMissingDependenciesTests.cs index f33f184ea2..205ed673d6 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/AssemblyResolutionMissingDependenciesTests.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/AssemblyResolutionMissingDependenciesTests.cs @@ -1,14 +1,13 @@ -using System; +using System; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; public class AssemblyResolutionMissingDependenciesTests { - [Fact] - public void When_we_auto_register_handlers_from_assemblies_with_missing_dependencies() + [Test] + public async Task When_we_auto_register_handlers_from_assemblies_with_missing_dependencies() { //arrange var factory = @@ -29,12 +28,12 @@ public void When_we_auto_register_handlers_from_assemblies_with_missing_dependen } catch (AggregateException ae) { - Assert.Contains("Some services are not able", ae.Message); + await Assert.That(ae.Message).Contains("Some services are not able"); caught = true; } //assert - Assert.True(caught); + await Assert.That(caught).IsTrue(); } } diff --git a/tests/Paramore.Brighter.Extensions.Tests/CommandProcessorIsolationTests.cs b/tests/Paramore.Brighter.Extensions.Tests/CommandProcessorIsolationTests.cs index 58ff79237d..6614ae68f0 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/CommandProcessorIsolationTests.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/CommandProcessorIsolationTests.cs @@ -29,7 +29,6 @@ THE SOFTWARE. */ using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.JsonConverters; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; @@ -39,8 +38,8 @@ namespace Paramore.Brighter.Extensions.Tests; /// public class CommandProcessorIsolationTests { - [Fact] - public void TwoCommandProcessors_HaveIsolatedState() + [Test] + public async Task TwoCommandProcessors_HaveIsolatedState() { // Arrange - Create two independent service providers var services1 = new ServiceCollection(); @@ -56,10 +55,10 @@ public void TwoCommandProcessors_HaveIsolatedState() var cp2 = provider2.GetRequiredService(); // Assert - They should be different instances - Assert.NotSame(cp1, cp2); + await Assert.That(cp2).IsNotSameReferenceAs(cp1); } - [Fact] + [Test] public async Task ParallelTests_DoNotInterfere() { // This test demonstrates that parallel execution is safe @@ -85,7 +84,7 @@ public async Task ParallelTests_DoNotInterfere() { for (int j = i + 1; j < 10; j++) { - Assert.NotSame(processors[i], processors[j]); + await Assert.That(processors[j]).IsNotSameReferenceAs(processors[i]); } } } @@ -95,7 +94,7 @@ public async Task ParallelTests_DoNotInterfere() /// Multiple test classes creating full Brighter setups with producers and outboxes in parallel. /// Previously, the static singleton pattern caused all tests to share the same outbox. /// - [Fact] + [Test] public async Task ParallelBrighterSetups_WithProducers_HaveIsolatedOutboxes() { // Arrange - simulate 5 parallel test setups @@ -150,7 +149,7 @@ public async Task ParallelBrighterSetups_WithProducers_HaveIsolatedOutboxes() { for (int j = i + 1; j < parallelTests; j++) { - Assert.NotSame(commandProcessors[i], commandProcessors[j]); + await Assert.That(commandProcessors[j]).IsNotSameReferenceAs(commandProcessors[i]); } } @@ -159,7 +158,7 @@ public async Task ParallelBrighterSetups_WithProducers_HaveIsolatedOutboxes() { for (int j = i + 1; j < parallelTests; j++) { - Assert.NotSame(outboxes[i], outboxes[j]); + await Assert.That(outboxes[j]).IsNotSameReferenceAs(outboxes[i]); } } } @@ -169,7 +168,7 @@ public async Task ParallelBrighterSetups_WithProducers_HaveIsolatedOutboxes() /// Brighter configuration using the new Func overloads. /// This is the recommended pattern for test isolation. /// - [Fact] + [Test] public async Task ParallelBrighterSetups_WithFuncOverloads_AreIsolated() { const int parallelTests = 5; @@ -225,8 +224,8 @@ public async Task ParallelBrighterSetups_WithFuncOverloads_AreIsolated() { for (int j = i + 1; j < parallelTests; j++) { - Assert.NotSame(results[i].Processor, results[j].Processor); - Assert.NotSame(results[i].Outbox, results[j].Outbox); + await Assert.That(results[j].Processor).IsNotSameReferenceAs(results[i].Processor); + await Assert.That(results[j].Outbox).IsNotSameReferenceAs(results[i].Outbox); } } } diff --git a/tests/Paramore.Brighter.Extensions.Tests/CommandProcessorSingletonTests.cs b/tests/Paramore.Brighter.Extensions.Tests/CommandProcessorSingletonTests.cs index 3d970c875f..7a8e70278a 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/CommandProcessorSingletonTests.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/CommandProcessorSingletonTests.cs @@ -29,7 +29,6 @@ THE SOFTWARE. */ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; @@ -45,8 +44,8 @@ public class CommandProcessorSingletonTests /// Verifies that resolving IAmACommandProcessor twice from the same /// service provider returns the exact same instance. /// - [Fact] - public void SameProvider_MultipleResolutions_ReturnsSameInstance() + [Test] + public async Task SameProvider_MultipleResolutions_ReturnsSameInstance() { // Arrange var services = new ServiceCollection(); @@ -59,16 +58,16 @@ public void SameProvider_MultipleResolutions_ReturnsSameInstance() var processor3 = provider.GetRequiredService(); // Assert - All should be the exact same instance - Assert.Same(processor1, processor2); - Assert.Same(processor2, processor3); + await Assert.That(processor2).IsSameReferenceAs(processor1); + await Assert.That(processor3).IsSameReferenceAs(processor2); } /// /// Verifies that resolving IAmACommandProcessor from different scopes /// within the same service provider returns the same singleton instance. /// - [Fact] - public void SameProvider_DifferentScopes_ReturnsSameInstance() + [Test] + public async Task SameProvider_DifferentScopes_ReturnsSameInstance() { // Arrange var services = new ServiceCollection(); @@ -94,15 +93,15 @@ public void SameProvider_DifferentScopes_ReturnsSameInstance() } // Assert - All should be the same singleton instance - Assert.Same(processor1, processor2); - Assert.Same(processor2, processor3); + await Assert.That(processor2).IsSameReferenceAs(processor1); + await Assert.That(processor3).IsSameReferenceAs(processor2); } /// /// Verifies that concurrent resolution of IAmACommandProcessor from multiple /// threads returns the same singleton instance to all threads. /// - [Fact] + [Test] public async Task SameProvider_ConcurrentResolutions_ReturnsSameInstance() { // Arrange @@ -128,15 +127,15 @@ public async Task SameProvider_ConcurrentResolutions_ReturnsSameInstance() // Assert - All 100 resolutions should return the same instance var distinctProcessors = processors.Distinct().ToList(); - Assert.Single(distinctProcessors); + await Assert.That(distinctProcessors).HasSingleItem(); } /// /// Verifies that the command processor singleton is preserved when resolved /// alongside other services in the same scope. /// - [Fact] - public void SameProvider_ResolvedWithOtherServices_ReturnsSameInstance() + [Test] + public async Task SameProvider_ResolvedWithOtherServices_ReturnsSameInstance() { // Arrange var services = new ServiceCollection(); @@ -161,16 +160,16 @@ public void SameProvider_ResolvedWithOtherServices_ReturnsSameInstance() } // Assert - Assert.Same(processorFromRoot, processorFromScope1); - Assert.Same(processorFromScope1, processorFromScope2); + await Assert.That(processorFromScope1).IsSameReferenceAs(processorFromRoot); + await Assert.That(processorFromScope2).IsSameReferenceAs(processorFromScope1); } /// /// Verifies that the command processor instance is the same when resolved /// sequentially many times in a loop. /// - [Fact] - public void SameProvider_ManySequentialResolutions_ReturnsSameInstance() + [Test] + public async Task SameProvider_ManySequentialResolutions_ReturnsSameInstance() { // Arrange var services = new ServiceCollection(); @@ -185,7 +184,7 @@ public void SameProvider_ManySequentialResolutions_ReturnsSameInstance() var processor = provider.GetRequiredService(); // Assert each one is the same - Assert.Same(firstProcessor, processor); + await Assert.That(processor).IsSameReferenceAs(firstProcessor); } } @@ -193,8 +192,8 @@ public void SameProvider_ManySequentialResolutions_ReturnsSameInstance() /// Verifies that when producers are configured, the command processor /// is still a singleton across multiple resolutions. /// - [Fact] - public void WithProducers_MultipleResolutions_ReturnsSameInstance() + [Test] + public async Task WithProducers_MultipleResolutions_ReturnsSameInstance() { // Arrange var timeProvider = new FakeTimeProvider(); @@ -230,16 +229,16 @@ public void WithProducers_MultipleResolutions_ReturnsSameInstance() var processor3 = scope.ServiceProvider.GetRequiredService(); // Assert - Assert.Same(processor1, processor2); - Assert.Same(processor2, processor3); + await Assert.That(processor2).IsSameReferenceAs(processor1); + await Assert.That(processor3).IsSameReferenceAs(processor2); } /// /// Verifies that using the Func overloads still results in a singleton /// command processor. /// - [Fact] - public void WithFuncOverloads_MultipleResolutions_ReturnsSameInstance() + [Test] + public async Task WithFuncOverloads_MultipleResolutions_ReturnsSameInstance() { // Arrange var timeProvider = new FakeTimeProvider(); @@ -282,15 +281,15 @@ public void WithFuncOverloads_MultipleResolutions_ReturnsSameInstance() var processor3 = scope.ServiceProvider.GetRequiredService(); // Assert - Assert.Same(processor1, processor2); - Assert.Same(processor2, processor3); + await Assert.That(processor2).IsSameReferenceAs(processor1); + await Assert.That(processor3).IsSameReferenceAs(processor2); } /// /// Verifies that concurrent resolutions with producers configured /// all return the same singleton instance. /// - [Fact] + [Test] public async Task WithProducers_ConcurrentResolutions_ReturnsSameInstance() { // Arrange @@ -337,14 +336,14 @@ public async Task WithProducers_ConcurrentResolutions_ReturnsSameInstance() // Assert - All should be the same instance var distinctProcessors = processors.Distinct().ToList(); - Assert.Single(distinctProcessors); + await Assert.That(distinctProcessors).HasSingleItem(); } /// /// Verifies that concurrent resolutions from different scopes /// all return the same singleton instance. /// - [Fact] + [Test] public async Task SameProvider_ConcurrentScopedResolutions_ReturnsSameInstance() { // Arrange @@ -371,14 +370,14 @@ public async Task SameProvider_ConcurrentScopedResolutions_ReturnsSameInstance() // Assert - All should be the same singleton instance var distinctProcessors = processors.Distinct().ToList(); - Assert.Single(distinctProcessors); + await Assert.That(distinctProcessors).HasSingleItem(); } /// /// Verifies that the command processor is only instantiated once even under /// heavy concurrent load using an instantiation counter. /// - [Fact] + [Test] public async Task SameProvider_ConcurrentResolutions_OnlyInstantiatesOnce() { // This test verifies that the singleton is truly only created once @@ -426,15 +425,15 @@ public async Task SameProvider_ConcurrentResolutions_OnlyInstantiatesOnce() await Task.WhenAll(tasks); // Assert - Assert.Equal(1, instantiationCount); - Assert.Single(processors.Distinct()); + await Assert.That(instantiationCount).IsEqualTo(1); + await Assert.That(processors.Distinct()).HasSingleItem(); } /// /// Verifies that the GetHashCode of all resolved processors is identical, /// providing another confirmation they are the same object instance. /// - [Fact] + [Test] public async Task SameProvider_AllResolutions_HaveSameHashCode() { // Arrange @@ -458,15 +457,15 @@ public async Task SameProvider_AllResolutions_HaveSameHashCode() // Assert - All hash codes should be the same var distinctHashCodes = hashCodes.Distinct().ToList(); - Assert.Single(distinctHashCodes); + await Assert.That(distinctHashCodes).HasSingleItem(); } /// /// Verifies that even when resolving from nested scopes, /// the same singleton instance is returned. /// - [Fact] - public void SameProvider_NestedScopes_ReturnsSameInstance() + [Test] + public async Task SameProvider_NestedScopes_ReturnsSameInstance() { // Arrange var services = new ServiceCollection(); @@ -494,9 +493,9 @@ public void SameProvider_NestedScopes_ReturnsSameInstance() } // Assert - Assert.Same(processorFromRoot, processorFromLevel1); - Assert.Same(processorFromLevel1, processorFromLevel2); - Assert.Same(processorFromLevel2, processorFromLevel3); + await Assert.That(processorFromLevel1).IsSameReferenceAs(processorFromRoot); + await Assert.That(processorFromLevel2).IsSameReferenceAs(processorFromLevel1); + await Assert.That(processorFromLevel3).IsSameReferenceAs(processorFromLevel2); } private class SingletonTestCommand : Command diff --git a/tests/Paramore.Brighter.Extensions.Tests/DispatcherResolutionScopedDependencyTests.cs b/tests/Paramore.Brighter.Extensions.Tests/DispatcherResolutionScopedDependencyTests.cs index 689a0b6a68..5dc207a3ca 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/DispatcherResolutionScopedDependencyTests.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/DispatcherResolutionScopedDependencyTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -11,7 +11,6 @@ using Paramore.Brighter.ServiceActivator.Extensions.Hosting; using Paramore.Brighter.Sqlite; using Paramore.Brighter.Sqlite.EntityFrameworkCore; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; @@ -19,22 +18,22 @@ public class DispatcherResolutionScopedDependencyTests { private IServiceProvider? _provider; - [Fact] - public void ShouldResolveIDispatcherCorrectly() + [Test] + public async Task ShouldResolveIDispatcherCorrectly() { Build(new InternalBus()); - Assert.NotNull(_provider); + await Assert.That(_provider).IsNotNull(); //will throw if cannot be found _provider.GetRequiredService(); } - [Fact] - public void ShouldResolveIDispatcherCorrectlyWithHost() + [Test] + public async Task ShouldResolveIDispatcherCorrectlyWithHost() { BuildHost(new InternalBus()); - Assert.NotNull(_provider); + await Assert.That(_provider).IsNotNull(); //will throw if cannot be found _provider.GetRequiredService(); } diff --git a/tests/Paramore.Brighter.Extensions.Tests/FactoryErrorHandlingTests.cs b/tests/Paramore.Brighter.Extensions.Tests/FactoryErrorHandlingTests.cs index fbc27b78cb..4b65df9626 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/FactoryErrorHandlingTests.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/FactoryErrorHandlingTests.cs @@ -24,7 +24,6 @@ THE SOFTWARE. */ using System; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; @@ -33,8 +32,8 @@ namespace Paramore.Brighter.Extensions.Tests; /// public class FactoryErrorHandlingTests { - [Fact] - public void Factory_UnregisteredHandler_ReturnsNull() + [Test] + public async Task Factory_UnregisteredHandler_ReturnsNull() { // Arrange var services = new ServiceCollection(); @@ -52,11 +51,11 @@ public void Factory_UnregisteredHandler_ReturnsNull() var handler = ((IAmAHandlerFactorySync)factory).Create(typeof(UnregisteredHandler), lifetime); // Assert - Should return null for unregistered handler - Assert.Null(handler); + await Assert.That(handler).IsNull(); } - [Fact] - public void Factory_NullLifetime_HandlesGracefullyForTransient() + [Test] + public async Task Factory_NullLifetime_HandlesGracefullyForTransient() { // Arrange var services = new ServiceCollection(); @@ -74,18 +73,18 @@ public void Factory_NullLifetime_HandlesGracefullyForTransient() { var handler = ((IAmAHandlerFactorySync)factory).Create(typeof(SimpleHandler), null!); // If it doesn't throw, it should return a valid handler - Assert.NotNull(handler); + await Assert.That(handler).IsNotNull(); } catch (ArgumentNullException) { // Acceptable - throwing ArgumentNullException for null lifetime - Assert.True(true); + await Assert.That(true).IsTrue(); } // Note: NullReferenceException would indicate a bug - null should be validated explicitly } - [Fact] - public void Factory_InvalidHandlerType_ReturnsNull() + [Test] + public async Task Factory_InvalidHandlerType_ReturnsNull() { // Arrange var services = new ServiceCollection(); @@ -102,11 +101,11 @@ public void Factory_InvalidHandlerType_ReturnsNull() var result = ((IAmAHandlerFactorySync)factory).Create(typeof(string), lifetime); // Assert - Should return null for non-handler types - Assert.Null(result); + await Assert.That(result).IsNull(); } - [Fact] - public void Factory_MissingBrighterOptions_UsesDefaultTransient() + [Test] + public async Task Factory_MissingBrighterOptions_UsesDefaultTransient() { // Arrange - Don't register IBrighterOptions var services = new ServiceCollection(); @@ -121,7 +120,7 @@ public void Factory_MissingBrighterOptions_UsesDefaultTransient() var handler = ((IAmAHandlerFactorySync)factory).Create(typeof(SimpleHandler), lifetime); // Assert - Should use default Transient lifetime and work - Assert.NotNull(handler); + await Assert.That(handler).IsNotNull(); } private class UnregisteredHandler : RequestHandler diff --git a/tests/Paramore.Brighter.Extensions.Tests/FactoryLifetimeTests.cs b/tests/Paramore.Brighter.Extensions.Tests/FactoryLifetimeTests.cs index 3185ccbcfb..96d738a4f5 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/FactoryLifetimeTests.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/FactoryLifetimeTests.cs @@ -26,14 +26,13 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; public class FactoryLifetimeTests { - [Fact] - public void Factory_WithScopedLifetime_ReturnsSameInstanceWithinScope() + [Test] + public async Task Factory_WithScopedLifetime_ReturnsSameInstanceWithinScope() { // Arrange var services = new ServiceCollection(); @@ -52,11 +51,11 @@ public void Factory_WithScopedLifetime_ReturnsSameInstanceWithinScope() var handler2 = ((IAmAHandlerFactorySync)factory).Create(typeof(TestHandler), lifetime); // Assert - Same scope should return same instance - Assert.Same(handler1, handler2); + await Assert.That(handler2).IsSameReferenceAs(handler1); } - [Fact] - public void Factory_WithScopedLifetime_ReturnsDifferentInstancesAcrossScopes() + [Test] + public async Task Factory_WithScopedLifetime_ReturnsDifferentInstancesAcrossScopes() { // Arrange var services = new ServiceCollection(); @@ -76,11 +75,11 @@ public void Factory_WithScopedLifetime_ReturnsDifferentInstancesAcrossScopes() var handler2 = ((IAmAHandlerFactorySync)factory).Create(typeof(TestHandler), lifetime2); // Assert - Different scopes should return different instances - Assert.NotSame(handler1, handler2); + await Assert.That(handler2).IsNotSameReferenceAs(handler1); } - [Fact] - public void Factory_WithTransientLifetime_ReturnsDifferentInstancesEachTime() + [Test] + public async Task Factory_WithTransientLifetime_ReturnsDifferentInstancesEachTime() { // Arrange var services = new ServiceCollection(); @@ -99,11 +98,11 @@ public void Factory_WithTransientLifetime_ReturnsDifferentInstancesEachTime() var handler2 = ((IAmAHandlerFactorySync)factory).Create(typeof(TestHandler), lifetime); // Assert - Transient should return new instance each time - Assert.NotSame(handler1, handler2); + await Assert.That(handler2).IsNotSameReferenceAs(handler1); } - [Fact] - public void Factory_WithSingletonLifetime_ReturnsSameInstanceAcrossScopes() + [Test] + public async Task Factory_WithSingletonLifetime_ReturnsSameInstanceAcrossScopes() { // Arrange var services = new ServiceCollection(); @@ -123,11 +122,11 @@ public void Factory_WithSingletonLifetime_ReturnsSameInstanceAcrossScopes() var handler2 = ((IAmAHandlerFactorySync)factory).Create(typeof(TestHandler), lifetime2); // Assert - Singleton should return same instance regardless of scope - Assert.Same(handler1, handler2); + await Assert.That(handler2).IsSameReferenceAs(handler1); } - [Fact] - public void AsyncFactory_WithSingletonLifetime_ReturnsSameInstanceAcrossScopes() + [Test] + public async Task AsyncFactory_WithSingletonLifetime_ReturnsSameInstanceAcrossScopes() { // Arrange var services = new ServiceCollection(); @@ -147,11 +146,11 @@ public void AsyncFactory_WithSingletonLifetime_ReturnsSameInstanceAcrossScopes() var handler2 = ((IAmAHandlerFactoryAsync)factory).Create(typeof(TestAsyncHandler), lifetime2); // Assert - Singleton should return same instance regardless of scope - Assert.Same(handler1, handler2); + await Assert.That(handler2).IsSameReferenceAs(handler1); } - [Fact] - public void AsyncFactory_WithScopedLifetime_ReturnsSameInstanceWithinScope() + [Test] + public async Task AsyncFactory_WithScopedLifetime_ReturnsSameInstanceWithinScope() { // Arrange var services = new ServiceCollection(); @@ -170,11 +169,11 @@ public void AsyncFactory_WithScopedLifetime_ReturnsSameInstanceWithinScope() var handler2 = ((IAmAHandlerFactoryAsync)factory).Create(typeof(TestAsyncHandler), lifetime); // Assert - Assert.Same(handler1, handler2); + await Assert.That(handler2).IsSameReferenceAs(handler1); } - [Fact] - public void AsyncFactory_WithScopedLifetime_ReturnsDifferentInstancesAcrossScopes() + [Test] + public async Task AsyncFactory_WithScopedLifetime_ReturnsDifferentInstancesAcrossScopes() { // Arrange var services = new ServiceCollection(); @@ -194,11 +193,11 @@ public void AsyncFactory_WithScopedLifetime_ReturnsDifferentInstancesAcrossScope var handler2 = ((IAmAHandlerFactoryAsync)factory).Create(typeof(TestAsyncHandler), lifetime2); // Assert - Assert.NotSame(handler1, handler2); + await Assert.That(handler2).IsNotSameReferenceAs(handler1); } - [Fact] - public void AsyncFactory_WithTransientLifetime_ReturnsDifferentInstances() + [Test] + public async Task AsyncFactory_WithTransientLifetime_ReturnsDifferentInstances() { // Arrange var services = new ServiceCollection(); @@ -217,11 +216,11 @@ public void AsyncFactory_WithTransientLifetime_ReturnsDifferentInstances() var handler2 = ((IAmAHandlerFactoryAsync)factory).Create(typeof(TestAsyncHandler), lifetime); // Assert - Assert.NotSame(handler1, handler2); + await Assert.That(handler2).IsNotSameReferenceAs(handler1); } - [Fact] - public void Factory_HandlerWithDependency_ResolvesBothCorrectly() + [Test] + public async Task Factory_HandlerWithDependency_ResolvesBothCorrectly() { // Arrange var services = new ServiceCollection(); @@ -240,12 +239,12 @@ public void Factory_HandlerWithDependency_ResolvesBothCorrectly() var handler = (HandlerWithDependency)((IAmAHandlerFactorySync)factory).Create(typeof(HandlerWithDependency), lifetime)!; // Assert - Assert.NotNull(handler); - Assert.NotNull(handler.Dependency); + await Assert.That(handler).IsNotNull(); + await Assert.That(handler.Dependency).IsNotNull(); } - [Fact] - public void Factory_Release_ClearsHandlerFromCache() + [Test] + public async Task Factory_Release_ClearsHandlerFromCache() { // Arrange var services = new ServiceCollection(); @@ -265,12 +264,12 @@ public void Factory_Release_ClearsHandlerFromCache() var handler2 = ((IAmAHandlerFactorySync)factory).Create(typeof(TestHandler), lifetime); // Assert - After release, we should get a new handler instance - Assert.NotNull(handler2); - Assert.NotSame(handler1, handler2); + await Assert.That(handler2).IsNotNull(); + await Assert.That(handler2).IsNotSameReferenceAs(handler1); } - [Fact] - public void Factory_WithScopedLifetime_TracksDisposableHandler() + [Test] + public async Task Factory_WithScopedLifetime_TracksDisposableHandler() { // Arrange var services = new ServiceCollection(); @@ -288,8 +287,8 @@ public void Factory_WithScopedLifetime_TracksDisposableHandler() var handler = (DisposableTestHandler)((IAmAHandlerFactorySync)factory).Create(typeof(DisposableTestHandler), lifetime)!; // Assert - Handler should be created and not disposed initially - Assert.NotNull(handler); - Assert.False(handler.IsDisposed); + await Assert.That(handler).IsNotNull(); + await Assert.That(handler.IsDisposed).IsFalse(); } private class TestHandler : RequestHandler diff --git a/tests/Paramore.Brighter.Extensions.Tests/FactoryThreadSafetyTests.cs b/tests/Paramore.Brighter.Extensions.Tests/FactoryThreadSafetyTests.cs index e9d8044d4b..65181e3cb5 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/FactoryThreadSafetyTests.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/FactoryThreadSafetyTests.cs @@ -28,7 +28,6 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; @@ -37,7 +36,7 @@ namespace Paramore.Brighter.Extensions.Tests; /// public class FactoryThreadSafetyTests { - [Fact] + [Test] public async Task ConcurrentSingletonResolution_ReturnsSameInstance() { // Arrange @@ -68,10 +67,10 @@ public async Task ConcurrentSingletonResolution_ReturnsSameInstance() // Assert - All should be the same instance var distinctHandlers = handlers.Distinct().ToList(); - Assert.Single(distinctHandlers); + await Assert.That(distinctHandlers).HasSingleItem(); } - [Fact] + [Test] public async Task ConcurrentScopedResolution_SameScopeReturnsSameInstance() { // Arrange @@ -102,10 +101,10 @@ public async Task ConcurrentScopedResolution_SameScopeReturnsSameInstance() // Assert - All should be the same instance (same scope) var distinctHandlers = handlers.Distinct().ToList(); - Assert.Single(distinctHandlers); + await Assert.That(distinctHandlers).HasSingleItem(); } - [Fact] + [Test] public async Task ConcurrentTransientResolution_ReturnsDifferentInstances() { // Arrange @@ -136,10 +135,10 @@ public async Task ConcurrentTransientResolution_ReturnsDifferentInstances() // Assert - All should be different instances var distinctHandlers = handlers.Distinct().ToList(); - Assert.Equal(50, distinctHandlers.Count); + await Assert.That(distinctHandlers.Count).IsEqualTo(50); } - [Fact] + [Test] public async Task ConcurrentSingletonResolution_OnlyCreatesOneInstance() { // Arrange - Use a handler that tracks instantiation count @@ -173,8 +172,8 @@ public async Task ConcurrentSingletonResolution_OnlyCreatesOneInstance() await Task.WhenAll(tasks); // Assert - Only ONE instance should have been created - Assert.Equal(1, CountingHandler.InstanceCount); - Assert.Single(handlers.Distinct()); + await Assert.That(CountingHandler.InstanceCount).IsEqualTo(1); + await Assert.That(handlers.Distinct()).HasSingleItem(); } private class ThreadSafetyTestHandler : RequestHandler diff --git a/tests/Paramore.Brighter.Extensions.Tests/LifetimeConfigurationTests.cs b/tests/Paramore.Brighter.Extensions.Tests/LifetimeConfigurationTests.cs index 2e0fc456cd..c594b977aa 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/LifetimeConfigurationTests.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/LifetimeConfigurationTests.cs @@ -27,7 +27,6 @@ THE SOFTWARE. */ using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; @@ -40,8 +39,8 @@ namespace Paramore.Brighter.Extensions.Tests; /// public class LifetimeConfigurationTests { - [Fact] - public void AddBrighter_WithDefaultLifetimes_RegistersAllAsTransient() + [Test] + public async Task AddBrighter_WithDefaultLifetimes_RegistersAllAsTransient() { // Arrange var services = new ServiceCollection(); @@ -52,15 +51,15 @@ public void AddBrighter_WithDefaultLifetimes_RegistersAllAsTransient() // Assert - All components are registered as Transient in DI // (Actual handler lifetime is managed by ServiceProviderHandlerFactory at runtime) var handlerDescriptor = services.FirstOrDefault(x => x.ServiceType == typeof(TestEventHandler)); - Assert.NotNull(handlerDescriptor); - Assert.Equal(ServiceLifetime.Transient, handlerDescriptor.Lifetime); + await Assert.That(handlerDescriptor).IsNotNull(); + await Assert.That(handlerDescriptor.Lifetime).IsEqualTo(ServiceLifetime.Transient); var mapperDescriptor = services.FirstOrDefault(x => x.ServiceType == typeof(TestEventMessageMapper)); - Assert.NotNull(mapperDescriptor); - Assert.Equal(ServiceLifetime.Transient, mapperDescriptor.Lifetime); + await Assert.That(mapperDescriptor).IsNotNull(); + await Assert.That(mapperDescriptor.Lifetime).IsEqualTo(ServiceLifetime.Transient); var transformerDescriptor = services.FirstOrDefault(x => x.ServiceType == typeof(TestTransform)); - Assert.NotNull(transformerDescriptor); - Assert.Equal(ServiceLifetime.Transient, transformerDescriptor.Lifetime); + await Assert.That(transformerDescriptor).IsNotNull(); + await Assert.That(transformerDescriptor.Lifetime).IsEqualTo(ServiceLifetime.Transient); } } diff --git a/tests/Paramore.Brighter.Extensions.Tests/Paramore.Brighter.Extensions.Tests.csproj b/tests/Paramore.Brighter.Extensions.Tests/Paramore.Brighter.Extensions.Tests.csproj index de101fbf53..363f694f02 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/Paramore.Brighter.Extensions.Tests.csproj +++ b/tests/Paramore.Brighter.Extensions.Tests/Paramore.Brighter.Extensions.Tests.csproj @@ -1,27 +1,16 @@ - $(BrighterTestTargetFrameworks) false + Exe - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - all - runtime; build; native; contentfiles; analyzers - + - @@ -29,5 +18,4 @@ - - + \ No newline at end of file diff --git a/tests/Paramore.Brighter.Extensions.Tests/ServiceProviderLambdaTests.cs b/tests/Paramore.Brighter.Extensions.Tests/ServiceProviderLambdaTests.cs index 48dd611232..dac14b6a44 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/ServiceProviderLambdaTests.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/ServiceProviderLambdaTests.cs @@ -29,14 +29,13 @@ THE SOFTWARE. */ using Microsoft.Extensions.Options; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; public class ServiceProviderLambdaTests { - [Fact] - public void AddBrighter_WithServiceProviderFunc_ResolvesServicesCorrectly() + [Test] + public async Task AddBrighter_WithServiceProviderFunc_ResolvesServicesCorrectly() { // Arrange var services = new ServiceCollection(); @@ -52,12 +51,12 @@ public void AddBrighter_WithServiceProviderFunc_ResolvesServicesCorrectly() var options = provider.GetRequiredService(); // Assert - Assert.NotNull(options); - Assert.IsType(options.RequestContextFactory); + await Assert.That(options).IsNotNull(); + await Assert.That(options.RequestContextFactory).IsTypeOf(); } - [Fact] - public void AddBrighter_SupportsPostConfigure_ForTestOverrides() + [Test] + public async Task AddBrighter_SupportsPostConfigure_ForTestOverrides() { // Arrange var services = new ServiceCollection(); @@ -79,12 +78,12 @@ public void AddBrighter_SupportsPostConfigure_ForTestOverrides() var options = provider.GetRequiredService(); // Assert - PostConfigure should have applied - Assert.Same(customFactory, options.RequestContextFactory); - Assert.Equal(ServiceLifetime.Scoped, options.HandlerLifetime); + await Assert.That(options.RequestContextFactory).IsSameReferenceAs(customFactory); + await Assert.That(options.HandlerLifetime).IsEqualTo(ServiceLifetime.Scoped); } - [Fact] - public void AddProducers_WithServiceProviderFunc_DefersConfiguration() + [Test] + public async Task AddProducers_WithServiceProviderFunc_DefersConfiguration() { // Arrange var services = new ServiceCollection(); @@ -102,12 +101,12 @@ public void AddProducers_WithServiceProviderFunc_DefersConfiguration() var config = provider.GetService(); // Assert - Assert.NotNull(config); - Assert.Same(producerRegistry, config.ProducerRegistry); + await Assert.That(config).IsNotNull(); + await Assert.That(config.ProducerRegistry).IsSameReferenceAs(producerRegistry); } - [Fact] - public void AddConsumers_WithServiceProviderFunc_ResolvesServicesCorrectly() + [Test] + public async Task AddConsumers_WithServiceProviderFunc_ResolvesServicesCorrectly() { // Arrange var services = new ServiceCollection(); @@ -125,12 +124,12 @@ public void AddConsumers_WithServiceProviderFunc_ResolvesServicesCorrectly() var options = provider.GetService(); // Assert - Assert.NotNull(options); - Assert.Same(channelFactory, options.DefaultChannelFactory); + await Assert.That(options).IsNotNull(); + await Assert.That(options.DefaultChannelFactory).IsSameReferenceAs(channelFactory); } - [Fact] - public void AddBrighter_WithActionOverload_StillWorks() + [Test] + public async Task AddBrighter_WithActionOverload_StillWorks() { // Arrange var services = new ServiceCollection(); @@ -145,11 +144,11 @@ public void AddBrighter_WithActionOverload_StillWorks() var options = provider.GetRequiredService(); // Assert - Assert.Equal(ServiceLifetime.Scoped, options.HandlerLifetime); + await Assert.That(options.HandlerLifetime).IsEqualTo(ServiceLifetime.Scoped); } - [Fact] - public void AddBrighter_WithNoConfiguration_UsesDefaults() + [Test] + public async Task AddBrighter_WithNoConfiguration_UsesDefaults() { // Arrange var services = new ServiceCollection(); @@ -161,6 +160,6 @@ public void AddBrighter_WithNoConfiguration_UsesDefaults() var options = provider.GetRequiredService(); // Assert - Assert.Equal(ServiceLifetime.Transient, options.HandlerLifetime); + await Assert.That(options.HandlerLifetime).IsEqualTo(ServiceLifetime.Transient); } } diff --git a/tests/Paramore.Brighter.Extensions.Tests/TestDifferentSetups.cs b/tests/Paramore.Brighter.Extensions.Tests/TestDifferentSetups.cs index 1b0771e540..556e1c6c3d 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/TestDifferentSetups.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/TestDifferentSetups.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Data; using System.Data.Common; @@ -12,14 +12,13 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Tests { public class TestBrighterExtension { - [Fact] - public void BasicSetup() + [Test] + public async Task BasicSetup() { var serviceCollection = new ServiceCollection(); @@ -29,13 +28,13 @@ public void BasicSetup() var commandProcessor = serviceProvider.GetService(); - Assert.NotNull(commandProcessor); + await Assert.That(commandProcessor).IsNotNull(); } - [Theory] - [InlineData(typeof(SomeSqlConnectionProvider), typeof(StubSqlTransactionProvider))] - [InlineData(typeof(StubSqlTransactionProvider), typeof(StubSqlTransactionProvider))] - public void WithExternalBus(Type connectionProvider, Type transactionProvider) + [Test] + [Arguments(typeof(SomeSqlConnectionProvider), typeof(StubSqlTransactionProvider))] + [Arguments(typeof(StubSqlTransactionProvider), typeof(StubSqlTransactionProvider))] + public async Task WithExternalBus(Type connectionProvider, Type transactionProvider) { var serviceCollection = new ServiceCollection(); const string mytopic = "MyTopic"; @@ -79,11 +78,11 @@ public void WithExternalBus(Type connectionProvider, Type transactionProvider) var commandProcessor = serviceProvider.GetService(); - Assert.NotNull(commandProcessor); + await Assert.That(commandProcessor).IsNotNull(); } - [Fact] - public void WithCustomPolicy() + [Test] + public async Task WithCustomPolicy() { var serviceCollection = new ServiceCollection(); @@ -107,24 +106,24 @@ public void WithCustomPolicy() var commandProcessor = serviceProvider.GetService(); - Assert.NotNull(commandProcessor); + await Assert.That(commandProcessor).IsNotNull(); } - [Fact] - public void WithScopedLifetime() + [Test] + public async Task WithScopedLifetime() { var serviceCollection = new ServiceCollection(); serviceCollection.AddBrighter( ).AutoFromAssemblies(); - Assert.Equal(ServiceLifetime.Singleton, serviceCollection.SingleOrDefault(x => x.ServiceType == typeof(IAmACommandProcessor))?.Lifetime); + await Assert.That(serviceCollection.SingleOrDefault(x => x.ServiceType == typeof(IAmACommandProcessor))?.Lifetime).IsEqualTo(ServiceLifetime.Singleton); var serviceProvider = serviceCollection.BuildServiceProvider(); var commandProcessor = serviceProvider.GetService(); - Assert.NotNull(commandProcessor); + await Assert.That(commandProcessor).IsNotNull(); } public class SomeSqlConnectionProvider : RelationalDbConnectionProvider diff --git a/tests/Paramore.Brighter.Extensions.Tests/TransformerFactoryTests.cs b/tests/Paramore.Brighter.Extensions.Tests/TransformerFactoryTests.cs index 6459747650..b76afbed75 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/TransformerFactoryTests.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/TransformerFactoryTests.cs @@ -1,7 +1,6 @@ -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; @@ -10,8 +9,8 @@ public class TransformerFactoryTests private ServiceProviderTransformerFactory _transformFactory; private ServiceProviderTransformerFactoryAsync _transformFactoryAsync; - [Fact] - public void When_resolving_a_transformer_from_the_factory() + [Test] + public async Task When_resolving_a_transformer_from_the_factory() { //arrange var collection = new ServiceCollection(); @@ -25,11 +24,11 @@ public void When_resolving_a_transformer_from_the_factory() var testTransform = _transformFactory.Create(typeof(TestTransform)); //assert - Assert.NotNull(testTransform); + await Assert.That(testTransform).IsNotNull(); } - [Fact] - public void When_resolving_a_transformer_from_the_factory_async() + [Test] + public async Task When_resolving_a_transformer_from_the_factory_async() { //arrange var collection = new ServiceCollection(); @@ -43,11 +42,11 @@ public void When_resolving_a_transformer_from_the_factory_async() var testTransform = _transformFactoryAsync.Create(typeof(TestTransform)); //assert - Assert.NotNull(testTransform); + await Assert.That(testTransform).IsNotNull(); } - [Fact] - public void When_resolving_a_missing_transformer_from_the_factory() + [Test] + public async Task When_resolving_a_missing_transformer_from_the_factory() { //arrange var collection = new ServiceCollection(); @@ -60,11 +59,11 @@ public void When_resolving_a_missing_transformer_from_the_factory() var testTransform = _transformFactory.Create(typeof(TestTransform)); //assert - Assert.Null(testTransform); + await Assert.That(testTransform).IsNull(); } - [Fact] - public void When_resolving_a_missing_transformer_from_the_factory_async() + [Test] + public async Task When_resolving_a_missing_transformer_from_the_factory_async() { //arrange var collection = new ServiceCollection(); @@ -77,6 +76,6 @@ public void When_resolving_a_missing_transformer_from_the_factory_async() var testTransform = _transformFactoryAsync.Create(typeof(TestTransform)); //assert - Assert.Null(testTransform); + await Assert.That(testTransform).IsNull(); } } diff --git a/tests/Paramore.Brighter.Extensions.Tests/When_add_consumers_with_validation_should_set_consumer_owns_flag.cs b/tests/Paramore.Brighter.Extensions.Tests/When_add_consumers_with_validation_should_set_consumer_owns_flag.cs index d8b810043d..b4f3713539 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/When_add_consumers_with_validation_should_set_consumer_owns_flag.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/When_add_consumers_with_validation_should_set_consumer_owns_flag.cs @@ -26,14 +26,13 @@ THE SOFTWARE. */ using Microsoft.Extensions.Options; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; public class AddConsumersValidationFlagTests { - [Fact] - public void When_validate_pipelines_then_add_consumers_should_set_consumer_owns_validation_true() + [Test] + public async Task When_validate_pipelines_then_add_consumers_should_set_consumer_owns_validation_true() { // Arrange var services = new ServiceCollection(); @@ -46,11 +45,11 @@ public void When_validate_pipelines_then_add_consumers_should_set_consumer_owns_ // Assert var provider = services.BuildServiceProvider(); var options = provider.GetRequiredService>().Value; - Assert.True(options.ConsumerOwnsValidation); + await Assert.That(options.ConsumerOwnsValidation).IsTrue(); } - [Fact] - public void When_add_consumers_then_validate_pipelines_should_set_consumer_owns_validation_true() + [Test] + public async Task When_add_consumers_then_validate_pipelines_should_set_consumer_owns_validation_true() { // Arrange var services = new ServiceCollection(); @@ -62,11 +61,11 @@ public void When_add_consumers_then_validate_pipelines_should_set_consumer_owns_ // Assert var provider = services.BuildServiceProvider(); var options = provider.GetRequiredService>().Value; - Assert.True(options.ConsumerOwnsValidation); + await Assert.That(options.ConsumerOwnsValidation).IsTrue(); } - [Fact] - public void When_add_consumers_without_validate_pipelines_should_not_register_validation_options() + [Test] + public async Task When_add_consumers_without_validate_pipelines_should_not_register_validation_options() { // Arrange var services = new ServiceCollection(); @@ -79,6 +78,6 @@ public void When_add_consumers_without_validate_pipelines_should_not_register_va // ValidatePipelines, no IAmAPipelineValidator is registered. var provider = services.BuildServiceProvider(); var validator = provider.GetService(); - Assert.Null(validator); + await Assert.That(validator).IsNull(); } } diff --git a/tests/Paramore.Brighter.Extensions.Tests/When_building_dispatcher_should_set_scheduler_on_channel_factory.cs b/tests/Paramore.Brighter.Extensions.Tests/When_building_dispatcher_should_set_scheduler_on_channel_factory.cs index 46ff04eaa7..2fced10eec 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/When_building_dispatcher_should_set_scheduler_on_channel_factory.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/When_building_dispatcher_should_set_scheduler_on_channel_factory.cs @@ -27,14 +27,13 @@ THE SOFTWARE. */ using Paramore.Brighter.Extensions.Tests.TestDoubles; using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; public class ChannelFactorySchedulerTests { - [Fact] - public void Should_set_scheduler_on_channel_factory_that_implements_scheduler_interface() + [Test] + public async Task Should_set_scheduler_on_channel_factory_that_implements_scheduler_interface() { // Arrange — configure AddConsumers with an InMemoryChannelFactory (which implements IAmAChannelFactoryWithScheduler) var bus = new InternalBus(); @@ -71,13 +70,13 @@ public void Should_set_scheduler_on_channel_factory_that_implements_scheduler_in var dispatcher = provider.GetRequiredService(); // Assert — the channel factory should now have its Scheduler property set from DI - Assert.NotNull(dispatcher); - Assert.NotNull(channelFactory.Scheduler); - Assert.IsAssignableFrom(channelFactory.Scheduler); + await Assert.That(dispatcher).IsNotNull(); + await Assert.That(channelFactory.Scheduler).IsNotNull(); + await Assert.That(channelFactory.Scheduler).IsAssignableTo(); } - [Fact] - public void Should_set_custom_scheduler_on_channel_factory_when_UseScheduler_configured() + [Test] + public async Task Should_set_custom_scheduler_on_channel_factory_when_UseScheduler_configured() { // Arrange — configure with a custom scheduler factory var bus = new InternalBus(); @@ -116,9 +115,9 @@ public void Should_set_custom_scheduler_on_channel_factory_when_UseScheduler_con var dispatcher = provider.GetRequiredService(); // Assert — the channel factory should have the custom scheduler set - Assert.NotNull(dispatcher); - Assert.NotNull(channelFactory.Scheduler); - Assert.IsType(channelFactory.Scheduler); + await Assert.That(dispatcher).IsNotNull(); + await Assert.That(channelFactory.Scheduler).IsNotNull(); + await Assert.That(channelFactory.Scheduler).IsTypeOf(); } private class StubSchedulerFactory : IAmAMessageSchedulerFactory, IAmARequestSchedulerFactory diff --git a/tests/Paramore.Brighter.Extensions.Tests/When_building_dispatcher_should_set_scheduler_on_per_subscription_channel_factory.cs b/tests/Paramore.Brighter.Extensions.Tests/When_building_dispatcher_should_set_scheduler_on_per_subscription_channel_factory.cs index 0c7c248a0d..d20b6bdf74 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/When_building_dispatcher_should_set_scheduler_on_per_subscription_channel_factory.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/When_building_dispatcher_should_set_scheduler_on_per_subscription_channel_factory.cs @@ -29,14 +29,13 @@ THE SOFTWARE. */ using Paramore.Brighter.Extensions.Tests.TestDoubles; using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; public class PerSubscriptionChannelFactorySchedulerTests { - [Fact] - public void Should_set_scheduler_on_per_subscription_channel_factory() + [Test] + public async Task Should_set_scheduler_on_per_subscription_channel_factory() { // Arrange — one subscription uses a per-subscription channel factory var bus = new InternalBus(); @@ -81,14 +80,14 @@ public void Should_set_scheduler_on_per_subscription_channel_factory() var dispatcher = provider.GetRequiredService(); // Assert — both the default and per-subscription factory should have the scheduler - Assert.NotNull(dispatcher); - Assert.NotNull(defaultFactory.Scheduler); - Assert.NotNull(perSubFactory.Scheduler); - Assert.IsAssignableFrom(perSubFactory.Scheduler); + await Assert.That(dispatcher).IsNotNull(); + await Assert.That(defaultFactory.Scheduler).IsNotNull(); + await Assert.That(perSubFactory.Scheduler).IsNotNull(); + await Assert.That(perSubFactory.Scheduler).IsAssignableTo(); } - [Fact] - public void Should_set_scheduler_on_combined_channel_factory_and_propagate_to_inner_factories() + [Test] + public async Task Should_set_scheduler_on_combined_channel_factory_and_propagate_to_inner_factories() { // Arrange — use a CombinedChannelFactory as the default (multi-bus scenario) var bus = new InternalBus(); @@ -126,9 +125,9 @@ public void Should_set_scheduler_on_combined_channel_factory_and_propagate_to_in var dispatcher = provider.GetRequiredService(); // Assert — the inner factory should have the scheduler propagated through CombinedChannelFactory - Assert.NotNull(dispatcher); - Assert.NotNull(innerFactory.Scheduler); - Assert.IsAssignableFrom(innerFactory.Scheduler); + await Assert.That(dispatcher).IsNotNull(); + await Assert.That(innerFactory.Scheduler).IsNotNull(); + await Assert.That(innerFactory.Scheduler).IsAssignableTo(); } private class SchedulerAwareChannelFactory : IAmAChannelFactory, IAmAChannelFactoryWithScheduler diff --git a/tests/Paramore.Brighter.Extensions.Tests/When_building_dispatcher_with_non_scheduler_channel_factory_should_work.cs b/tests/Paramore.Brighter.Extensions.Tests/When_building_dispatcher_with_non_scheduler_channel_factory_should_work.cs index 6b0cf396e6..bfb0d32e4c 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/When_building_dispatcher_with_non_scheduler_channel_factory_should_work.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/When_building_dispatcher_with_non_scheduler_channel_factory_should_work.cs @@ -29,14 +29,13 @@ THE SOFTWARE. */ using Paramore.Brighter.Extensions.Tests.TestDoubles; using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; public class When_building_dispatcher_with_non_scheduler_channel_factory_should_work { - [Fact] - public void Should_build_dispatcher_without_errors() + [Test] + public async Task Should_build_dispatcher_without_errors() { // Arrange — configure with a channel factory that does NOT implement IAmAChannelFactoryWithScheduler var bus = new InternalBus(); @@ -73,8 +72,8 @@ public void Should_build_dispatcher_without_errors() var dispatcher = provider.GetRequiredService(); // Assert — dispatcher should build successfully; no scheduler-related exceptions thrown - Assert.NotNull(dispatcher); - Assert.IsNotType(channelFactory); + await Assert.That(dispatcher).IsNotNull(); + await Assert.That(channelFactory).IsNotTypeOf(); } /// diff --git a/tests/Paramore.Brighter.Extensions.Tests/When_no_scheduler_configured_should_default_to_InMemorySchedulerFactory.cs b/tests/Paramore.Brighter.Extensions.Tests/When_no_scheduler_configured_should_default_to_InMemorySchedulerFactory.cs index 8cde9a0c53..9646233667 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/When_no_scheduler_configured_should_default_to_InMemorySchedulerFactory.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/When_no_scheduler_configured_should_default_to_InMemorySchedulerFactory.cs @@ -22,14 +22,13 @@ THE SOFTWARE. */ using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; public class When_no_scheduler_configured_should_default_to_InMemorySchedulerFactory { - [Fact] - public void Should_resolve_InMemorySchedulerFactory_as_default() + [Test] + public async Task Should_resolve_InMemorySchedulerFactory_as_default() { // Arrange — AddBrighter with no explicit UseScheduler or UseMessageScheduler var services = new ServiceCollection(); @@ -40,12 +39,12 @@ public void Should_resolve_InMemorySchedulerFactory_as_default() var factory = provider.GetService(); // Assert — the default factory should be InMemorySchedulerFactory - Assert.NotNull(factory); - Assert.IsType(factory); + await Assert.That(factory).IsNotNull(); + await Assert.That(factory).IsTypeOf(); } - [Fact] - public void Should_resolve_IAmAMessageScheduler_from_default_factory() + [Test] + public async Task Should_resolve_IAmAMessageScheduler_from_default_factory() { // Arrange — AddBrighter with no explicit UseScheduler var services = new ServiceCollection(); @@ -56,12 +55,12 @@ public void Should_resolve_IAmAMessageScheduler_from_default_factory() var scheduler = provider.GetService(); // Assert — a scheduler should be resolvable from the default factory - Assert.NotNull(scheduler); - Assert.IsAssignableFrom(scheduler); + await Assert.That(scheduler).IsNotNull(); + await Assert.That(scheduler).IsAssignableTo(); } - [Fact] - public void Should_resolve_IAmARequestSchedulerFactory_as_default() + [Test] + public async Task Should_resolve_IAmARequestSchedulerFactory_as_default() { // Arrange — AddBrighter with no explicit UseScheduler var services = new ServiceCollection(); @@ -72,7 +71,7 @@ public void Should_resolve_IAmARequestSchedulerFactory_as_default() var factory = provider.GetService(); // Assert — the default request scheduler factory should also be InMemorySchedulerFactory - Assert.NotNull(factory); - Assert.IsType(factory); + await Assert.That(factory).IsNotNull(); + await Assert.That(factory).IsTypeOf(); } } diff --git a/tests/Paramore.Brighter.Extensions.Tests/When_scheduler_explicitly_configured_should_override_default.cs b/tests/Paramore.Brighter.Extensions.Tests/When_scheduler_explicitly_configured_should_override_default.cs index 5b0f1cf3ff..c8276d894b 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/When_scheduler_explicitly_configured_should_override_default.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/When_scheduler_explicitly_configured_should_override_default.cs @@ -25,14 +25,13 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; public class When_scheduler_explicitly_configured_should_override_default { - [Fact] - public void Should_resolve_custom_factory_instead_of_InMemorySchedulerFactory() + [Test] + public async Task Should_resolve_custom_factory_instead_of_InMemorySchedulerFactory() { // Arrange — configure a custom scheduler factory via UseScheduler var customFactory = new StubSchedulerFactory(); @@ -46,13 +45,13 @@ public void Should_resolve_custom_factory_instead_of_InMemorySchedulerFactory() var resolvedFactory = provider.GetRequiredService(); // Assert — the custom factory should be resolved, not the default InMemorySchedulerFactory - Assert.NotNull(resolvedFactory); - Assert.IsType(resolvedFactory); - Assert.Same(customFactory, resolvedFactory); + await Assert.That(resolvedFactory).IsNotNull(); + await Assert.That(resolvedFactory).IsTypeOf(); + await Assert.That(resolvedFactory).IsSameReferenceAs(customFactory); } - [Fact] - public void Should_resolve_scheduler_from_custom_factory() + [Test] + public async Task Should_resolve_scheduler_from_custom_factory() { // Arrange — configure a custom scheduler factory via UseScheduler var customFactory = new StubSchedulerFactory(); @@ -66,12 +65,12 @@ public void Should_resolve_scheduler_from_custom_factory() var scheduler = provider.GetRequiredService(); // Assert — the scheduler should come from the custom factory - Assert.NotNull(scheduler); - Assert.IsType(scheduler); + await Assert.That(scheduler).IsNotNull(); + await Assert.That(scheduler).IsTypeOf(); } - [Fact] - public void Should_resolve_custom_request_scheduler_factory() + [Test] + public async Task Should_resolve_custom_request_scheduler_factory() { // Arrange — configure a custom scheduler factory via UseScheduler var customFactory = new StubSchedulerFactory(); @@ -85,9 +84,9 @@ public void Should_resolve_custom_request_scheduler_factory() var resolvedFactory = provider.GetRequiredService(); // Assert — the custom factory should be resolved for request scheduling too - Assert.NotNull(resolvedFactory); - Assert.IsType(resolvedFactory); - Assert.Same(customFactory, resolvedFactory); + await Assert.That(resolvedFactory).IsNotNull(); + await Assert.That(resolvedFactory).IsTypeOf(); + await Assert.That(resolvedFactory).IsSameReferenceAs(customFactory); } private class StubSchedulerFactory : IAmAMessageSchedulerFactory, IAmARequestSchedulerFactory diff --git a/tests/Paramore.Brighter.Extensions.Tests/When_service_activator_has_warnings_should_log_them.cs b/tests/Paramore.Brighter.Extensions.Tests/When_service_activator_has_warnings_should_log_them.cs index 7f70ff181c..6a91da59c4 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/When_service_activator_has_warnings_should_log_them.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/When_service_activator_has_warnings_should_log_them.cs @@ -32,13 +32,12 @@ THE SOFTWARE. */ using Paramore.Brighter.Extensions.Tests.TestDoubles; using Paramore.Brighter.ServiceActivator.Extensions.Hosting; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; public class ServiceActivatorWarningLoggingTests { - [Fact] + [Test] public async Task When_service_activator_has_warnings_should_log_them_at_warning_level() { // Arrange — warnings only, no errors @@ -61,13 +60,13 @@ public async Task When_service_activator_has_warnings_should_log_them_at_warning // Assert — each warning is logged at Warning level with source and message var warningEntries = logger.WarningEntries.ToList(); - Assert.Equal(2, warningEntries.Count); - Assert.Contains("HandlerA", warningEntries[0].Message); - Assert.Contains("Backstop ordering suboptimal", warningEntries[0].Message); - Assert.Contains("HandlerB", warningEntries[1].Message); - Assert.Contains("Attribute mismatch suggestion", warningEntries[1].Message); + await Assert.That(warningEntries.Count).IsEqualTo(2); + await Assert.That(warningEntries[0].Message).Contains("HandlerA"); + await Assert.That(warningEntries[0].Message).Contains("Backstop ordering suboptimal"); + await Assert.That(warningEntries[1].Message).Contains("HandlerB"); + await Assert.That(warningEntries[1].Message).Contains("Attribute mismatch suggestion"); // Assert — Receive was still called (warnings don't prevent startup) - Assert.True(dispatcher.ReceiveWasCalled); + await Assert.That(dispatcher.ReceiveWasCalled).IsTrue(); } } diff --git a/tests/Paramore.Brighter.Extensions.Tests/When_service_activator_single_constructor_should_resolve_optional_deps.cs b/tests/Paramore.Brighter.Extensions.Tests/When_service_activator_single_constructor_should_resolve_optional_deps.cs index 9cef83c75b..b754dc5782 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/When_service_activator_single_constructor_should_resolve_optional_deps.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/When_service_activator_single_constructor_should_resolve_optional_deps.cs @@ -32,13 +32,12 @@ THE SOFTWARE. */ using Paramore.Brighter.Extensions.Tests.TestDoubles; using Paramore.Brighter.ServiceActivator.Extensions.Hosting; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; public class ServiceActivatorSingleConstructorTests { - [Fact] + [Test] public async Task When_consumer_owns_validation_and_validator_registered_should_validate_before_receive() { // Arrange @@ -60,12 +59,12 @@ public async Task When_consumer_owns_validation_and_validator_registered_should_ await service.StartAsync(CancellationToken.None); // Assert — validation and diagnostics run before Receive - Assert.True(validator.ValidateWasCalled); - Assert.True(diagnosticWriter.DescribeWasCalled); - Assert.Equal(new List { "Describe", "Validate", "Receive" }, actionLog); + await Assert.That(validator.ValidateWasCalled).IsTrue(); + await Assert.That(diagnosticWriter.DescribeWasCalled).IsTrue(); + await Assert.That(actionLog).IsEquivalentTo(new List { "Describe", "Validate", "Receive" }); } - [Fact] + [Test] public async Task When_consumer_owns_validation_and_validator_not_registered_should_go_to_receive() { // Arrange — no validator or diagnostic writer registered @@ -83,11 +82,11 @@ public async Task When_consumer_owns_validation_and_validator_not_registered_sho await service.StartAsync(CancellationToken.None); // Assert — straight to Receive, no error - Assert.True(dispatcher.ReceiveWasCalled); - Assert.Equal(new List { "Receive" }, actionLog); + await Assert.That(dispatcher.ReceiveWasCalled).IsTrue(); + await Assert.That(actionLog).IsEquivalentTo(new List { "Receive" }); } - [Fact] + [Test] public async Task When_consumer_does_not_own_validation_should_go_straight_to_receive() { // Arrange — consumer does not own validation; defers to BrighterValidationHostedService @@ -107,7 +106,7 @@ public async Task When_consumer_does_not_own_validation_should_go_straight_to_re await service.StartAsync(CancellationToken.None); // Assert — skips validation, goes straight to Receive - Assert.False(validator.ValidateWasCalled); - Assert.Equal(new List { "Receive" }, actionLog); + await Assert.That(validator.ValidateWasCalled).IsFalse(); + await Assert.That(actionLog).IsEquivalentTo(new List { "Receive" }); } } diff --git a/tests/Paramore.Brighter.Extensions.Tests/When_service_activator_starts_with_validator_should_validate_before_receive.cs b/tests/Paramore.Brighter.Extensions.Tests/When_service_activator_starts_with_validator_should_validate_before_receive.cs index c24889e507..4a8c4eeae1 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/When_service_activator_starts_with_validator_should_validate_before_receive.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/When_service_activator_starts_with_validator_should_validate_before_receive.cs @@ -32,13 +32,12 @@ THE SOFTWARE. */ using Paramore.Brighter.Extensions.Tests.TestDoubles; using Paramore.Brighter.ServiceActivator.Extensions.Hosting; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; public class ServiceActivatorValidationTests { - [Fact] + [Test] public async Task When_validator_registered_should_validate_before_receive() { // Arrange @@ -60,12 +59,12 @@ public async Task When_validator_registered_should_validate_before_receive() await service.StartAsync(CancellationToken.None); // Assert — validation and diagnostics run before Receive, in correct order - Assert.True(validator.ValidateWasCalled); - Assert.True(diagnosticWriter.DescribeWasCalled); - Assert.Equal(new List { "Describe", "Validate", "Receive" }, actionLog); + await Assert.That(validator.ValidateWasCalled).IsTrue(); + await Assert.That(diagnosticWriter.DescribeWasCalled).IsTrue(); + await Assert.That(actionLog).IsEquivalentTo(new List { "Describe", "Validate", "Receive" }); } - [Fact] + [Test] public async Task When_validator_not_registered_should_go_straight_to_receive() { // Arrange — no validator registered, consumer does not own validation @@ -83,11 +82,11 @@ public async Task When_validator_not_registered_should_go_straight_to_receive() await service.StartAsync(CancellationToken.None); // Assert — only Receive is called, backward compatible - Assert.True(dispatcher.ReceiveWasCalled); - Assert.Equal(new List { "Receive" }, actionLog); + await Assert.That(dispatcher.ReceiveWasCalled).IsTrue(); + await Assert.That(actionLog).IsEquivalentTo(new List { "Receive" }); } - [Fact] + [Test] public async Task When_validation_has_errors_should_not_call_receive() { // Arrange @@ -109,6 +108,6 @@ public async Task When_validation_has_errors_should_not_call_receive() // Act & Assert — validation error prevents Receive from being called await Assert.ThrowsAsync( () => service.StartAsync(CancellationToken.None)); - Assert.False(dispatcher.ReceiveWasCalled); + await Assert.That(dispatcher.ReceiveWasCalled).IsFalse(); } } diff --git a/tests/Paramore.Brighter.Extensions.Tests/When_service_activator_throw_on_error_false_should_log_not_throw.cs b/tests/Paramore.Brighter.Extensions.Tests/When_service_activator_throw_on_error_false_should_log_not_throw.cs index a4b7062970..09306da199 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/When_service_activator_throw_on_error_false_should_log_not_throw.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/When_service_activator_throw_on_error_false_should_log_not_throw.cs @@ -33,13 +33,12 @@ THE SOFTWARE. */ using Paramore.Brighter.Extensions.Tests.TestDoubles; using Paramore.Brighter.ServiceActivator.Extensions.Hosting; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; public class ServiceActivatorThrowOnErrorTests { - [Fact] + [Test] public async Task When_throw_on_error_false_and_errors_should_log_and_still_receive() { // Arrange @@ -66,12 +65,12 @@ public async Task When_throw_on_error_false_and_errors_should_log_and_still_rece await service.StartAsync(CancellationToken.None); // Assert — errors logged, Receive was called - Assert.True(validator.ValidateWasCalled); - Assert.True(dispatcher.ReceiveWasCalled); - Assert.Contains(logger.Entries, e => e.LogLevel == LogLevel.Error && e.Message.Contains("misconfigured")); + await Assert.That(validator.ValidateWasCalled).IsTrue(); + await Assert.That(dispatcher.ReceiveWasCalled).IsTrue(); + await Assert.That(logger.Entries).Contains(e => e.LogLevel == LogLevel.Error && e.Message.Contains("misconfigured")); } - [Fact] + [Test] public async Task When_throw_on_error_true_and_errors_should_throw_and_not_receive() { // Arrange @@ -97,10 +96,10 @@ public async Task When_throw_on_error_true_and_errors_should_throw_and_not_recei // Act & Assert — should throw, Receive should NOT be called await Assert.ThrowsAsync( () => service.StartAsync(CancellationToken.None)); - Assert.False(dispatcher.ReceiveWasCalled); + await Assert.That(dispatcher.ReceiveWasCalled).IsFalse(); } - [Fact] + [Test] public async Task When_throw_on_error_false_and_no_errors_should_receive_normally() { // Arrange @@ -126,12 +125,12 @@ public async Task When_throw_on_error_false_and_no_errors_should_receive_normall await service.StartAsync(CancellationToken.None); // Assert — no errors, Receive called normally - Assert.True(validator.ValidateWasCalled); - Assert.True(dispatcher.ReceiveWasCalled); - Assert.DoesNotContain(logger.Entries, e => e.LogLevel == LogLevel.Error); + await Assert.That(validator.ValidateWasCalled).IsTrue(); + await Assert.That(dispatcher.ReceiveWasCalled).IsTrue(); + await Assert.That(logger.Entries).DoesNotContain(e => e.LogLevel == LogLevel.Error); } - [Fact] + [Test] public async Task When_throw_on_error_false_should_still_log_warnings() { // Arrange @@ -159,8 +158,8 @@ public async Task When_throw_on_error_false_should_still_log_warnings() await service.StartAsync(CancellationToken.None); // Assert — both errors and warnings logged - Assert.Contains(logger.Entries, e => e.LogLevel == LogLevel.Error && e.Message.Contains("misconfigured")); - Assert.Contains(logger.Entries, e => e.LogLevel == LogLevel.Warning && e.Message.Contains("suboptimal")); - Assert.True(dispatcher.ReceiveWasCalled); + await Assert.That(logger.Entries).Contains(e => e.LogLevel == LogLevel.Error && e.Message.Contains("misconfigured")); + await Assert.That(logger.Entries).Contains(e => e.LogLevel == LogLevel.Warning && e.Message.Contains("suboptimal")); + await Assert.That(dispatcher.ReceiveWasCalled).IsTrue(); } } diff --git a/tests/Paramore.Brighter.Extensions.Tests/When_validate_pipelines_with_consumers_should_receive_subscriptions.cs b/tests/Paramore.Brighter.Extensions.Tests/When_validate_pipelines_with_consumers_should_receive_subscriptions.cs index cf5b04f710..4da884fdb4 100644 --- a/tests/Paramore.Brighter.Extensions.Tests/When_validate_pipelines_with_consumers_should_receive_subscriptions.cs +++ b/tests/Paramore.Brighter.Extensions.Tests/When_validate_pipelines_with_consumers_should_receive_subscriptions.cs @@ -30,14 +30,13 @@ THE SOFTWARE. */ using Paramore.Brighter.ServiceActivator; using Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection; using Paramore.Brighter.Validation; -using Xunit; namespace Paramore.Brighter.Extensions.Tests; public class ValidatePipelinesWithConsumersTests { - [Fact] - public void When_validate_pipelines_with_consumers_should_detect_missing_handler() + [Test] + public async Task When_validate_pipelines_with_consumers_should_detect_missing_handler() { // Arrange — set up a subscription for a request type with no handler registered var services = new ServiceCollection(); @@ -61,12 +60,12 @@ public void When_validate_pipelines_with_consumers_should_detect_missing_handler var result = validator.Validate(); // Assert — should detect the subscription has no handler registered - Assert.False(result.IsValid); - Assert.Contains(result.Errors, e => e.Message.Contains("No handler registered")); + await Assert.That(result.IsValid).IsFalse(); + await Assert.That(result.Errors).Contains(e => e.Message.Contains("No handler registered")); } - [Fact] - public void When_add_consumers_should_register_consumer_validation_specs() + [Test] + public async Task When_add_consumers_should_register_consumer_validation_specs() { // Arrange var services = new ServiceCollection(); @@ -78,7 +77,7 @@ public void When_add_consumers_should_register_consumer_validation_specs() var specs = provider.GetServices>().ToList(); // Assert — AddConsumers should register 3 consumer validation specs - Assert.Equal(3, specs.Count); + await Assert.That(specs.Count).IsEqualTo(3); } private class UnhandledEvent : Event diff --git a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs index 7675decd90..c564c40fb0 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Mime; using System.Threading.Tasks; using Paramore.Brighter.Gcp.Tests.Helper; @@ -7,13 +7,13 @@ namespace Paramore.Brighter.Gcp.Tests.MessagingGateway.Pull.Proactor; -[Trait("Category", "GCP")] +[Category("GCP")] public class PubSubBufferedConsumerTestsAsync : IDisposable { private readonly ContentType _contentType = new("text/plain"); - private readonly GcpMessageProducer _messageProducer; - private readonly GcpPubSubSubscription _pubSubSubscription; - private readonly IAmAChannelAsync _channel; + private GcpMessageProducer _messageProducer; + private GcpPubSubSubscription _pubSubSubscription; + private IAmAChannelAsync _channel; private readonly string _topicName; private readonly GcpPubSubChannelFactory _channelFactory; private const int BufferSize = 3; @@ -22,13 +22,18 @@ public class PubSubBufferedConsumerTestsAsync : IDisposable public PubSubBufferedConsumerTestsAsync() { _channelFactory = GatewayFactory.CreateChannelFactory(); - var channelName = $"Buffered-Consumer-Tests-{Guid.NewGuid().ToString()}".Truncate(45); _topicName = $"Buffered-Consumer-Tests-{Guid.NewGuid().ToString()}".Truncate(45); + } + + [Before(Test)] + public async Task Setup() + { + var channelName = $"Buffered-Consumer-Tests-{Guid.NewGuid().ToString()}".Truncate(45); //we need the channel to create the queues and notifications var routingKey = new RoutingKey(_topicName); - _channel = _channelFactory.CreateAsyncChannelAsync(_pubSubSubscription = new GcpPubSubSubscription( + _channel = await _channelFactory.CreateAsyncChannelAsync(_pubSubSubscription = new GcpPubSubSubscription( subscriptionName: new SubscriptionName(channelName), channelName: new ChannelName(channelName), routingKey: routingKey, @@ -36,7 +41,7 @@ public PubSubBufferedConsumerTestsAsync() messagePumpType: MessagePumpType.Proactor, makeChannels: OnMissingChannel.Create, subscriptionMode: SubscriptionMode.Pull - )).GetAwaiter().GetResult(); + )); _messageProducer = GatewayFactory.CreateProducer(new GcpPublication { @@ -45,7 +50,7 @@ public PubSubBufferedConsumerTestsAsync() }); } - [Fact] + [Test] public async Task When_a_message_consumer_reads_multiple_messages_async() { var routingKey = new RoutingKey(_topicName); @@ -84,7 +89,7 @@ public async Task When_a_message_consumer_reads_multiple_messages_async() { //retrieve messages var message = await _channel.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.NotEqual(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); await _channel.AcknowledgeAsync(message); await Task.Delay(1000); diff --git a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs index b829a16672..5a4ec1a55d 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Mime; using System.Text.Json; using System.Threading.Tasks; @@ -9,7 +9,7 @@ namespace Paramore.Brighter.Gcp.Tests.MessagingGateway.Pull.Proactor; -[Trait("Category", "GCP")] +[Category("GCP")] public class MessageProducerSendAsyncTests : IDisposable { private readonly Message _message; @@ -56,7 +56,7 @@ public MessageProducerSendAsyncTests() }); } - [Fact] + [Test] public async Task When_posting_a_message_via_the_producer_async() { // arrange @@ -71,22 +71,22 @@ public async Task When_posting_a_message_via_the_producer_async() await _channel.AcknowledgeAsync(message); // should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_topicName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_topicName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); // allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); // {"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Proactor/When_queues_missing_verify_throws_async.cs b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Proactor/When_queues_missing_verify_throws_async.cs index 1b1f97919a..459170fe6a 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Proactor/When_queues_missing_verify_throws_async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Proactor/When_queues_missing_verify_throws_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Gcp.Tests.Helper; using Paramore.Brighter.Gcp.Tests.TestDoubles; @@ -6,7 +6,7 @@ namespace Paramore.Brighter.Gcp.Tests.MessagingGateway.Pull.Proactor; -[Trait("Category", "GCP")] +[Category("GCP")] public class ValidateQueuesTestsAsync : IDisposable { private readonly GcpPubSubSubscription _pubSubSubscription; @@ -28,16 +28,16 @@ public ValidateQueuesTestsAsync() ); } - [Fact] + [Test] public async Task When_topic_missing_verify_throws_async() { // We have no topic so we should throw // We need to do this manually in a test - will create the channel from subscriber parameters _channelFactory = GatewayFactory.CreateChannelFactory(); - await Assert.ThrowsAsync(() => _channelFactory.CreateAsyncChannelAsync(_pubSubSubscription)); + await Assert.That(() => _channelFactory.CreateAsyncChannelAsync(_pubSubSubscription)).ThrowsExactly(); } - [Fact] + [Test] public async Task When_subscription_missing_verify_throws_async() { // We have no topic so we should throw @@ -49,7 +49,7 @@ await _channelFactory.EnsureTopicExistAsync(new TopicAttributes Name = _pubSubSubscription.RoutingKey, ProjectId = GatewayFactory.GetProjectId() }, OnMissingChannel.Create); - await Assert.ThrowsAsync(() => _channelFactory.CreateAsyncChannelAsync(_pubSubSubscription)); + await Assert.That(() => _channelFactory.CreateAsyncChannelAsync(_pubSubSubscription)).ThrowsExactly(); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Proactor/When_requeueing_a_message_async.cs b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Proactor/When_requeueing_a_message_async.cs index b91401d15b..36052bedbb 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Proactor/When_requeueing_a_message_async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Proactor/When_requeueing_a_message_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Mime; using System.Text.Json; using System.Threading.Tasks; @@ -9,7 +9,7 @@ namespace Paramore.Brighter.Gcp.Tests.MessagingGateway.Pull.Proactor; -[Trait("Category", "GCP")] +[Category("GCP")] public class MessageProducerRequeueTestsAsync : IDisposable { private readonly IAmAMessageProducerAsync _sender; @@ -56,7 +56,7 @@ public MessageProducerRequeueTestsAsync() _channel = _channelFactory.CreateAsyncChannel(_pubSubSubscription); } - [Fact] + [Test] public async Task When_requeueing_a_message_async() { await _sender.SendAsync(_message); @@ -67,7 +67,7 @@ public async Task When_requeueing_a_message_async() await _channel.AcknowledgeAsync(_requeuedMessage); - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Proactor/When_requeueing_redrives_to_the_dlq_async.cs b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Proactor/When_requeueing_redrives_to_the_dlq_async.cs index 942bf77f18..3e52482229 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Proactor/When_requeueing_redrives_to_the_dlq_async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Proactor/When_requeueing_redrives_to_the_dlq_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Mime; using System.Text.Json; using System.Threading.Tasks; @@ -11,8 +11,8 @@ namespace Paramore.Brighter.Gcp.Tests.MessagingGateway.Pull.Proactor; -[Trait("Category", "GCP")] -[Trait("Fragile", "CI")] +[Category("GCP")] +[Property("Fragile", "CI")] public class MessageProducerDlqTestsAsync : IDisposable { private const int MaxDeliveryAttempts = 5; @@ -67,7 +67,7 @@ public MessageProducerDlqTestsAsync() _channel = _channelFactory.CreateAsyncChannel(_pubSubSubscription); } - [Fact] + [Test] public async Task When_requeueing_redrives_to_the_queue_async() { await _sender.SendAsync(_message); @@ -80,7 +80,7 @@ public async Task When_requeueing_redrives_to_the_queue_async() await Task.Delay(5000); int dlqCount = await GetDLQCountAsync(); - Assert.Equal(1, dlqCount); + await Assert.That(dlqCount).IsEqualTo(1); } private async Task GetDLQCountAsync() diff --git a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Reactor/When_a_message_consumer_reads_multiple_messages.cs b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Reactor/When_a_message_consumer_reads_multiple_messages.cs index c1fe8d0654..f62a2720c7 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Reactor/When_a_message_consumer_reads_multiple_messages.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Reactor/When_a_message_consumer_reads_multiple_messages.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Mime; using System.Threading; using Paramore.Brighter.Gcp.Tests.Helper; @@ -7,8 +7,8 @@ namespace Paramore.Brighter.Gcp.Tests.MessagingGateway.Pull.Reactor; -[Trait("Category", "GCP")] -public class PubSubBufferedConsumerTestsAsync : IDisposable +[Category("GCP")] +public class PubSubBufferedConsumerTestsAsync { private readonly ContentType _contentType = new("text/plain"); private readonly GcpMessageProducer _messageProducer; @@ -45,8 +45,8 @@ public PubSubBufferedConsumerTestsAsync() }); } - [Fact] - public void When_a_message_consumer_reads_multiple_messages() + [Test] + public async Task When_a_message_consumer_reads_multiple_messages() { var routingKey = new RoutingKey(_topicName); @@ -75,26 +75,27 @@ public void When_a_message_consumer_reads_multiple_messages() ); //send MESSAGE_COUNT messages - _messageProducer.Send(messageOne); - _messageProducer.Send(messageTwo); - _messageProducer.Send(messageThree); - _messageProducer.Send(messageFour); + await _messageProducer.SendAsync(messageOne); + await _messageProducer.SendAsync(messageTwo); + await _messageProducer.SendAsync(messageThree); + await _messageProducer.SendAsync(messageFour); for(var i = 0; i < MessageCount; i++) { //retrieve messages var message = _channel.Receive(TimeSpan.FromMilliseconds(10000)); - Assert.NotEqual(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); _channel.Acknowledge(message); Thread.Sleep(1000); } } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteSubscription(_pubSubSubscription); - _channelFactory.DeleteTopic(_pubSubSubscription); - _messageProducer.DisposeAsync().GetAwaiter().GetResult(); + await _channelFactory.DeleteSubscriptionAsync(_pubSubSubscription); + await _channelFactory.DeleteTopicAsync(_pubSubSubscription); + await _messageProducer.DisposeAsync(); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Reactor/When_posting_a_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Reactor/When_posting_a_message_via_the_messaging_gateway.cs index 8222ea5989..5080d06478 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Reactor/When_posting_a_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Reactor/When_posting_a_message_via_the_messaging_gateway.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Mime; using System.Text.Json; using System.Threading; @@ -9,7 +9,7 @@ namespace Paramore.Brighter.Gcp.Tests.MessagingGateway.Pull.Reactor; -[Trait("Category", "GCP")] +[Category("GCP")] public class MessageProducerSendAsyncTests : IDisposable { private readonly Message _message; @@ -60,12 +60,12 @@ public MessageProducerSendAsyncTests() }); } - [Fact] - public void When_posting_a_message_via_the_producer() + [Test] + public async Task When_posting_a_message_via_the_producer() { // arrange _message.Header.Subject = "test subject"; - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); Thread.Sleep(1000); @@ -75,22 +75,22 @@ public void When_posting_a_message_via_the_producer() _channel.Acknowledge(message); // should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_topicName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_topicName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); // allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); // {"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Reactor/When_queues_missing_verify_throws.cs b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Reactor/When_queues_missing_verify_throws.cs index 190c436a70..d123d362f4 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Reactor/When_queues_missing_verify_throws.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Reactor/When_queues_missing_verify_throws.cs @@ -1,11 +1,11 @@ -using System; +using System; using Paramore.Brighter.Gcp.Tests.Helper; using Paramore.Brighter.Gcp.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.GcpPubSub; namespace Paramore.Brighter.Gcp.Tests.MessagingGateway.Pull.Reactor; -[Trait("Category", "GCP")] +[Category("GCP")] public class ValidateQueuesTestsAsync : IDisposable { private readonly GcpMessagingGatewayConnection _connection; @@ -30,13 +30,13 @@ public ValidateQueuesTestsAsync() _connection = GatewayFactory.CreateFactory(); } - [Fact] - public void When_topic_missing_verify_throws() + [Test] + public async Task When_topic_missing_verify_throws() { // We have no topic so we should throw // We need to do this manually in a test - will create the channel from subscriber parameters _channelFactory = GatewayFactory.CreateChannelFactory(); - Assert.Throws(() => _channelFactory.CreateSyncChannel(_pubSubSubscription)); + await Assert.That(() => _channelFactory.CreateSyncChannel(_pubSubSubscription)).ThrowsExactly(); } diff --git a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Reactor/When_requeueing_a_message.cs b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Reactor/When_requeueing_a_message.cs index 1945f82e3d..19d8eda835 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Reactor/When_requeueing_a_message.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Reactor/When_requeueing_a_message.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Mime; using System.Text.Json; using Paramore.Brighter.Gcp.Tests.Helper; @@ -8,7 +8,7 @@ namespace Paramore.Brighter.Gcp.Tests.MessagingGateway.Pull.Reactor; -[Trait("Category", "GCP")] +[Category("GCP")] public class MessageProducerRequeueTestsAsync : IDisposable { private readonly IAmAMessageProducerSync _sender; @@ -57,8 +57,8 @@ public MessageProducerRequeueTestsAsync() _channel = _channelFactory.CreateSyncChannel(_pubSubSubscription); } - [Fact] - public void When_requeueing_a_message() + [Test] + public async Task When_requeueing_a_message() { _sender.Send(_message); _receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); @@ -68,7 +68,7 @@ public void When_requeueing_a_message() _channel.Acknowledge(_requeuedMessage); - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Reactor/When_requeueing_redrives_to_the_dlq.cs b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Reactor/When_requeueing_redrives_to_the_dlq.cs index 94428c28e2..e9b330a48b 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Reactor/When_requeueing_redrives_to_the_dlq.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Pull/Reactor/When_requeueing_redrives_to_the_dlq.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Mime; using System.Text.Json; using System.Threading; @@ -11,7 +11,7 @@ namespace Paramore.Brighter.Gcp.Tests.MessagingGateway.Pull.Reactor; -[Trait("Category", "GCP")] +[Category("GCP")] public class MessageProducerDlqTestsAsync : IDisposable { private const int MaxDeliveryAttempts = 5; @@ -68,10 +68,10 @@ public MessageProducerDlqTestsAsync() _channel = _channelFactory.CreateSyncChannel(_pubSubSubscription); } - [Fact] - public void When_requeueing_redrives_to_the_queue() + [Test] + public async Task When_requeueing_redrives_to_the_queue() { - _sender.Send(_message); + await _sender.SendAsync(_message); for (var i = 0; i <= MaxDeliveryAttempts; i++) { var receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); @@ -81,7 +81,7 @@ public void When_requeueing_redrives_to_the_queue() Thread.Sleep(5000); var dlqCount = GetDLQCount(); - Assert.Equal(1, dlqCount); + await Assert.That(dlqCount).IsEqualTo(1); } private int GetDLQCount() diff --git a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs index 5ac2f29214..6ca8454944 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Mime; using System.Threading.Tasks; using Paramore.Brighter.Gcp.Tests.Helper; @@ -7,13 +7,13 @@ namespace Paramore.Brighter.Gcp.Tests.MessagingGateway.Stream.Proactor; -[Trait("Category", "GCP")] +[Category("GCP")] public class PubSubBufferedConsumerTestsAsync : IDisposable { private readonly ContentType _contentType = new("text/plain"); - private readonly GcpMessageProducer _messageProducer; - private readonly GcpPubSubSubscription _pubSubSubscription; - private readonly IAmAChannelAsync _channel; + private GcpMessageProducer _messageProducer; + private GcpPubSubSubscription _pubSubSubscription; + private IAmAChannelAsync _channel; private readonly string _topicName; private readonly GcpPubSubChannelFactory _channelFactory; private const int BufferSize = 3; @@ -22,13 +22,18 @@ public class PubSubBufferedConsumerTestsAsync : IDisposable public PubSubBufferedConsumerTestsAsync() { _channelFactory = GatewayFactory.CreateChannelFactory(); - var channelName = $"Buffered-Consumer-Tests-{Guid.NewGuid().ToString()}".Truncate(45); _topicName = $"Buffered-Consumer-Tests-{Guid.NewGuid().ToString()}".Truncate(45); + } + + [Before(Test)] + public async Task Setup() + { + var channelName = $"Buffered-Consumer-Tests-{Guid.NewGuid().ToString()}".Truncate(45); //we need the channel to create the queues and notifications var routingKey = new RoutingKey(_topicName); - _channel = _channelFactory.CreateAsyncChannelAsync(_pubSubSubscription = new GcpPubSubSubscription( + _channel = await _channelFactory.CreateAsyncChannelAsync(_pubSubSubscription = new GcpPubSubSubscription( subscriptionName: new SubscriptionName(channelName), channelName: new ChannelName(channelName), routingKey: routingKey, @@ -36,7 +41,7 @@ public PubSubBufferedConsumerTestsAsync() messagePumpType: MessagePumpType.Proactor, makeChannels: OnMissingChannel.Create, subscriptionMode: SubscriptionMode.Stream - )).GetAwaiter().GetResult(); + )); _messageProducer = GatewayFactory.CreateProducer(new GcpPublication { @@ -45,7 +50,7 @@ public PubSubBufferedConsumerTestsAsync() }); } - [Fact] + [Test] public async Task When_a_message_consumer_reads_multiple_messages_async() { var routingKey = new RoutingKey(_topicName); @@ -84,7 +89,7 @@ public async Task When_a_message_consumer_reads_multiple_messages_async() { //retrieve messages var message = await _channel.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.NotEqual(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); await _channel.AcknowledgeAsync(message); await Task.Delay(1000); diff --git a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs index 0adc072a19..7222f953ef 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Mime; using System.Text.Json; using System.Threading.Tasks; @@ -9,7 +9,7 @@ namespace Paramore.Brighter.Gcp.Tests.MessagingGateway.Stream.Proactor; -[Trait("Category", "GCP")] +[Category("GCP")] public class MessageProducerSendAsyncTests : IDisposable { private readonly Message _message; @@ -56,7 +56,7 @@ public MessageProducerSendAsyncTests() }); } - [Fact] + [Test] public async Task When_posting_a_message_via_the_producer_async() { // arrange @@ -71,22 +71,22 @@ public async Task When_posting_a_message_via_the_producer_async() await _channel.AcknowledgeAsync(message); // should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_topicName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_topicName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); // allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); // {"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Proactor/When_queues_missing_verify_throws_async.cs b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Proactor/When_queues_missing_verify_throws_async.cs index c0d3f6a985..589d72a935 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Proactor/When_queues_missing_verify_throws_async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Proactor/When_queues_missing_verify_throws_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Gcp.Tests.Helper; using Paramore.Brighter.Gcp.Tests.TestDoubles; @@ -6,7 +6,7 @@ namespace Paramore.Brighter.Gcp.Tests.MessagingGateway.Stream.Proactor; -[Trait("Category", "GCP")] +[Category("GCP")] public class ValidateQueuesTestsAsync : IDisposable { private readonly GcpPubSubSubscription _pubSubSubscription; @@ -28,16 +28,16 @@ public ValidateQueuesTestsAsync() ); } - [Fact] + [Test] public async Task When_topic_missing_verify_throws_async() { // We have no topic so we should throw // We need to do this manually in a test - will create the channel from subscriber parameters _channelFactory = GatewayFactory.CreateChannelFactory(); - await Assert.ThrowsAsync(() => _channelFactory.CreateAsyncChannelAsync(_pubSubSubscription)); + await Assert.That(() => _channelFactory.CreateAsyncChannelAsync(_pubSubSubscription)).ThrowsExactly(); } - [Fact] + [Test] public async Task When_subscription_missing_verify_throws_async() { // We have no topic so we should throw @@ -49,7 +49,7 @@ await _channelFactory.EnsureTopicExistAsync(new TopicAttributes Name = _pubSubSubscription.RoutingKey, ProjectId = GatewayFactory.GetProjectId() }, OnMissingChannel.Create); - await Assert.ThrowsAsync(() => _channelFactory.CreateAsyncChannelAsync(_pubSubSubscription)); + await Assert.That(() => _channelFactory.CreateAsyncChannelAsync(_pubSubSubscription)).ThrowsExactly(); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Proactor/When_requeueing_a_message_async.cs b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Proactor/When_requeueing_a_message_async.cs index c7a6078040..2fbab3b9eb 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Proactor/When_requeueing_a_message_async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Proactor/When_requeueing_a_message_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Mime; using System.Text.Json; using System.Threading.Tasks; @@ -9,7 +9,7 @@ namespace Paramore.Brighter.Gcp.Tests.MessagingGateway.Stream.Proactor; -[Trait("Category", "GCP")] +[Category("GCP")] public class MessageProducerRequeueTestsAsync : IDisposable { private readonly IAmAMessageProducerAsync _sender; @@ -56,7 +56,7 @@ public MessageProducerRequeueTestsAsync() _channel = _channelFactory.CreateAsyncChannel(_pubSubSubscription); } - [Fact] + [Test] public async Task When_requeueing_a_message_async() { await _sender.SendAsync(_message); @@ -67,7 +67,7 @@ public async Task When_requeueing_a_message_async() await _channel.AcknowledgeAsync(_requeuedMessage); - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Proactor/When_requeueing_redrives_to_the_dlq_async.cs b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Proactor/When_requeueing_redrives_to_the_dlq_async.cs index 8ecec4dfec..172176c48e 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Proactor/When_requeueing_redrives_to_the_dlq_async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Proactor/When_requeueing_redrives_to_the_dlq_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Mime; using System.Text.Json; using System.Threading.Tasks; @@ -11,8 +11,8 @@ namespace Paramore.Brighter.Gcp.Tests.MessagingGateway.Stream.Proactor; -[Trait("Category", "GCP")] -[Trait("Fragile", "CI")] +[Category("GCP")] +[Property("Fragile", "CI")] public class MessageProducerDlqTestsAsync : IDisposable { private const int MaxDeliveryAttempts = 5; @@ -66,7 +66,7 @@ public MessageProducerDlqTestsAsync() _channel = _channelFactory.CreateAsyncChannel(_pubSubSubscription); } - [Fact] + [Test] public async Task When_requeueing_redrives_to_the_queue_async() { await _sender.SendAsync(_message); @@ -77,7 +77,7 @@ public async Task When_requeueing_redrives_to_the_queue_async() } int dlqCount = await GetDLQCountAsync(); - Assert.True(dlqCount >= 1); + await Assert.That(dlqCount >= 1).IsTrue(); } private async Task GetDLQCountAsync() diff --git a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Reactor/When_a_message_consumer_reads_multiple_messages.cs b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Reactor/When_a_message_consumer_reads_multiple_messages.cs index c6d3cbc66c..3c4627cbc5 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Reactor/When_a_message_consumer_reads_multiple_messages.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Reactor/When_a_message_consumer_reads_multiple_messages.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Mime; using System.Threading; using Paramore.Brighter.Gcp.Tests.Helper; @@ -7,8 +7,8 @@ namespace Paramore.Brighter.Gcp.Tests.MessagingGateway.Stream.Reactor; -[Trait("Category", "GCP")] -public class PubSubBufferedConsumerTestsAsync : IDisposable +[Category("GCP")] +public class PubSubBufferedConsumerTestsAsync { private readonly ContentType _contentType = new("text/plain"); private readonly GcpMessageProducer _messageProducer; @@ -45,8 +45,8 @@ public PubSubBufferedConsumerTestsAsync() }); } - [Fact] - public void When_a_message_consumer_reads_multiple_messages() + [Test] + public async Task When_a_message_consumer_reads_multiple_messages() { var routingKey = new RoutingKey(_topicName); @@ -75,26 +75,27 @@ public void When_a_message_consumer_reads_multiple_messages() ); //send MESSAGE_COUNT messages - _messageProducer.Send(messageOne); - _messageProducer.Send(messageTwo); - _messageProducer.Send(messageThree); - _messageProducer.Send(messageFour); + await _messageProducer.SendAsync(messageOne); + await _messageProducer.SendAsync(messageTwo); + await _messageProducer.SendAsync(messageThree); + await _messageProducer.SendAsync(messageFour); for(var i = 0; i < MessageCount; i++) { //retrieve messages var message = _channel.Receive(TimeSpan.FromMilliseconds(10000)); - Assert.NotEqual(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); _channel.Acknowledge(message); Thread.Sleep(1000); } } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _channelFactory.DeleteSubscription(_pubSubSubscription); - _channelFactory.DeleteTopic(_pubSubSubscription); - _messageProducer.DisposeAsync().GetAwaiter().GetResult(); + await _channelFactory.DeleteSubscriptionAsync(_pubSubSubscription); + await _channelFactory.DeleteTopicAsync(_pubSubSubscription); + await _messageProducer.DisposeAsync(); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Reactor/When_posting_a_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Reactor/When_posting_a_message_via_the_messaging_gateway.cs index 8d95972509..24fb766c40 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Reactor/When_posting_a_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Reactor/When_posting_a_message_via_the_messaging_gateway.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Mime; using System.Text.Json; using System.Threading; @@ -9,7 +9,7 @@ namespace Paramore.Brighter.Gcp.Tests.MessagingGateway.Stream.Reactor; -[Trait("Category", "GCP")] +[Category("GCP")] public class MessageProducerSendAsyncTests : IDisposable { private readonly Message _message; @@ -60,12 +60,12 @@ public MessageProducerSendAsyncTests() }); } - [Fact] - public void When_posting_a_message_via_the_producer() + [Test] + public async Task When_posting_a_message_via_the_producer() { // arrange _message.Header.Subject = "test subject"; - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); Thread.Sleep(1000); @@ -75,22 +75,22 @@ public void When_posting_a_message_via_the_producer() _channel.Acknowledge(message); // should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_topicName, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(_contentType, message.Header.ContentType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_topicName); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.ContentType).IsEqualTo(_contentType); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); // allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); // {"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Reactor/When_queues_missing_verify_throws.cs b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Reactor/When_queues_missing_verify_throws.cs index e4029b6a81..ae6bc15fb6 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Reactor/When_queues_missing_verify_throws.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Reactor/When_queues_missing_verify_throws.cs @@ -1,11 +1,11 @@ -using System; +using System; using Paramore.Brighter.Gcp.Tests.Helper; using Paramore.Brighter.Gcp.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.GcpPubSub; namespace Paramore.Brighter.Gcp.Tests.MessagingGateway.Stream.Reactor; -[Trait("Category", "GCP")] +[Category("GCP")] public class ValidateQueuesTestsAsync : IDisposable { private readonly GcpMessagingGatewayConnection _connection; @@ -30,13 +30,13 @@ public ValidateQueuesTestsAsync() _connection = GatewayFactory.CreateFactory(); } - [Fact] - public void When_topic_missing_verify_throws() + [Test] + public async Task When_topic_missing_verify_throws() { // We have no topic so we should throw // We need to do this manually in a test - will create the channel from subscriber parameters _channelFactory = GatewayFactory.CreateChannelFactory(); - Assert.Throws(() => _channelFactory.CreateSyncChannel(_pubSubSubscription)); + await Assert.That(() => _channelFactory.CreateSyncChannel(_pubSubSubscription)).ThrowsExactly(); } diff --git a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Reactor/When_requeueing_a_message.cs b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Reactor/When_requeueing_a_message.cs index 1b27bf12e6..9d3f812fd2 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Reactor/When_requeueing_a_message.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Reactor/When_requeueing_a_message.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Mime; using System.Text.Json; using Paramore.Brighter.Gcp.Tests.Helper; @@ -8,7 +8,7 @@ namespace Paramore.Brighter.Gcp.Tests.MessagingGateway.Stream.Reactor; -[Trait("Category", "GCP")] +[Category("GCP")] public class MessageProducerRequeueTestsAsync : IDisposable { private readonly IAmAMessageProducerSync _sender; @@ -57,8 +57,8 @@ public MessageProducerRequeueTestsAsync() _channel = _channelFactory.CreateSyncChannel(_pubSubSubscription); } - [Fact] - public void When_requeueing_a_message() + [Test] + public async Task When_requeueing_a_message() { _sender.Send(_message); _receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); @@ -68,7 +68,7 @@ public void When_requeueing_a_message() _channel.Acknowledge(_requeuedMessage); - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Reactor/When_requeueing_redrives_to_the_dlq.cs b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Reactor/When_requeueing_redrives_to_the_dlq.cs index 0ca2153b48..75b82ffb3c 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Reactor/When_requeueing_redrives_to_the_dlq.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/MessagingGateway/Stream/Reactor/When_requeueing_redrives_to_the_dlq.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net.Mime; using System.Text.Json; using Google.Cloud.PubSub.V1; @@ -10,8 +10,8 @@ namespace Paramore.Brighter.Gcp.Tests.MessagingGateway.Stream.Reactor; -[Trait("Category", "GCP")] -[Trait("Fragile", "CI")] +[Category("GCP")] +[Property("Fragile", "CI")] public class MessageProducerDlqTestsAsync : IDisposable { private const int MaxDeliveryAttempts = 5; @@ -68,10 +68,10 @@ public MessageProducerDlqTestsAsync() _channel = _channelFactory.CreateSyncChannel(_pubSubSubscription); } - [Fact] - public void When_requeueing_redrives_to_the_queue() + [Test] + public async Task When_requeueing_redrives_to_the_queue() { - _sender.Send(_message); + await _sender.SendAsync(_message); for (var i = 0; i <= MaxDeliveryAttempts; i++) { var receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); @@ -84,7 +84,7 @@ public void When_requeueing_redrives_to_the_queue() } var dlqCount = GetDLQCount(); - Assert.True(dlqCount >= 1); + await Assert.That(dlqCount >= 1).IsTrue(); } private int GetDLQCount() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/FirestoreOutboxProvider.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/FirestoreOutboxProvider.cs index d55a5b3db0..593a4c4cba 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/FirestoreOutboxProvider.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/FirestoreOutboxProvider.cs @@ -59,7 +59,7 @@ public void DeleteStore(IEnumerable messages) public async Task DeleteStoreAsync(IEnumerable messages) { var config = Configuration.CreateOutbox(); - var firestore = new FirestoreConnectionProvider(config).GetFirestoreClient(); + var firestore = await new FirestoreConnectionProvider(config).GetFirestoreClientAsync(); foreach (var message in messages) { diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs index 28435ffc43..3bb995f004 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.Firestore.Async; -public class WhenAddingADuplicateMessageItShouldNotThrowAsync : IAsyncLifetime +public class WhenAddingADuplicateMessageItShouldNotThrowAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenAddingADuplicateMessageItShouldNotThrowAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() { // Arrange @@ -47,6 +49,6 @@ public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs index 7b661ded5a..1013a506ee 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.Firestore.Async; -public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync : IAsyncLifetime +public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async() { // Arrange @@ -49,37 +51,37 @@ public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_ var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs index 4b52130c3b..87e08f4cc5 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.Firestore.Async; -public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async() { // Arrange @@ -54,6 +56,6 @@ public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Shoul var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs index 74373c8507..6f22972d08 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.Firestore.Async; -public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async() { // Arrange @@ -54,37 +56,37 @@ public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_A var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs index e6e7ceccad..e98d018b39 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.Firestore.Async; -public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -58,8 +60,8 @@ public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Ou .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs index 7b8bb0c693..80cf120890 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Gcp.Tests.Outbox.Firestore.Async; -public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -47,17 +46,20 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -84,8 +86,8 @@ public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Asy .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs index 95ecc036de..da84334da2 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Gcp.Tests.Outbox.Firestore.Async; -public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync : IAsyncLifetime +public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async() { // Arrange @@ -80,38 +82,38 @@ public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_M var message = await outbox.GetAsync(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs index 602cbab31f..979f9c34aa 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.Firestore.Async; -public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync : IAsyncLifetime +public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async() { // Arrange @@ -45,6 +47,6 @@ public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_ var message = await outbox.GetAsync(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs index 93bb372345..8e6946e717 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Gcp.Tests.Outbox.Firestore.Async; -public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync : IAsyncLifetime +public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync( _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async() { // Arrange @@ -80,9 +82,9 @@ public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_An var messages = (await _outboxProvider.GetAllMessagesAsync()).ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs index 2502f5f8f5..4e6cc330ba 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.Firestore.Async; -public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_As var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs index 0f7bf1aa1b..c9cbd91477 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Gcp.Tests.Outbox.Firestore.Async; -public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync : IAsyncLifetime +public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async() { // Arrange @@ -82,9 +84,9 @@ public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requeste .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs index 143f780290..20ef4b362d 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.Firestore.Async; -public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_A var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs index 20d5dbc819..78392eacdc 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenAddingADuplicateMessageItShouldNotThrow() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() + [Test] + public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw() { // Arrange var context = new RequestContext(); @@ -63,7 +62,7 @@ public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs index d94b10a3ec..86dfbc0327 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenAddingAMessageItShouldBeStoredWithAllProperties() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() + [Test] + public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() { // Arrange var context = new RequestContext(); @@ -64,38 +63,38 @@ public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs index 360e2bafa9..6d07ada22c 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,14 +47,14 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,12 +63,12 @@ public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_ // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Rollback(); + await transaction.RollbackAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs index d67e233c5f..7c4c226c31 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,14 +47,14 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,43 +63,43 @@ public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_C // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Commit(); + await transaction.CommitAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs index 7bd1a001f4..35b92f9b1d 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,9 +73,9 @@ public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs index 0a9d0ff729..b147527c6b 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,9 +73,9 @@ public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs index 51784f16de..b625b619ad 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() + [Test] + public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() { // Arrange var context = new RequestContext(); @@ -70,39 +69,39 @@ public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message var message = outbox.Get(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs index 0034cbb390..7b70855c8a 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() + [Test] + public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() { // Arrange var context = new RequestContext(); @@ -60,7 +59,7 @@ public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Messag var message = outbox.Get(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs index 9b4aab4082..56e38ffab6 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() + [Test] + public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() { // Arrange var context = new RequestContext(); @@ -70,10 +69,10 @@ public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undi var messages = _outboxProvider.GetAllMessages().ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs index 10b74a91b6..8e21bff18a 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,19 +71,19 @@ public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs index 50879431dc..3c7286503b 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() + [Test] + public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() { // Arrange var context = new RequestContext(); @@ -72,10 +71,10 @@ public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Mess .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs index 24e3474137..7c4e26087f 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/Firestore/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,19 +71,19 @@ public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs index 61ba679b0b..a4ef7c3115 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,8 +9,8 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Async; -[Trait("Category", "Spanner")] -public class WhenAddingADuplicateMessageItShouldNotThrowAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenAddingADuplicateMessageItShouldNotThrowAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingADuplicateMessageItShouldNotThrowAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() { // Arrange @@ -48,6 +50,6 @@ public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs index 4b10b341f9..6e76fe4c05 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,8 +9,8 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Async; -[Trait("Category", "Spanner")] -public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -24,17 +23,20 @@ public WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async() { // Arrange @@ -50,37 +52,37 @@ public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_ var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs index b3e8f3f2b0..46c58e6e55 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,8 +9,8 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Async; -[Trait("Category", "Spanner")] -public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -24,17 +23,20 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async() { // Arrange @@ -55,6 +57,6 @@ public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Shoul var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs index f2a7e7a2bb..7ed24abb69 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,8 +9,8 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Async; -[Trait("Category", "Spanner")] -public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -24,17 +23,20 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async() { // Arrange @@ -55,37 +57,37 @@ public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_A var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs index 2a678b393d..f44289d6b3 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,8 +9,8 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Async; -[Trait("Category", "Spanner")] -public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -59,8 +61,8 @@ public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Ou .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs index 84b9af2820..79927398e9 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,8 +34,8 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Async; -[Trait("Category", "Spanner")] -public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -85,8 +87,8 @@ public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Asy .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs index 2900f54b08..fefbfe00c0 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,8 +34,8 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Async; -[Trait("Category", "Spanner")] -public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -49,17 +48,20 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async() { // Arrange @@ -81,38 +83,38 @@ public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_M var message = await outbox.GetAsync(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs index 7832eca840..3ea6e8700b 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,8 +9,8 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Async; -[Trait("Category", "Spanner")] -public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -24,17 +23,20 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async() { // Arrange @@ -46,6 +48,6 @@ public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_ var message = await outbox.GetAsync(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs index 21fe0c227d..1af3b9c242 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,8 +34,8 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Async; -[Trait("Category", "Spanner")] -public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -49,17 +48,20 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync( _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async() { // Arrange @@ -81,9 +83,9 @@ public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_An var messages = (await _outboxProvider.GetAllMessagesAsync()).ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs index aafba4bf8d..44d0b0ccea 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,8 +9,8 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Async; -[Trait("Category", "Spanner")] -public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -24,17 +23,20 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -58,18 +60,18 @@ public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_As var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs index e0ca0033c2..31d0c5d96e 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,8 +34,8 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Async; -[Trait("Category", "Spanner")] -public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -49,17 +48,20 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async() { // Arrange @@ -83,9 +85,9 @@ public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requeste .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs index 55f39561b0..02faf924f7 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,8 +9,8 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Async; -[Trait("Category", "Spanner")] -public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -24,17 +23,20 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -58,18 +60,18 @@ public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_A var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs index 1cf10532e5..1a7f0a32d3 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenAddingADuplicateMessageItShouldNotThrow : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,8 +48,8 @@ public WhenAddingADuplicateMessageItShouldNotThrow() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() + [Test] + public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw() { // Arrange var context = new RequestContext(); @@ -64,7 +63,7 @@ public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs index acf8472eae..1aaafd5aec 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenAddingAMessageItShouldBeStoredWithAllProperties : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,8 +48,8 @@ public WhenAddingAMessageItShouldBeStoredWithAllProperties() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() + [Test] + public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() { // Arrange var context = new RequestContext(); @@ -65,38 +64,38 @@ public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs index 0196265c3c..256078d07b 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,14 +48,14 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -65,12 +64,12 @@ public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_ // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Rollback(); + await transaction.RollbackAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs index 3a8c10fd70..bdfb69a7b2 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,14 +48,14 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -65,43 +64,43 @@ public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_C // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Commit(); + await transaction.CommitAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs index ef55e1269d..0040c9a2c7 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,8 +48,8 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -75,9 +74,9 @@ public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs index 0a89bd1227..3203e52ffe 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenDeletingOneMessageItShouldBeRemovedFromOutbox : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,8 +48,8 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -75,9 +74,9 @@ public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs index a408fab0fd..af892e1f77 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,8 +48,8 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() + [Test] + public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() { // Arrange var context = new RequestContext(); @@ -71,39 +70,39 @@ public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message var message = outbox.Get(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs index 574a90e896..397bf3c02f 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,8 +48,8 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() + [Test] + public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() { // Arrange var context = new RequestContext(); @@ -61,7 +60,7 @@ public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Messag var message = outbox.Get(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs index 369b9a1d1f..05dd31aef5 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,8 +48,8 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() + [Test] + public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() { // Arrange var context = new RequestContext(); @@ -71,10 +70,10 @@ public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undi var messages = _outboxProvider.GetAllMessages().ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs index e8d24083c3..076d514269 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenRetrievingDispatchedMessagesItShouldFilterByAge : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,8 +48,8 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -73,19 +72,19 @@ public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs index c05d518631..5d16f73c1d 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,8 +48,8 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() + [Test] + public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() { // Arrange var context = new RequestContext(); @@ -73,10 +72,10 @@ public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Mess .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs index 28efbc779e..27dfdeb3a6 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerBinary/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerBinary.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenRetrievingOutstandingMessagesItShouldFilterByAge : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,8 +48,8 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -73,19 +72,19 @@ public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs index 7d65909e4b..6fd942793b 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,8 +9,8 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Async; -[Trait("Category", "Spanner")] -public class WhenAddingADuplicateMessageItShouldNotThrowAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenAddingADuplicateMessageItShouldNotThrowAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingADuplicateMessageItShouldNotThrowAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() { // Arrange @@ -48,6 +50,6 @@ public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs index 8aec8c282a..be356e045d 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,8 +9,8 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Async; -[Trait("Category", "Spanner")] -public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -24,17 +23,20 @@ public WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async() { // Arrange @@ -50,37 +52,37 @@ public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_ var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs index f5462fc4cc..0e658bdd2e 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,8 +9,8 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Async; -[Trait("Category", "Spanner")] -public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -24,17 +23,20 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async() { // Arrange @@ -55,6 +57,6 @@ public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Shoul var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs index 58255df4f0..75f92198b4 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,8 +9,8 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Async; -[Trait("Category", "Spanner")] -public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -24,17 +23,20 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async() { // Arrange @@ -55,37 +57,37 @@ public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_A var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs index 3652c38cd4..1383966cd4 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,8 +9,8 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Async; -[Trait("Category", "Spanner")] -public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -59,8 +61,8 @@ public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Ou .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs index 9463dc9f8e..5c84b8a4ef 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,8 +34,8 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Async; -[Trait("Category", "Spanner")] -public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -85,8 +87,8 @@ public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Asy .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs index ff04c7032b..c258912321 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,8 +34,8 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Async; -[Trait("Category", "Spanner")] -public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -49,17 +48,20 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async() { // Arrange @@ -81,38 +83,38 @@ public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_M var message = await outbox.GetAsync(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs index 2cbaac3c70..44578f8a6f 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,8 +9,8 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Async; -[Trait("Category", "Spanner")] -public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -24,17 +23,20 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async() { // Arrange @@ -46,6 +48,6 @@ public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_ var message = await outbox.GetAsync(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs index 879990c7f6..58f577e895 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,8 +34,8 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Async; -[Trait("Category", "Spanner")] -public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -49,17 +48,20 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync( _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async() { // Arrange @@ -81,9 +83,9 @@ public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_An var messages = (await _outboxProvider.GetAllMessagesAsync()).ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs index 472641d346..28123a3be6 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,8 +9,8 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Async; -[Trait("Category", "Spanner")] -public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -24,17 +23,20 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -58,18 +60,18 @@ public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_As var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs index a67ae8eda4..fe3e2b6876 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,8 +34,8 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Async; -[Trait("Category", "Spanner")] -public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -49,17 +48,20 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async() { // Arrange @@ -83,9 +85,9 @@ public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requeste .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs index 993f53a42d..d8c80ade9a 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,8 +9,8 @@ namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Async; -[Trait("Category", "Spanner")] -public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync : IAsyncLifetime +[Category("Spanner")] +public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -24,17 +23,20 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -58,18 +60,18 @@ public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_A var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs index 6e1cfe72f8..1f88fcbe28 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenAddingADuplicateMessageItShouldNotThrow : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,8 +48,8 @@ public WhenAddingADuplicateMessageItShouldNotThrow() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() + [Test] + public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw() { // Arrange var context = new RequestContext(); @@ -64,7 +63,7 @@ public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs index e7d9dedee7..7b9582a875 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenAddingAMessageItShouldBeStoredWithAllProperties : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,8 +48,8 @@ public WhenAddingAMessageItShouldBeStoredWithAllProperties() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() + [Test] + public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() { // Arrange var context = new RequestContext(); @@ -65,38 +64,38 @@ public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs index 36263f0c6c..6c60334c0e 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,14 +48,14 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -65,12 +64,12 @@ public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_ // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Rollback(); + await transaction.RollbackAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs index dfa8434d21..e438770976 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,14 +48,14 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -65,43 +64,43 @@ public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_C // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Commit(); + await transaction.CommitAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs index 26d64e2780..1079812b75 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,8 +48,8 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -75,9 +74,9 @@ public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs index f12e33ad45..ccda3b4e22 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenDeletingOneMessageItShouldBeRemovedFromOutbox : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,8 +48,8 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -75,9 +74,9 @@ public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs index f83b0e9872..ddc05480fc 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,8 +48,8 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() + [Test] + public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() { // Arrange var context = new RequestContext(); @@ -71,39 +70,39 @@ public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message var message = outbox.Get(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs index 405062e544..45c18a78eb 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,8 +48,8 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() + [Test] + public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() { // Arrange var context = new RequestContext(); @@ -61,7 +60,7 @@ public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Messag var message = outbox.Get(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs index e00a370e1d..48b76b5198 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,8 +48,8 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() + [Test] + public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() { // Arrange var context = new RequestContext(); @@ -71,10 +70,10 @@ public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undi var messages = _outboxProvider.GetAllMessages().ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs index 1c79b796f5..a5e0872dc9 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenRetrievingDispatchedMessagesItShouldFilterByAge : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,8 +48,8 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -73,19 +72,19 @@ public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs index f178a93084..e4182f6b5a 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,8 +48,8 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() + [Test] + public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() { // Arrange var context = new RequestContext(); @@ -73,10 +72,10 @@ public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Mess .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs index 45a701ff20..385f370929 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Outbox/SpannerText/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,14 +27,13 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace Paramore.Brighter.Gcp.Tests.Outbox.SpannerText.Sync; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class WhenRetrievingOutstandingMessagesItShouldFilterByAge : IDisposable { private readonly IAmAnOutboxProviderSync _outboxProvider; @@ -49,8 +48,8 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -73,19 +72,19 @@ public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Paramore.Brighter.Gcp.Tests.csproj b/tests/Paramore.Brighter.Gcp.Tests/Paramore.Brighter.Gcp.Tests.csproj index 478ca4ec32..5ad4ecaa5f 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Paramore.Brighter.Gcp.Tests.csproj +++ b/tests/Paramore.Brighter.Gcp.Tests/Paramore.Brighter.Gcp.Tests.csproj @@ -1,36 +1,16 @@ - $(BrighterTestTargetFrameworks) false + Exe - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - + + + + @@ -40,9 +20,7 @@ - - - + \ No newline at end of file diff --git a/tests/Paramore.Brighter.Gcp.Tests/Spanner/Inbox/SpannerInboxAsyncTest.cs b/tests/Paramore.Brighter.Gcp.Tests/Spanner/Inbox/SpannerInboxAsyncTest.cs index 1acb53953a..a1be6f2eaa 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Spanner/Inbox/SpannerInboxAsyncTest.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Spanner/Inbox/SpannerInboxAsyncTest.cs @@ -1,11 +1,11 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using Google.Cloud.Spanner.Data; using Paramore.Brighter.Base.Test.Inbox; using Paramore.Brighter.Inbox.Spanner; namespace Paramore.Brighter.Gcp.Tests.Spanner.Inbox; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class SpannerInboxAsyncTest : RelationalDatabaseInboxAsyncTests { protected override string DefaultConnectingString => Const.ConnectionString; diff --git a/tests/Paramore.Brighter.Gcp.Tests/Spanner/Inbox/SpannerInboxTest.cs b/tests/Paramore.Brighter.Gcp.Tests/Spanner/Inbox/SpannerInboxTest.cs index edffe3a067..5aa6c55070 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Spanner/Inbox/SpannerInboxTest.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Spanner/Inbox/SpannerInboxTest.cs @@ -1,10 +1,10 @@ -using Google.Cloud.Spanner.Data; +using Google.Cloud.Spanner.Data; using Paramore.Brighter.Base.Test.Inbox; using Paramore.Brighter.Inbox.Spanner; namespace Paramore.Brighter.Gcp.Tests.Spanner.Inbox; -[Trait("Category", "Spanner")] +[Category("Spanner")] public class SpannerInboxTest : RelationalDatabaseInboxTests { protected override string DefaultConnectingString => Const.ConnectionString; diff --git a/tests/Paramore.Brighter.Gcp.Tests/Transformers/When_creating_luggagestore_missing_parameters.cs b/tests/Paramore.Brighter.Gcp.Tests/Transformers/When_creating_luggagestore_missing_parameters.cs index c086a63af6..88f9ec1724 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Transformers/When_creating_luggagestore_missing_parameters.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Transformers/When_creating_luggagestore_missing_parameters.cs @@ -1,34 +1,33 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Transformers.Gcp; namespace Paramore.Brighter.Gcp.Tests.Transformers; -[Trait("Category", "GCS")] +[Category("GCS")] public class LuggageUploadMissingParametersTests { private readonly string _bucketName = $"brightertestbucket-{Guid.NewGuid()}"; - [Fact] - public void When_creating_luggagestore_missing_projectId() + [Test] + public Task When_creating_luggagestore_missing_projectId() { //arrange - var exception = Assert.Throws(() => + Assert.ThrowsExactly(() => { var gcs = new GcsLuggageStore(new GcsLuggageOptions()); gcs.EnsureStoreExists(); }); - - Assert.NotNull(exception); + return Task.CompletedTask; } - [Theory] - [InlineData("")] - [InlineData(null)] - public void When_creating_luggagestore_missing_bucketName(string? bucketName) + [Test] + [Arguments("")] + [Arguments(null)] + public Task When_creating_luggagestore_missing_bucketName(string? bucketName) { //arrange - var exception = Assert.Throws(() => + Assert.ThrowsExactly(() => { var gcs = new GcsLuggageStore(new GcsLuggageOptions { @@ -38,10 +37,9 @@ public void When_creating_luggagestore_missing_bucketName(string? bucketName) gcs.EnsureStoreExists(); }); - - Assert.NotNull(exception); + return Task.CompletedTask; } - [Fact] + [Test] public async Task When_creating_luggagestore_missing_projectId_async() { //arrange @@ -51,12 +49,12 @@ public async Task When_creating_luggagestore_missing_projectId_async() await gcs.EnsureStoreExistsAsync(); }); - Assert.NotNull(exception); + await Assert.That(exception).IsNotNull(); } - [Theory] - [InlineData("")] - [InlineData(null)] + [Test] + [Arguments("")] + [Arguments(null)] public async Task When_creating_luggagestore_missing_bucketName_async(string? bucketName) { //arrange @@ -71,6 +69,6 @@ public async Task When_creating_luggagestore_missing_bucketName_async(string? bu await gcs.EnsureStoreExistsAsync(); }); - Assert.NotNull(exception); + await Assert.That(exception).IsNotNull(); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Transformers/When_unwrapping_a_large_message.cs b/tests/Paramore.Brighter.Gcp.Tests/Transformers/When_unwrapping_a_large_message.cs index c5fb1a6496..629a7e8b05 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Transformers/When_unwrapping_a_large_message.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Transformers/When_unwrapping_a_large_message.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Text.Json; using System.Threading.Tasks; @@ -10,7 +10,7 @@ namespace Paramore.Brighter.Gcp.Tests.Transformers; -[Trait("Category", "GCS")] +[Category("GCS")] public class LargeMessagePaylodUnwrapTests : IDisposable { private readonly TransformPipelineBuilderAsync _pipelineBuilder; @@ -21,7 +21,6 @@ public class LargeMessagePaylodUnwrapTests : IDisposable public LargeMessagePaylodUnwrapTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); var mapperRegistry = new MessageMapperRegistry( null, @@ -49,7 +48,7 @@ public LargeMessagePaylodUnwrapTests() _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.None); } - [Fact] + [Test] public async Task When_unwrapping_a_large_message() { //arrange @@ -88,8 +87,8 @@ public async Task When_unwrapping_a_large_message() //assert //contents should be from storage - Assert.Equal(contents, transformedMessage.Value); - Assert.False(await _luggageStore.HasClaimAsync(id)); + await Assert.That(transformedMessage.Value).IsEqualTo(contents); + await Assert.That(await _luggageStore.HasClaimAsync(id)).IsFalse(); } public void Dispose() diff --git a/tests/Paramore.Brighter.Gcp.Tests/Transformers/When_uploading_luggage_to_S3.cs b/tests/Paramore.Brighter.Gcp.Tests/Transformers/When_uploading_luggage_to_S3.cs index c7f6122700..678110bbcd 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Transformers/When_uploading_luggage_to_S3.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Transformers/When_uploading_luggage_to_S3.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; using Paramore.Brighter.Gcp.Tests.Helper; @@ -6,7 +6,7 @@ namespace Paramore.Brighter.Gcp.Tests.Transformers; -[Trait("Category", "GCS")] +[Category("GCS")] public class LuggageUploadTests : IDisposable { private readonly string _bucketName; @@ -28,7 +28,7 @@ public LuggageUploadTests() } - [Fact] + [Test] public async Task When_uploading_luggage_to_S3() { //arrange @@ -47,12 +47,12 @@ public async Task When_uploading_luggage_to_S3() //assert //do we have a claim? - Assert.True(await _luggageStore.HasClaimAsync(claim)); + await Assert.That(await _luggageStore.HasClaimAsync(claim)).IsTrue(); //check for the contents indicated by the claim id on S3 var result = await _luggageStore.RetrieveAsync(claim); var resultAsString = await new StreamReader(result).ReadToEndAsync(); - Assert.Equal(testContent, resultAsString); + await Assert.That(resultAsString).IsEqualTo(testContent); await _luggageStore.DeleteAsync(claim); diff --git a/tests/Paramore.Brighter.Gcp.Tests/Transformers/When_validating_a_luggage_store_exists.cs b/tests/Paramore.Brighter.Gcp.Tests/Transformers/When_validating_a_luggage_store_exists.cs index d933ce0e91..c920d55b6e 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Transformers/When_validating_a_luggage_store_exists.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Transformers/When_validating_a_luggage_store_exists.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Gcp.Tests.Helper; using Paramore.Brighter.Transformers.Gcp; @@ -6,10 +6,10 @@ namespace Paramore.Brighter.Gcp.Tests.Transformers; -[Trait("Category", "GCS")] +[Category("GCS")] public class LuggageStoreExistsTests { - [Fact] + [Test] public async Task When_checking_store_that_exists() { var bucketName = $"brightertestbucket-{Guid.NewGuid()}"; @@ -34,7 +34,7 @@ public async Task When_checking_store_that_exists() await client.DeleteBucketAsync(bucketName); } - [Fact] + [Test] public async Task When_checking_store_that_does_not_exist() { //act @@ -52,6 +52,6 @@ public async Task When_checking_store_that_does_not_exist() await luggageStore.EnsureStoreExistsAsync(); }); - Assert.NotNull(doesNotExist); + await Assert.That(doesNotExist).IsNotNull(); } } diff --git a/tests/Paramore.Brighter.Gcp.Tests/Transformers/When_wrapping_a_large_message.cs b/tests/Paramore.Brighter.Gcp.Tests/Transformers/When_wrapping_a_large_message.cs index 9b27c33216..695d3b91d3 100644 --- a/tests/Paramore.Brighter.Gcp.Tests/Transformers/When_wrapping_a_large_message.cs +++ b/tests/Paramore.Brighter.Gcp.Tests/Transformers/When_wrapping_a_large_message.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Gcp.Tests.Helper; using Paramore.Brighter.Gcp.Tests.TestDoubles; @@ -8,7 +8,7 @@ namespace Paramore.Brighter.Gcp.Tests.Transformers; -[Trait("Category", "GCS")] +[Category("GCS")] public class LargeMessagePayloadWrapTests : IDisposable { private string? _id; @@ -23,7 +23,6 @@ public class LargeMessagePayloadWrapTests : IDisposable public LargeMessagePayloadWrapTests() { //arrange - TransformPipelineBuilderAsync.ClearPipelineCache(); var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync( @@ -52,7 +51,7 @@ public LargeMessagePayloadWrapTests() _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, transformerFactoryAsync, InstrumentationOptions.None); } - [Fact] + [Test] public async Task When_wrapping_a_large_message() { //act @@ -60,12 +59,12 @@ public async Task When_wrapping_a_large_message() var message = await _transformPipeline.WrapAsync(_myCommand, new RequestContext(), _publication); //assert - Assert.True(message.Header.Bag.ContainsKey(ClaimCheckTransformer.CLAIM_CHECK)); - Assert.NotNull(message.Header.DataRef); + await Assert.That(message.Header.Bag.ContainsKey(ClaimCheckTransformer.CLAIM_CHECK)).IsTrue(); + await Assert.That(message.Header.DataRef).IsNotNull(); _id = (string)message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK]; - Assert.Equal($"Claim Check {_id}", message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo($"Claim Check {_id}"); - Assert.True(await _luggageStore.HasClaimAsync(_id)); + await Assert.That(await _luggageStore.HasClaimAsync(_id)).IsTrue(); } public void Dispose() diff --git a/tests/Paramore.Brighter.Hangfire.Tests/Paramore.Brighter.Hangfire.Tests.csproj b/tests/Paramore.Brighter.Hangfire.Tests/Paramore.Brighter.Hangfire.Tests.csproj index f95db5a413..160f148654 100644 --- a/tests/Paramore.Brighter.Hangfire.Tests/Paramore.Brighter.Hangfire.Tests.csproj +++ b/tests/Paramore.Brighter.Hangfire.Tests/Paramore.Brighter.Hangfire.Tests.csproj @@ -1,39 +1,18 @@ - $(BrighterTestTargetFrameworks) enable false true + Exe - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - + - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - + + + - - + \ No newline at end of file diff --git a/tests/Paramore.Brighter.Hangfire.Tests/TestDoubles/BrighterActivator.cs b/tests/Paramore.Brighter.Hangfire.Tests/TestDoubles/BrighterActivator.cs index 6ec41ace90..7d4e3b75f8 100644 --- a/tests/Paramore.Brighter.Hangfire.Tests/TestDoubles/BrighterActivator.cs +++ b/tests/Paramore.Brighter.Hangfire.Tests/TestDoubles/BrighterActivator.cs @@ -5,13 +5,18 @@ namespace Paramore.Brighter.Hangfire.Tests.TestDoubles; public class BrighterActivator : JobActivator { - public static IAmACommandProcessor Processor { get; set; } + private readonly IAmACommandProcessor _processor; + + public BrighterActivator(IAmACommandProcessor processor) + { + _processor = processor; + } public override object ActivateJob(Type jobType) { if (jobType == typeof(BrighterHangfireSchedulerJob)) { - return new BrighterHangfireSchedulerJob(Processor); + return new BrighterHangfireSchedulerJob(_processor); } return base.ActivateJob(jobType); diff --git a/tests/Paramore.Brighter.Hangfire.Tests/When_scheduling_a_message.cs b/tests/Paramore.Brighter.Hangfire.Tests/When_scheduling_a_message.cs index 9cbee61f89..9a7da01d60 100644 --- a/tests/Paramore.Brighter.Hangfire.Tests/When_scheduling_a_message.cs +++ b/tests/Paramore.Brighter.Hangfire.Tests/When_scheduling_a_message.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using System.Transactions; using Hangfire; using Hangfire.InMemory; @@ -13,11 +13,11 @@ namespace Paramore.Brighter.Hangfire.Tests; -[Collection("Scheduler")] public class HangfireSchedulerMessageTests : IDisposable { private readonly HangfireMessageSchedulerFactory _scheduler; private readonly BackgroundJobServer _server; + private readonly JobStorage _storage; private readonly IAmACommandProcessor _processor; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); @@ -70,18 +70,6 @@ public HangfireSchedulerMessageTests() _outbox ); - GlobalConfiguration.Configuration - .SetDataCompatibilityLevel(CompatibilityLevel.Version_180) - .UseSimpleAssemblyNameTypeSerializer() - .UseRecommendedSerializerSettings() - .UseInMemoryStorage(new InMemoryStorageOptions { IdType = InMemoryStorageIdType.Guid }) - .UseActivator(new BrighterActivator()); - - _server = new BackgroundJobServer(new BackgroundJobServerOptions - { - WorkerCount = 1, SchedulePollingInterval = TimeSpan.FromSeconds(1), Activator = new BrighterActivator(), - }); - _scheduler = new HangfireMessageSchedulerFactory(); _processor = new CommandProcessor( @@ -94,11 +82,23 @@ public HangfireSchedulerMessageTests() _scheduler ); - BrighterActivator.Processor = _processor; + GlobalConfiguration.Configuration + .SetDataCompatibilityLevel(CompatibilityLevel.Version_180) + .UseSimpleAssemblyNameTypeSerializer() + .UseRecommendedSerializerSettings(); + + _storage = new InMemoryStorage(new InMemoryStorageOptions { IdType = InMemoryStorageIdType.Guid }); + var activator = new BrighterActivator(_processor); + _server = new BackgroundJobServer(new BackgroundJobServerOptions + { + WorkerCount = 1, SchedulePollingInterval = TimeSpan.FromSeconds(1), Activator = activator, + }, _storage); + + _scheduler.Client = new BackgroundJobClient(_storage); } - [Fact] - public void When_scheduler_a_message_with_a_datetimeoffset() + [Test] + public async Task When_scheduler_a_message_with_a_datetimeoffset() { var req = new MyEvent(); var message = @@ -110,19 +110,19 @@ public void When_scheduler_a_message_with_a_datetimeoffset() var id = scheduler.Schedule(message, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Equivalent(message, _outbox.Get(message.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(message.Id, new RequestContext())).IsEquivalentTo(message); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); } - [Fact] - public void When_scheduler_a_message_with_a_timespan() + [Test] + public async Task When_scheduler_a_message_with_a_timespan() { var req = new MyEvent(); var message = @@ -133,19 +133,19 @@ public void When_scheduler_a_message_with_a_timespan() var scheduler = (IAmAMessageSchedulerSync)_scheduler.Create(_processor); var id = scheduler.Schedule(message, TimeSpan.FromSeconds(1)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); - Assert.Equivalent(message, _outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsEquivalentTo(message); } - [Fact] - public void When_reschedule_a_message_with_a_datetimeoffset() + [Test] + public async Task When_reschedule_a_message_with_a_datetimeoffset() { var req = new MyEvent(); var message = @@ -156,23 +156,23 @@ public void When_reschedule_a_message_with_a_datetimeoffset() var scheduler = (IAmAMessageSchedulerSync)_scheduler.Create(_processor); var id = scheduler.Schedule(message, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(id.Length).IsNotEqualTo(0); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); - Assert.True(scheduler - .ReScheduler(id, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(5)))); + await Assert.That(scheduler + .ReScheduler(id, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(5)))).IsTrue(); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); Thread.Sleep(TimeSpan.FromSeconds(6)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); - Assert.Equivalent(message, _outbox.Get(req.Id, new RequestContext())); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsEquivalentTo(message); } - [Fact] - public void When_reschedule_a_message_with_a_timespan() + [Test] + public async Task When_reschedule_a_message_with_a_timespan() { var req = new MyEvent(); var message = @@ -183,22 +183,22 @@ public void When_reschedule_a_message_with_a_timespan() var scheduler = (IAmAMessageSchedulerSync)_scheduler.Create(_processor); var id = scheduler.Schedule(message, TimeSpan.FromHours(1)); - Assert.NotEqual(0, id.Length); - Assert.Empty(_internalBus.Stream(_routingKey) ?? []); + await Assert.That(id.Length).IsNotEqualTo(0); + await Assert.That(_internalBus.Stream(_routingKey) ?? []).IsEmpty(); - Assert.True(scheduler.ReScheduler(id, TimeSpan.FromSeconds(5))); + await Assert.That(scheduler.ReScheduler(id, TimeSpan.FromSeconds(5))).IsTrue(); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Empty(_internalBus.Stream(_routingKey) ?? []); + await Assert.That(_internalBus.Stream(_routingKey) ?? []).IsEmpty(); Thread.Sleep(TimeSpan.FromSeconds(4)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); - Assert.NotEqual(Message.Empty, _outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); } - [Fact] - public void When_cancel_scheduler_message_with_a_datetimeoffset() + [Test] + public async Task When_cancel_scheduler_message_with_a_datetimeoffset() { var req = new MyEvent(); var message = @@ -209,32 +209,32 @@ public void When_cancel_scheduler_message_with_a_datetimeoffset() var scheduler = (IAmAMessageSchedulerSync)_scheduler.Create(_processor); var id = scheduler.Schedule(message, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); scheduler.Cancel(id); Thread.Sleep(TimeSpan.FromSeconds(2)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] - public void When_cancel_scheduler_request_with_a_timespan() + [Test] + public async Task When_cancel_scheduler_request_with_a_timespan() { var req = new MyEvent(); var message = @@ -245,27 +245,27 @@ public void When_cancel_scheduler_request_with_a_timespan() var scheduler = (IAmAMessageSchedulerSync)_scheduler.Create(_processor); var id = scheduler.Schedule(message, TimeSpan.FromSeconds(1)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); scheduler.Cancel(id); Thread.Sleep(TimeSpan.FromSeconds(2)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } public void Dispose() diff --git a/tests/Paramore.Brighter.Hangfire.Tests/When_scheduling_a_message_async.cs b/tests/Paramore.Brighter.Hangfire.Tests/When_scheduling_a_message_async.cs index 6f41bfbb63..3da014211b 100644 --- a/tests/Paramore.Brighter.Hangfire.Tests/When_scheduling_a_message_async.cs +++ b/tests/Paramore.Brighter.Hangfire.Tests/When_scheduling_a_message_async.cs @@ -1,4 +1,4 @@ -using System.Text.Json; +using System.Text.Json; using System.Transactions; using Hangfire; using Hangfire.InMemory; @@ -13,11 +13,11 @@ namespace Paramore.Brighter.Hangfire.Tests; -[Collection("Scheduler")] public class HangfireSchedulerMessageAsyncTests : IDisposable { private readonly HangfireMessageSchedulerFactory _scheduler; private readonly BackgroundJobServer _server; + private readonly JobStorage _storage; private readonly IAmACommandProcessor _processor; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); @@ -77,17 +77,6 @@ public HangfireSchedulerMessageAsyncTests() _outbox ); - GlobalConfiguration.Configuration - .SetDataCompatibilityLevel(CompatibilityLevel.Version_180) - .UseSimpleAssemblyNameTypeSerializer() - .UseRecommendedSerializerSettings() - .UseInMemoryStorage(new InMemoryStorageOptions { IdType = InMemoryStorageIdType.Guid }) - .UseActivator(new BrighterActivator()); - - _server = new BackgroundJobServer(new BackgroundJobServerOptions - { - WorkerCount = 1, SchedulePollingInterval = TimeSpan.FromSeconds(1), Activator = new BrighterActivator(), - }); _scheduler = new HangfireMessageSchedulerFactory(); _processor = new CommandProcessor( @@ -100,10 +89,21 @@ public HangfireSchedulerMessageAsyncTests() _scheduler ); - BrighterActivator.Processor = _processor; + GlobalConfiguration.Configuration + .SetDataCompatibilityLevel(CompatibilityLevel.Version_180) + .UseSimpleAssemblyNameTypeSerializer() + .UseRecommendedSerializerSettings(); + + _storage = new InMemoryStorage(new InMemoryStorageOptions { IdType = InMemoryStorageIdType.Guid }); + var activator = new BrighterActivator(_processor); + _server = new BackgroundJobServer(new BackgroundJobServerOptions + { + WorkerCount = 1, SchedulePollingInterval = TimeSpan.FromSeconds(1), Activator = activator, + }, _storage); + _scheduler.Client = new BackgroundJobClient(_storage); } - [Fact] + [Test] public async Task When_scheduler_a_message_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -116,18 +116,18 @@ public async Task When_scheduler_a_message_with_a_datetimeoffset_async() var id = await scheduler.ScheduleAsync(message, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Equivalent(message, _outbox.Get(message.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(message.Id, new RequestContext())).IsEquivalentTo(message); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); } - [Fact] + [Test] public async Task When_scheduler_a_message_with_a_timespan_async() { var req = new MyEvent(); @@ -139,18 +139,18 @@ public async Task When_scheduler_a_message_with_a_timespan_async() var scheduler = (IAmAMessageSchedulerAsync)_scheduler.Create(_processor); var id = await scheduler.ScheduleAsync(message, TimeSpan.FromSeconds(1)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); - Assert.Equivalent(message, _outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsEquivalentTo(message); } - [Fact] + [Test] public async Task When_reschedule_a_message_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -162,21 +162,21 @@ public async Task When_reschedule_a_message_with_a_datetimeoffset_async() var scheduler = (IAmAMessageSchedulerAsync)_scheduler.Create(_processor); var id = await scheduler.ScheduleAsync(message, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); - Assert.Empty(_internalBus.Stream(_routingKey) ?? []); + await Assert.That(id.Length).IsNotEqualTo(0); + await Assert.That(_internalBus.Stream(_routingKey) ?? []).IsEmpty(); - Assert.True(await scheduler.ReSchedulerAsync(id, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(5)))); + await Assert.That(await scheduler.ReSchedulerAsync(id, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(5)))).IsTrue(); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); await Task.Delay(TimeSpan.FromSeconds(4)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); - Assert.Equivalent(message, _outbox.Get(req.Id, new RequestContext())); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsEquivalentTo(message); } - [Fact] + [Test] public async Task When_reschedule_a_message_with_a_timespan_async() { var req = new MyEvent(); @@ -188,21 +188,21 @@ public async Task When_reschedule_a_message_with_a_timespan_async() var scheduler = (IAmAMessageSchedulerAsync)_scheduler.Create(_processor); var id = await scheduler.ScheduleAsync(message, TimeSpan.FromSeconds(1)); - Assert.NotEqual(0, id.Length); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(id.Length).IsNotEqualTo(0); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); - Assert.True(await scheduler.ReSchedulerAsync(id, TimeSpan.FromSeconds(5))); + await Assert.That(await scheduler.ReSchedulerAsync(id, TimeSpan.FromSeconds(5))).IsTrue(); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); await Task.Delay(TimeSpan.FromSeconds(4)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); - Assert.NotEqual(Message.Empty, _outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); } - [Fact] + [Test] public async Task When_cancel_scheduler_message_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -214,7 +214,7 @@ public async Task When_cancel_scheduler_message_with_a_datetimeoffset_async() var scheduler = (IAmAMessageSchedulerAsync)_scheduler.Create(_processor); var id = await scheduler.ScheduleAsync(message, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); await scheduler.CancelAsync(id); @@ -223,22 +223,22 @@ public async Task When_cancel_scheduler_message_with_a_datetimeoffset_async() var expected = Message.Empty; var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_cancel_scheduler_request_with_a_timespan_async() { var req = new MyEvent(); @@ -250,7 +250,7 @@ public async Task When_cancel_scheduler_request_with_a_timespan_async() var scheduler = (IAmAMessageSchedulerAsync)_scheduler.Create(_processor); var id = await scheduler.ScheduleAsync(message, TimeSpan.FromHours(1)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); await scheduler.CancelAsync(id); @@ -259,18 +259,18 @@ public async Task When_cancel_scheduler_request_with_a_timespan_async() var expected = Message.Empty; var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } public void Dispose() diff --git a/tests/Paramore.Brighter.Hangfire.Tests/When_scheduling_a_request.cs b/tests/Paramore.Brighter.Hangfire.Tests/When_scheduling_a_request.cs index 2fdfa9b9b2..286c6d4804 100644 --- a/tests/Paramore.Brighter.Hangfire.Tests/When_scheduling_a_request.cs +++ b/tests/Paramore.Brighter.Hangfire.Tests/When_scheduling_a_request.cs @@ -1,4 +1,4 @@ -using System.Transactions; +using System.Transactions; using Hangfire; using Hangfire.InMemory; using Paramore.Brighter.Extensions; @@ -12,11 +12,11 @@ namespace Paramore.Brighter.Hangfire.Tests; -[Collection("Scheduler")] public class HangfireSchedulerRequestTests : IDisposable { private readonly HangfireMessageSchedulerFactory _scheduler; private readonly BackgroundJobServer _server; + private readonly JobStorage _storage; private readonly IAmACommandProcessor _processor; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); @@ -71,17 +71,6 @@ public HangfireSchedulerRequestTests() _outbox ); - GlobalConfiguration.Configuration - .SetDataCompatibilityLevel(CompatibilityLevel.Version_180) - .UseSimpleAssemblyNameTypeSerializer() - .UseRecommendedSerializerSettings() - .UseInMemoryStorage(new InMemoryStorageOptions { IdType = InMemoryStorageIdType.Guid }) - .UseActivator(new BrighterActivator()); - - _server = new BackgroundJobServer(new BackgroundJobServerOptions - { - WorkerCount = 1, SchedulePollingInterval = TimeSpan.FromSeconds(1), Activator = new BrighterActivator(), - }); _scheduler = new HangfireMessageSchedulerFactory(); _processor = new CommandProcessor( @@ -94,332 +83,343 @@ public HangfireSchedulerRequestTests() _scheduler ); - BrighterActivator.Processor = _processor; + GlobalConfiguration.Configuration + .SetDataCompatibilityLevel(CompatibilityLevel.Version_180) + .UseSimpleAssemblyNameTypeSerializer() + .UseRecommendedSerializerSettings(); + + _storage = new InMemoryStorage(new InMemoryStorageOptions { IdType = InMemoryStorageIdType.Guid }); + var activator = new BrighterActivator(_processor); + _server = new BackgroundJobServer(new BackgroundJobServerOptions + { + WorkerCount = 1, SchedulePollingInterval = TimeSpan.FromSeconds(1), Activator = activator, + }, _storage); + _scheduler.Client = new BackgroundJobClient(_storage); } #region Scheduler - [Fact] - public void When_scheduler_send_request_with_a_datetimeoffset() + [Test] + public async Task When_scheduler_send_request_with_a_datetimeoffset() { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, RequestSchedulerType.Send, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] - public void When_scheduler_send_request_with_a_timespan() + [Test] + public async Task When_scheduler_send_request_with_a_timespan() { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, RequestSchedulerType.Send, TimeSpan.FromSeconds(1)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] - public void When_scheduler_publish_request_with_a_datetimeoffset() + [Test] + public async Task When_scheduler_publish_request_with_a_datetimeoffset() { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, RequestSchedulerType.Publish, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] - public void When_scheduler_publish_request_with_a_timespan() + [Test] + public async Task When_scheduler_publish_request_with_a_timespan() { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, RequestSchedulerType.Publish, TimeSpan.FromSeconds(1)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] - public void When_scheduler_post_request_with_a_datetimeoffset() + [Test] + public async Task When_scheduler_post_request_with_a_datetimeoffset() { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, RequestSchedulerType.Post, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.Empty(_internalBus.Stream(_routingKey) ?? []); + await Assert.That(_internalBus.Stream(_routingKey) ?? []).IsEmpty(); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); - Assert.NotEqual(Message.Empty, _outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); } - [Fact] - public void When_scheduler_post_request_with_a_timespan() + [Test] + public async Task When_scheduler_post_request_with_a_timespan() { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, RequestSchedulerType.Post, TimeSpan.FromSeconds(1)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.Empty(_internalBus.Stream(_routingKey) ?? []); + await Assert.That(_internalBus.Stream(_routingKey) ?? []).IsEmpty(); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); - Assert.NotEqual(Message.Empty, _outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); } #endregion #region Rescheduler - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Publish)] - public void When_reschedule_request_with_a_datetimeoffset(RequestSchedulerType type) + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Publish)] + public async Task When_reschedule_request_with_a_datetimeoffset(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, type, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.True(scheduler.ReScheduler(id, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(5)))); + await Assert.That(scheduler.ReScheduler(id, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(5)))).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(4)); - Assert.Contains(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Publish)] - public void When_reschedule_send_request_with_a_timespan(RequestSchedulerType type) + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Publish)] + public async Task When_reschedule_send_request_with_a_timespan(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, type, TimeSpan.FromSeconds(1)); - Assert.NotEqual(0, id.Length); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(id.Length).IsNotEqualTo(0); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); - Assert.True(scheduler.ReScheduler(id, TimeSpan.FromSeconds(5))); + await Assert.That(scheduler.ReScheduler(id, TimeSpan.FromSeconds(5))).IsTrue(); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(4)); - Assert.Contains(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } #endregion #region Cancel - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] - public void When_cancel_scheduler_request_with_a_datetimeoffset(RequestSchedulerType type) + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] + public async Task When_cancel_scheduler_request_with_a_datetimeoffset(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, type, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); scheduler.Cancel(id); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] - public void When_cancel_scheduler_request_with_a_timespan(RequestSchedulerType type) + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] + public async Task When_cancel_scheduler_request_with_a_timespan(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, type, TimeSpan.FromSeconds(1)); - Assert.NotEqual(0, id.Length); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(id.Length).IsNotEqualTo(0); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); scheduler.Cancel(id); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } #endregion diff --git a/tests/Paramore.Brighter.Hangfire.Tests/When_scheduling_a_request_async.cs b/tests/Paramore.Brighter.Hangfire.Tests/When_scheduling_a_request_async.cs index 1aa3ae4989..65234d2878 100644 --- a/tests/Paramore.Brighter.Hangfire.Tests/When_scheduling_a_request_async.cs +++ b/tests/Paramore.Brighter.Hangfire.Tests/When_scheduling_a_request_async.cs @@ -1,4 +1,4 @@ -using System.Transactions; +using System.Transactions; using Hangfire; using Hangfire.InMemory; using Paramore.Brighter.Extensions; @@ -13,11 +13,11 @@ namespace Paramore.Brighter.Hangfire.Tests; -[Collection("Scheduler")] public class HangfireSchedulerRequestAsyncTests : IDisposable { private readonly HangfireMessageSchedulerFactory _scheduler; private readonly BackgroundJobServer _server; + private readonly JobStorage _storage; private readonly IAmACommandProcessor _processor; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); @@ -79,17 +79,6 @@ public HangfireSchedulerRequestAsyncTests() _outbox ); - GlobalConfiguration.Configuration - .SetDataCompatibilityLevel(CompatibilityLevel.Version_180) - .UseSimpleAssemblyNameTypeSerializer() - .UseRecommendedSerializerSettings() - .UseInMemoryStorage(new InMemoryStorageOptions { IdType = InMemoryStorageIdType.Guid }) - .UseActivator(new BrighterActivator()); - - _server = new BackgroundJobServer(new BackgroundJobServerOptions - { - WorkerCount = 1, SchedulePollingInterval = TimeSpan.FromSeconds(1), Activator = new BrighterActivator(), - }); _scheduler = new HangfireMessageSchedulerFactory(); _processor = new CommandProcessor( @@ -102,12 +91,23 @@ public HangfireSchedulerRequestAsyncTests() _scheduler ); - BrighterActivator.Processor = _processor; + GlobalConfiguration.Configuration + .SetDataCompatibilityLevel(CompatibilityLevel.Version_180) + .UseSimpleAssemblyNameTypeSerializer() + .UseRecommendedSerializerSettings(); + + _storage = new InMemoryStorage(new InMemoryStorageOptions { IdType = InMemoryStorageIdType.Guid }); + var activator = new BrighterActivator(_processor); + _server = new BackgroundJobServer(new BackgroundJobServerOptions + { + WorkerCount = 1, SchedulePollingInterval = TimeSpan.FromSeconds(1), Activator = activator, + }, _storage); + _scheduler.Client = new BackgroundJobClient(_storage); } #region Scheduler - [Fact] + [Test] public async Task When_scheduler_send_request_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -115,64 +115,64 @@ public async Task When_scheduler_send_request_with_a_datetimeoffset_async() var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Send, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_scheduler_send_request_with_a_timespan_asc() { var req = new MyEvent(); var scheduler = _scheduler.CreateAsync(_processor); var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Send, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_scheduler_publish_request_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -180,64 +180,64 @@ public async Task When_scheduler_publish_request_with_a_datetimeoffset_async() var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Publish, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_scheduler_publish_request_with_a_timespan() { var req = new MyEvent(); var scheduler = _scheduler.CreateAsync(_processor); var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Publish, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_scheduler_post_request_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -245,122 +245,122 @@ public async Task When_scheduler_post_request_with_a_datetimeoffset_async() var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Post, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.Empty(_internalBus.Stream(_routingKey) ?? []); + await Assert.That(_internalBus.Stream(_routingKey) ?? []).IsEmpty(); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.NotEqual(Message.Empty, await _outbox.GetAsync(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); } - [Fact] + [Test] public async Task When_scheduler_post_request_with_a_timespan_async() { var req = new MyEvent(); var scheduler = _scheduler.CreateAsync(_processor); var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Post, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.Empty(_internalBus.Stream(_routingKey) ?? []); + await Assert.That(_internalBus.Stream(_routingKey) ?? []).IsEmpty(); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); - Assert.NotEqual(Message.Empty, await _outbox.GetAsync(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); } #endregion #region Rescheduler - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_reschedule_request_with_a_datetimeoffset_async(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateAsync(_processor); var id = await scheduler.ScheduleAsync(req, type, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.True((await scheduler.ReSchedulerAsync(id, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(5))))); + await Assert.That((await scheduler.ReSchedulerAsync(id, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(5))))).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(4)); - Assert.Contains(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_reschedule_send_request_with_a_timespan_async(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateAsync(_processor); var id = await scheduler.ScheduleAsync(req, type, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That((id)?.Any()).IsTrue(); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); - Assert.True((await scheduler.ReSchedulerAsync(id, TimeSpan.FromSeconds(5)))); + await Assert.That((await scheduler.ReSchedulerAsync(id, TimeSpan.FromSeconds(5)))).IsTrue(); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(4)); - Assert.Contains(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } #endregion #region Cancel - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_cancel_scheduler_request_with_a_datetimeoffset(RequestSchedulerType type) { var req = new MyEvent(); @@ -368,65 +368,65 @@ public async Task When_cancel_scheduler_request_with_a_datetimeoffset(RequestSch var id = await scheduler.ScheduleAsync(req, type, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await scheduler.CancelAsync(id); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_cancel_scheduler_request_with_a_timespan_async(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateAsync(_processor); var id = await scheduler.ScheduleAsync(req, type, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That((id)?.Any()).IsTrue(); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await scheduler.CancelAsync(id); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } #endregion diff --git a/tests/Paramore.Brighter.InMemory.Tests/Bus/When_accessing_messages_on_an_empty_bus.cs b/tests/Paramore.Brighter.InMemory.Tests/Bus/When_accessing_messages_on_an_empty_bus.cs index 6da399510d..61b7e11b8e 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Bus/When_accessing_messages_on_an_empty_bus.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Bus/When_accessing_messages_on_an_empty_bus.cs @@ -1,11 +1,10 @@ -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Bus; public class InternalBusStreamTests { - [Fact] - public void When_accessing_messages_on_an_empty_bus() + [Test] + public async Task When_accessing_messages_on_an_empty_bus() { //arrange //creste an instance of the InternalBus @@ -17,6 +16,6 @@ public void When_accessing_messages_on_an_empty_bus() //assert //should be empty - Assert.Empty(messages); + await Assert.That(messages).IsEmpty(); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Bus/When_dequeing_messages_from_an_internal_bus.cs b/tests/Paramore.Brighter.InMemory.Tests/Bus/When_dequeing_messages_from_an_internal_bus.cs index ee4b0b9cb7..8242305b2f 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Bus/When_dequeing_messages_from_an_internal_bus.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Bus/When_dequeing_messages_from_an_internal_bus.cs @@ -1,12 +1,11 @@ -using System; -using Xunit; +using System; namespace Paramore.Brighter.InMemory.Tests.Bus; public class InternalBusDequeueTests { - [Fact] - public void When_dequeing_messages_from_an_internal_bus () + [Test] + public async Task When_dequeing_messages_from_an_internal_bus () { // arrange var routingKey = new RoutingKey("test"); @@ -24,15 +23,15 @@ public void When_dequeing_messages_from_an_internal_bus () var message = internalBus.Dequeue(routingKey); //assert - Assert.NotNull(message); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - Assert.Equal(body, message.Body.Value); - Assert.Equal(routingKey, message.Header.Topic); - Assert.Equal(messageId, message.Header.MessageId); + await Assert.That(message).IsNotNull(); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(message.Body.Value).IsEqualTo(body); + await Assert.That(message.Header.Topic).IsEqualTo(routingKey); + await Assert.That(message.Header.MessageId).IsEqualTo(messageId); } - [Fact] - public void When_dequeing_messages_from_an_internal_bus_and_no_messages() + [Test] + public async Task When_dequeing_messages_from_an_internal_bus_and_no_messages() { // arrange const string topic = "test"; @@ -42,7 +41,7 @@ public void When_dequeing_messages_from_an_internal_bus_and_no_messages() var message = internalBus.Dequeue(new RoutingKey(topic)); //assert - Assert.NotNull(message); - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message).IsNotNull(); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Bus/When_enqueueing_messages_on_an_internal_bus.cs b/tests/Paramore.Brighter.InMemory.Tests/Bus/When_enqueueing_messages_on_an_internal_bus.cs index 5612834afb..ab280f30de 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Bus/When_enqueueing_messages_on_an_internal_bus.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Bus/When_enqueueing_messages_on_an_internal_bus.cs @@ -1,13 +1,12 @@ -using System; +using System; using System.Linq; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Bus; public class InternalBusEnqueueTests { - [Fact] - public void When_enqueueing_messages_on_an_internal_bus() + [Test] + public async Task When_enqueueing_messages_on_an_internal_bus() { //arrange var internalBus = new InternalBus(); @@ -19,10 +18,10 @@ public void When_enqueueing_messages_on_an_internal_bus() //assert var message = internalBus.Stream(routingKey).Single(); - Assert.NotNull(message); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - Assert.Equal("test_content", message.Body.Value); - Assert.Equal(routingKey, message.Header.Topic); - Assert.Equal(messageId, message.Header.MessageId); + await Assert.That(message).IsNotNull(); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(message.Body.Value).IsEqualTo("test_content"); + await Assert.That(message.Header.Topic).IsEqualTo(routingKey); + await Assert.That(message.Header.MessageId).IsEqualTo(messageId); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_a_dequeued_item_is_acknowledged.cs b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_a_dequeued_item_is_acknowledged.cs index 481dec375e..115122436b 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_a_dequeued_item_is_acknowledged.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_a_dequeued_item_is_acknowledged.cs @@ -1,14 +1,13 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.Time.Testing; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Consumer; public class InMemoryConsumerAcknowledgeTests { - [Fact] - public void When_a_dequeud_item_lock_expires() + [Test] + public async Task When_a_dequeud_item_lock_expires() { //arrange const string myTopic = "my topic"; @@ -25,17 +24,17 @@ public void When_a_dequeud_item_lock_expires() var consumer = new InMemoryMessageConsumer(routingKey, bus, timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)); //act - var receivedMessage = consumer.Receive().Single(); + var receivedMessage = (await consumer.ReceiveAsync()).Single(); timeProvider.Advance(TimeSpan.FromSeconds(2)); //assert - Assert.Single(bus.Stream(routingKey)); //-- the message should be returned to the bus if there is no Acknowledge or Reject + await Assert.That(bus.Stream(routingKey)).HasSingleItem(); //-- the message should be returned to the bus if there is no Acknowledge or Reject } - [Fact] - public void When_a_dequeued_item_is_acknowledged() + [Test] + public async Task When_a_dequeued_item_is_acknowledged() { //arrange const string myTopic = "my topic"; @@ -52,12 +51,12 @@ public void When_a_dequeued_item_is_acknowledged() var consumer = new InMemoryMessageConsumer(routingKey, bus, timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)); //act - var receivedMessage = consumer.Receive().Single(); - consumer.Acknowledge(receivedMessage); + var receivedMessage = (await consumer.ReceiveAsync()).Single(); + await consumer.AcknowledgeAsync(receivedMessage); timeProvider.Advance(TimeSpan.FromSeconds(2)); //-- the message should be returned to the bus if there is no Acknowledge or Reject //assert - Assert.Empty(bus.Stream(routingKey)); + await Assert.That(bus.Stream(routingKey)).IsEmpty(); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_a_dequeued_item_is_acknowledged_async.cs b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_a_dequeued_item_is_acknowledged_async.cs index 786d7f0a44..303e23a7aa 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_a_dequeued_item_is_acknowledged_async.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_a_dequeued_item_is_acknowledged_async.cs @@ -1,14 +1,13 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Consumer; public class AsyncInMemoryConsumerAcknowledgeTests { - [Fact] + [Test] public async Task When_a_dequeud_item_lock_expires() { //arrange @@ -31,11 +30,11 @@ public async Task When_a_dequeud_item_lock_expires() timeProvider.Advance(TimeSpan.FromSeconds(2)); //assert - Assert.Single(bus.Stream(routingKey)); //-- the message should be returned to the bus if there is no Acknowledge or Reject + await Assert.That(bus.Stream(routingKey)).HasSingleItem(); //-- the message should be returned to the bus if there is no Acknowledge or Reject } - [Fact] + [Test] public async Task When_a_dequeued_item_is_acknowledged() { //arrange @@ -59,6 +58,6 @@ public async Task When_a_dequeued_item_is_acknowledged() timeProvider.Advance(TimeSpan.FromSeconds(2)); //-- the message should be returned to the bus if there is no Acknowledge or Reject //assert - Assert.Empty(bus.Stream(routingKey)); + await Assert.That(bus.Stream(routingKey)).IsEmpty(); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_a_dequeued_item_is_rejected.cs b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_a_dequeued_item_is_rejected.cs index f5595d775a..1f0adef545 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_a_dequeued_item_is_rejected.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_a_dequeued_item_is_rejected.cs @@ -1,14 +1,13 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.Time.Testing; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Consumer; public class InMemoryConsumerRejectTests { - [Fact] - public void When_a_dequeued_item_is_rejected() + [Test] + public async Task When_a_dequeued_item_is_rejected() { //arrange const string myTopic = "my topic"; @@ -25,12 +24,12 @@ public void When_a_dequeued_item_is_rejected() var consumer = new InMemoryMessageConsumer(routingKey, bus, timeProvider, ackTimeout: TimeSpan.FromMilliseconds(1000)); //act - var receivedMessage = consumer.Receive().Single(); - consumer.Reject(receivedMessage); + var receivedMessage = (await consumer.ReceiveAsync()).Single(); + await consumer.RejectAsync(receivedMessage); timeProvider.Advance(TimeSpan.FromSeconds(2)); //-- the message should be returned to the bus if there is no Acknowledge or Reject //assert - Assert.Empty(bus.Stream(routingKey)); + await Assert.That(bus.Stream(routingKey)).IsEmpty(); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_a_dequeued_item_is_rejected_async.cs b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_a_dequeued_item_is_rejected_async.cs index 6894a1f746..65f3edf332 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_a_dequeued_item_is_rejected_async.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_a_dequeued_item_is_rejected_async.cs @@ -1,14 +1,13 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Consumer; public class AsyncInMemoryConsumerRejectTests { - [Fact] + [Test] public async Task When_a_dequeued_item_is_rejected() { //arrange @@ -32,6 +31,6 @@ public async Task When_a_dequeued_item_is_rejected() timeProvider.Advance(TimeSpan.FromSeconds(2)); //-- the message should be returned to the bus if there is no Acknowledge or Reject //assert - Assert.Empty(bus.Stream(routingKey)); + await Assert.That(bus.Stream(routingKey)).IsEmpty(); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_an_inmemory_channelfactory_is_called.cs b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_an_inmemory_channelfactory_is_called.cs index 47f10cb390..19ee0b4fe7 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_an_inmemory_channelfactory_is_called.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_an_inmemory_channelfactory_is_called.cs @@ -1,13 +1,12 @@ -using System; +using System; using Paramore.Brighter.InMemory.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Consumer; public class InMemoryChannelFactoryTests { - [Fact] - public void When_an_inmemory_channelfactory_is_called() + [Test] + public async Task When_an_inmemory_channelfactory_is_called() { //arrange var internalBus = new InternalBus(); @@ -17,6 +16,6 @@ public void When_an_inmemory_channelfactory_is_called() var channel = inMemoryChannelFactory.CreateSyncChannel(new Subscription(messagePumpType: MessagePumpType.Reactor)); //assert - Assert.NotNull(channel); + await Assert.That(channel).IsNotNull(); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_creating_an_inmemory_producer_registry.cs b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_creating_an_inmemory_producer_registry.cs index 06dbb53f70..b10d0e3ca7 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_creating_an_inmemory_producer_registry.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_creating_an_inmemory_producer_registry.cs @@ -1,13 +1,12 @@ -using System.Linq; +using System.Linq; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Consumer; public class InMemoryProducerRegistryFactoryTests { - [Fact] - public void When_creating_an_inmemory_producer_registry() + [Test] + public async Task When_creating_an_inmemory_producer_registry() { // arrange var bus = new InternalBus(); @@ -15,10 +14,10 @@ public void When_creating_an_inmemory_producer_registry() var inMemoryProducerRegistryFactory = new InMemoryProducerRegistryFactory(bus, [publication], InstrumentationOptions.All); //act - var producerRegistry = inMemoryProducerRegistryFactory.Create(); + var producerRegistry = await inMemoryProducerRegistryFactory.CreateAsync(); //assert - Assert.NotNull(producerRegistry); - Assert.Contains(producerRegistry.Producers, p => p.Publication.Topic == publication.Topic); + await Assert.That(producerRegistry).IsNotNull(); + await Assert.That(producerRegistry.Producers).Contains(p => p.Publication.Topic == publication.Topic); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_disposing_consumer_should_dispose_lazily_created_producer.cs b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_disposing_consumer_should_dispose_lazily_created_producer.cs index 9856a1f5bd..1dbf6de28a 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_disposing_consumer_should_dispose_lazily_created_producer.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_disposing_consumer_should_dispose_lazily_created_producer.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2025 Ian Cooper @@ -25,7 +25,6 @@ THE SOFTWARE. */ using System; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Consumer; @@ -35,8 +34,8 @@ namespace Paramore.Brighter.InMemory.Tests.Consumer; /// public class AsyncInMemoryMessageConsumerDisposeTests { - [Fact] - public void Should_dispose_without_error_when_producer_was_never_created() + [Test] + public async Task Should_dispose_without_error_when_producer_was_never_created() { // Arrange var bus = new InternalBus(); @@ -45,12 +44,11 @@ public void Should_dispose_without_error_when_producer_was_never_created() var consumer = new InMemoryMessageConsumer(routingKey, bus, timeProvider); // Act & Assert - should not throw - var exception = Record.Exception(() => consumer.Dispose()); - Assert.Null(exception); + await Assert.That(() => consumer.Dispose()).ThrowsNothing(); } - [Fact] - public void Should_dispose_producer_when_it_was_created_during_requeue() + [Test] + public async Task Should_dispose_producer_when_it_was_created_during_requeue() { // Arrange var bus = new InternalBus(); @@ -65,15 +63,14 @@ public void Should_dispose_producer_when_it_was_created_during_requeue() // Put message on bus, receive it, then requeue with delay (creates producer) bus.Enqueue(message); - consumer.Receive(); - consumer.Requeue(message, TimeSpan.FromSeconds(30)); + await consumer.ReceiveAsync(); + await consumer.RequeueAsync(message, TimeSpan.FromSeconds(30)); // Act & Assert - should not throw - var exception = Record.Exception(() => consumer.Dispose()); - Assert.Null(exception); + await Assert.That(() => consumer.Dispose()).ThrowsNothing(); } - [Fact] + [Test] public async Task Should_dispose_async_without_error_when_producer_was_never_created() { // Arrange @@ -83,11 +80,10 @@ public async Task Should_dispose_async_without_error_when_producer_was_never_cre var consumer = new InMemoryMessageConsumer(routingKey, bus, timeProvider); // Act & Assert - should not throw - var exception = await Record.ExceptionAsync(async () => await consumer.DisposeAsync()); - Assert.Null(exception); + await Assert.That(async () => await consumer.DisposeAsync()).ThrowsNothing(); } - [Fact] + [Test] public async Task Should_dispose_async_producer_when_it_was_created_during_requeue() { // Arrange @@ -103,12 +99,11 @@ public async Task Should_dispose_async_producer_when_it_was_created_during_reque // Put message on bus, receive it, then requeue with delay (creates producer) bus.Enqueue(message); - consumer.Receive(); - consumer.Requeue(message, TimeSpan.FromSeconds(30)); + await consumer.ReceiveAsync(); + await consumer.RequeueAsync(message, TimeSpan.FromSeconds(30)); // Act & Assert - should not throw - var exception = await Record.ExceptionAsync(async () => await consumer.DisposeAsync()); - Assert.Null(exception); + await Assert.That(async () => await consumer.DisposeAsync()).ThrowsNothing(); } /// diff --git a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_handler_defers_message_should_requeue_via_scheduler_after_delay.cs b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_handler_defers_message_should_requeue_via_scheduler_after_delay.cs index 11c39cf099..8eba126b63 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_handler_defers_message_should_requeue_via_scheduler_after_delay.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_handler_defers_message_should_requeue_via_scheduler_after_delay.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2025 Ian Cooper @@ -25,7 +25,6 @@ THE SOFTWARE. */ using System; using System.Linq; using Microsoft.Extensions.Time.Testing; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Consumer; @@ -73,65 +72,65 @@ public InMemoryConsumerRequeueWithDelayTests() _consumer.Receive(); } - [Fact] - public void Should_not_have_message_immediately_available_after_requeue_with_delay() + [Test] + public async Task Should_not_have_message_immediately_available_after_requeue_with_delay() { // Act - handler defers the message (simulated by calling Requeue with delay) - _consumer.Requeue(_message, _delay); + await _consumer.RequeueAsync(_message, _delay); // Assert - message should NOT be immediately available on bus (scheduler holds it) var messagesOnBus = _bus.Stream(_routingKey); - Assert.Empty(messagesOnBus); + await Assert.That(messagesOnBus).IsEmpty(); } - [Fact] - public void Should_have_message_available_after_delay_expires() + [Test] + public async Task Should_have_message_available_after_delay_expires() { // Act - handler defers the message - _consumer.Requeue(_message, _delay); + await _consumer.RequeueAsync(_message, _delay); // Advance time past the delay _timeProvider.Advance(_delay + TimeSpan.FromSeconds(1)); // Assert - message should now be available on bus var messagesOnBus = _bus.Stream(_routingKey); - Assert.Single(messagesOnBus); + await Assert.That(messagesOnBus).HasSingleItem(); } - [Fact] - public void Should_be_able_to_receive_message_again_after_delay() + [Test] + public async Task Should_be_able_to_receive_message_again_after_delay() { // Act - handler defers the message - _consumer.Requeue(_message, _delay); + await _consumer.RequeueAsync(_message, _delay); // Advance time past the delay _timeProvider.Advance(_delay + TimeSpan.FromSeconds(1)); // Receive the message again - var receivedMessages = _consumer.Receive(); + var receivedMessages = await _consumer.ReceiveAsync(); // Assert - should receive the same message - Assert.Single(receivedMessages); - Assert.Equal(_message.Id, receivedMessages.First().Id); + await Assert.That(receivedMessages).HasSingleItem(); + await Assert.That(receivedMessages.First().Id).IsEqualTo(_message.Id); } - [Fact] - public void Should_preserve_message_content_through_delayed_requeue() + [Test] + public async Task Should_preserve_message_content_through_delayed_requeue() { // Act - handler defers the message - _consumer.Requeue(_message, _delay); + await _consumer.RequeueAsync(_message, _delay); // Advance time past the delay _timeProvider.Advance(_delay + TimeSpan.FromSeconds(1)); // Receive the message again - var receivedMessages = _consumer.Receive(); + var receivedMessages = await _consumer.ReceiveAsync(); // Assert - message content should be preserved through the scheduler flow - Assert.Single(receivedMessages); - Assert.Equal(_message.Body.Value, receivedMessages.First().Body.Value); - Assert.Equal(_message.Header.Topic, receivedMessages.First().Header.Topic); - Assert.Equal(_message.Header.MessageType, receivedMessages.First().Header.MessageType); + await Assert.That(receivedMessages).HasSingleItem(); + await Assert.That(receivedMessages.First().Body.Value).IsEqualTo(_message.Body.Value); + await Assert.That(receivedMessages.First().Header.Topic).IsEqualTo(_message.Header.Topic); + await Assert.That(receivedMessages.First().Header.MessageType).IsEqualTo(_message.Header.MessageType); } /// diff --git a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_no_scheduler_configured_should_throw_configuration_exception_on_delayed_requeue.cs b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_no_scheduler_configured_should_throw_configuration_exception_on_delayed_requeue.cs index 0a03cb521f..ccaba8fe66 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_no_scheduler_configured_should_throw_configuration_exception_on_delayed_requeue.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_no_scheduler_configured_should_throw_configuration_exception_on_delayed_requeue.cs @@ -24,7 +24,6 @@ THE SOFTWARE. */ using System; using Microsoft.Extensions.Time.Testing; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Consumer; @@ -63,33 +62,33 @@ public AsyncInMemoryConsumerMissingSchedulerTests() _consumer.Receive(); } - [Fact] - public void Should_throw_configuration_exception_on_delayed_requeue() + [Test] + public async Task Should_throw_configuration_exception_on_delayed_requeue() { // Act & Assert - requeue with delay should throw when no scheduler configured - var exception = Assert.Throws( + var exception = Assert.ThrowsExactly( () => _consumer.Requeue(_message, TimeSpan.FromSeconds(30))); - Assert.Contains("no scheduler is configured", exception.Message); + await Assert.That(exception.Message).Contains("no scheduler is configured"); } - [Fact] - public void Should_succeed_when_requeue_has_no_delay() + [Test] + public async Task Should_succeed_when_requeue_has_no_delay() { // Act - requeue without delay should still work (no scheduler needed) - var result = _consumer.Requeue(_message); + var result = await _consumer.RequeueAsync(_message); // Assert - Assert.True(result); + await Assert.That(result).IsTrue(); } - [Fact] - public void Should_succeed_when_requeue_has_zero_delay() + [Test] + public async Task Should_succeed_when_requeue_has_zero_delay() { // Act - requeue with zero delay should still work (no scheduler needed) - var result = _consumer.Requeue(_message, TimeSpan.Zero); + var result = await _consumer.RequeueAsync(_message, TimeSpan.Zero); // Assert - Assert.True(result); + await Assert.That(result).IsTrue(); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_reading_messages_via_a_consumer.cs b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_reading_messages_via_a_consumer.cs index 0301949f74..841910901b 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_reading_messages_via_a_consumer.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_reading_messages_via_a_consumer.cs @@ -1,7 +1,6 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.Time.Testing; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Consumer; @@ -11,8 +10,8 @@ public class InMemoryConsumerReceiveTests private readonly InMemoryConsumerAcknowledgeTests _inMemoryConsumerAcknowledgeTests = new InMemoryConsumerAcknowledgeTests(); private readonly InMemoryConsumerRejectTests _inMemoryConsumerRejectTests = new InMemoryConsumerRejectTests(); - [Fact] - public void When_reading_messages_via_a_consumer() + [Test] + public async Task When_reading_messages_via_a_consumer() { //arrange const string myTopic = "my topic"; @@ -29,11 +28,11 @@ public void When_reading_messages_via_a_consumer() var consumer = new InMemoryMessageConsumer(routingKey, bus, new FakeTimeProvider(), ackTimeout: TimeSpan.FromMilliseconds(1000)); //act - var receivedMessage = consumer.Receive().Single(); - consumer.Acknowledge(receivedMessage); + var receivedMessage = (await consumer.ReceiveAsync()).Single(); + await consumer.AcknowledgeAsync(receivedMessage); //assert - Assert.Equal(expectedMessage, receivedMessage); - Assert.Empty(bus.Stream(routingKey)); + await Assert.That(receivedMessage).IsEqualTo(expectedMessage); + await Assert.That(bus.Stream(routingKey)).IsEmpty(); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_reading_messages_via_a_consumer_async.cs b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_reading_messages_via_a_consumer_async.cs index ad941a799d..171a8e9492 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_reading_messages_via_a_consumer_async.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_reading_messages_via_a_consumer_async.cs @@ -1,8 +1,7 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Consumer; @@ -12,7 +11,7 @@ public class AsyncInMemoryConsumerReceiveTests private readonly InMemoryConsumerAcknowledgeTests _inMemoryConsumerAcknowledgeTests = new InMemoryConsumerAcknowledgeTests(); private readonly InMemoryConsumerRejectTests _inMemoryConsumerRejectTests = new InMemoryConsumerRejectTests(); - [Fact] + [Test] public async Task When_reading_messages_via_a_consumer() { //arrange @@ -35,7 +34,7 @@ public async Task When_reading_messages_via_a_consumer() await consumer.AcknowledgeAsync(message); //assert - Assert.Equal(expectedMessage, message); - Assert.Empty(bus.Stream(routingKey)); + await Assert.That(message).IsEqualTo(expectedMessage); + await Assert.That(bus.Stream(routingKey)).IsEmpty(); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_rejecting_a_message_with_a_dead_letter_channel.cs b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_rejecting_a_message_with_a_dead_letter_channel.cs index c52dd4023c..31a163dfe9 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_rejecting_a_message_with_a_dead_letter_channel.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_rejecting_a_message_with_a_dead_letter_channel.cs @@ -1,15 +1,14 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Extensions; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Consumer; public class InMemoryConsumerRejectWithDeadLetterTests { - [Fact] - public void When_rejecting_a_message_with_a_dead_letter_channel() + [Test] + public async Task When_rejecting_a_message_with_a_dead_letter_channel() { //arrange const string myTopic = "my topic"; @@ -34,7 +33,7 @@ public void When_rejecting_a_message_with_a_dead_letter_channel() timeProvider.Advance(TimeSpan.FromSeconds(2)); //-- the message should be returned to the bus if there is no Acknowledge or Reject //assert - Assert.Empty(bus.Stream(routingKey)); - Assert.NotEmpty(bus.Stream(deadLetterRoutingKey)); + await Assert.That(bus.Stream(routingKey)).IsEmpty(); + await Assert.That(bus.Stream(deadLetterRoutingKey)).IsNotEmpty(); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_rejecting_a_message_with_a_dead_letter_channel_async.cs b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_rejecting_a_message_with_a_dead_letter_channel_async.cs index 8fa307156d..02953c7d40 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_rejecting_a_message_with_a_dead_letter_channel_async.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_rejecting_a_message_with_a_dead_letter_channel_async.cs @@ -1,15 +1,14 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Extensions; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Consumer; public class InMemoryConsumerRejectWithDeadLetterTestsAsync { - [Fact] + [Test] public async Task When_rejecting_a_message_with_a_dead_letter_channel_async() { //arrange @@ -35,8 +34,8 @@ public async Task When_rejecting_a_message_with_a_dead_letter_channel_async() timeProvider.Advance(TimeSpan.FromSeconds(2)); //-- the message should be returned to the bus if there is no Acknowledge or Reject //assert - Assert.Empty(bus.Stream(routingKey)); - Assert.NotEmpty(bus.Stream(deadLetterRoutingKey)); + await Assert.That(bus.Stream(routingKey)).IsEmpty(); + await Assert.That(bus.Stream(deadLetterRoutingKey)).IsNotEmpty(); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_requeueing_a_message_it_should_be_available_again.cs b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_requeueing_a_message_it_should_be_available_again.cs index abc4526cfb..1001047207 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_requeueing_a_message_it_should_be_available_again.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_requeueing_a_message_it_should_be_available_again.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Transactions; @@ -9,7 +9,6 @@ using Paramore.Brighter.Scheduler.Events; using Paramore.Brighter.Scheduler.Handlers; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Consumer; @@ -85,8 +84,8 @@ public InMemoryConsumerRequeueTests() _scheduler = schedulerFactory.Create(_processor); } - [Fact] - public void When_requeueing_a_message_it_should_be_available_again() + [Test] + public async Task When_requeueing_a_message_it_should_be_available_again() { //arrange var expectedMessage = new Message( @@ -99,16 +98,16 @@ public void When_requeueing_a_message_it_should_be_available_again() ackTimeout: TimeSpan.FromMilliseconds(1000), scheduler: _scheduler); //act - var receivedMessage = consumer.Receive().Single(); - consumer.Requeue(receivedMessage, TimeSpan.Zero); + var receivedMessage = (await consumer.ReceiveAsync()).Single(); + await consumer.RequeueAsync(receivedMessage, TimeSpan.Zero); //assert - Assert.Single(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).HasSingleItem(); } - [Fact] - public void When_requeueing_a_message_with_a_delay_it_should_not_be_available_immediately() + [Test] + public async Task When_requeueing_a_message_with_a_delay_it_should_not_be_available_immediately() { //arrange @@ -122,16 +121,16 @@ public void When_requeueing_a_message_with_a_delay_it_should_not_be_available_im ackTimeout: TimeSpan.FromMilliseconds(1000), scheduler: _scheduler); //act - var receivedMessage = consumer.Receive().Single(); - Assert.Empty(_internalBus.Stream(_routingKey)); + var receivedMessage = (await consumer.ReceiveAsync()).Single(); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); - consumer.Requeue(receivedMessage, TimeSpan.FromMilliseconds(1000)); + await consumer.RequeueAsync(receivedMessage, TimeSpan.FromMilliseconds(1000)); //assert - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.Single(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).HasSingleItem(); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_requeueing_a_message_it_should_be_available_again_async.cs b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_requeueing_a_message_it_should_be_available_again_async.cs index 31b8cf403e..78e9ef6adf 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_requeueing_a_message_it_should_be_available_again_async.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_requeueing_a_message_it_should_be_available_again_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -11,7 +11,6 @@ using Paramore.Brighter.Scheduler.Handlers; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Consumer; @@ -98,7 +97,7 @@ public AsyncInMemoryConsumerRequeueTests() } - [Fact] + [Test] public async Task When_requeueing_a_message_it_should_be_available_again() { //arrange @@ -117,11 +116,11 @@ public async Task When_requeueing_a_message_it_should_be_available_again() await consumer.RequeueAsync(receivedMessage.Single(), TimeSpan.Zero); //assert - Assert.Single(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).HasSingleItem(); } - [Fact] + [Test] public async Task When_requeueing_a_message_with_a_delay_it_should_not_be_available_immediately() { //arrange @@ -136,15 +135,15 @@ public async Task When_requeueing_a_message_with_a_delay_it_should_not_be_availa //act var receivedMessage = await consumer.ReceiveAsync(); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); await consumer.RequeueAsync(receivedMessage.Single(), TimeSpan.FromMilliseconds(1000)); //assert - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.Single(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).HasSingleItem(); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_requeuing_async_with_delay_should_delegate_to_producer.cs b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_requeuing_async_with_delay_should_delegate_to_producer.cs index 9c99da8097..ded20afd80 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_requeuing_async_with_delay_should_delegate_to_producer.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_requeuing_async_with_delay_should_delegate_to_producer.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2025 Ian Cooper @@ -26,7 +26,6 @@ THE SOFTWARE. */ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Consumer; @@ -65,17 +64,17 @@ public AsyncInMemoryConsumerRequeueWithDelayTests() _consumer.Receive(); } - [Fact] + [Test] public async Task Should_use_async_scheduler_when_requeuing_with_delay() { // Act await _consumer.RequeueAsync(_message, _delay); // Assert - Assert.True(_scheduler.ScheduleAsyncCalled, "Scheduler.ScheduleAsync should have been called via producer"); + await Assert.That(_scheduler.ScheduleAsyncCalled).IsTrue(); } - [Fact] + [Test] public async Task Should_not_have_message_immediately_available_on_bus() { // Act @@ -83,17 +82,17 @@ public async Task Should_not_have_message_immediately_available_on_bus() // Assert - message should not be immediately available (scheduler holds it) var messagesOnBus = _bus.Stream(_routingKey); - Assert.Empty(messagesOnBus); + await Assert.That(messagesOnBus).IsEmpty(); } - [Fact] + [Test] public async Task Should_return_true_on_successful_requeue() { // Act var result = await _consumer.RequeueAsync(_message, _delay); // Assert - Assert.True(result, "RequeueAsync should return true"); + await Assert.That(result).IsTrue(); } /// diff --git a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_requeuing_with_delay_should_delegate_to_producer.cs b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_requeuing_with_delay_should_delegate_to_producer.cs index 0f6eb77f95..53d85c0abd 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_requeuing_with_delay_should_delegate_to_producer.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_requeuing_with_delay_should_delegate_to_producer.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2025 Ian Cooper @@ -25,7 +25,6 @@ THE SOFTWARE. */ using System; using System.Linq; using Microsoft.Extensions.Time.Testing; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Consumer; @@ -64,35 +63,35 @@ public InMemoryConsumerRequeueWithDelayProducerTests() _consumer.Receive(); } - [Fact] - public void Should_use_scheduler_when_requeuing_with_delay() + [Test] + public async Task Should_use_scheduler_when_requeuing_with_delay() { // Act - _consumer.Requeue(_message, _delay); + await _consumer.RequeueAsync(_message, _delay); // Assert - Assert.True(_scheduler.ScheduleCalled, "Scheduler.Schedule should have been called via producer"); + await Assert.That(_scheduler.ScheduleCalled).IsTrue(); } - [Fact] - public void Should_not_have_message_immediately_available_on_bus() + [Test] + public async Task Should_not_have_message_immediately_available_on_bus() { // Act - _consumer.Requeue(_message, _delay); + await _consumer.RequeueAsync(_message, _delay); // Assert - message should not be immediately available (scheduler holds it) var messagesOnBus = _bus.Stream(_routingKey); - Assert.Empty(messagesOnBus); + await Assert.That(messagesOnBus).IsEmpty(); } - [Fact] - public void Should_remove_message_from_locked_messages() + [Test] + public async Task Should_remove_message_from_locked_messages() { // Act - var result = _consumer.Requeue(_message, _delay); + var result = await _consumer.RequeueAsync(_message, _delay); // Assert - Assert.True(result, "Requeue should return true"); + await Assert.That(result).IsTrue(); } /// diff --git a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_requeuing_with_zero_delay_should_use_direct_bus_enqueue.cs b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_requeuing_with_zero_delay_should_use_direct_bus_enqueue.cs index eb3f988bcb..31e6e0cdc0 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_requeuing_with_zero_delay_should_use_direct_bus_enqueue.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Consumer/When_requeuing_with_zero_delay_should_use_direct_bus_enqueue.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2025 Ian Cooper @@ -25,7 +25,6 @@ THE SOFTWARE. */ using System; using System.Linq; using Microsoft.Extensions.Time.Testing; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Consumer; @@ -62,38 +61,38 @@ public InMemoryConsumerRequeueWithZeroDelayTests() _consumer.Receive(); } - [Fact] - public void Should_enqueue_message_directly_when_delay_is_zero() + [Test] + public async Task Should_enqueue_message_directly_when_delay_is_zero() { // Act - _consumer.Requeue(_message, TimeSpan.Zero); + await _consumer.RequeueAsync(_message, TimeSpan.Zero); // Assert - message should be immediately on the bus var messagesOnBus = _bus.Stream(_routingKey); - Assert.Single(messagesOnBus); - Assert.Equal(_message.Id, messagesOnBus.First().Id); + await Assert.That(messagesOnBus).HasSingleItem(); + await Assert.That(messagesOnBus.First().Id).IsEqualTo(_message.Id); } - [Fact] - public void Should_enqueue_message_directly_when_delay_is_null() + [Test] + public async Task Should_enqueue_message_directly_when_delay_is_null() { // Act - _consumer.Requeue(_message, null); + await _consumer.RequeueAsync(_message, null); // Assert - message should be immediately on the bus var messagesOnBus = _bus.Stream(_routingKey); - Assert.Single(messagesOnBus); - Assert.Equal(_message.Id, messagesOnBus.First().Id); + await Assert.That(messagesOnBus).HasSingleItem(); + await Assert.That(messagesOnBus.First().Id).IsEqualTo(_message.Id); } - [Fact] - public void Should_not_invoke_scheduler_when_delay_is_zero() + [Test] + public async Task Should_not_invoke_scheduler_when_delay_is_zero() { // Act - _consumer.Requeue(_message, TimeSpan.Zero); + await _consumer.RequeueAsync(_message, TimeSpan.Zero); // Assert - Assert.False(_scheduler.ScheduleCalled, "Scheduler should NOT have been called for zero delay"); + await Assert.That(_scheduler.ScheduleCalled).IsFalse(); } /// diff --git a/tests/Paramore.Brighter.InMemory.Tests/Inbox/When_expiring_messages_in_inbox.cs b/tests/Paramore.Brighter.InMemory.Tests/Inbox/When_expiring_messages_in_inbox.cs index 757406cea9..87a4ef27ca 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Inbox/When_expiring_messages_in_inbox.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Inbox/When_expiring_messages_in_inbox.cs @@ -1,16 +1,15 @@ -using System; +using System; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Inbox.Exceptions; using Paramore.Brighter.InMemory.Tests.Data; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Inbox { - [Trait("Category", "InMemory")] + [Category("InMemory")] public class InboxEntryTimeToLiveTests { - [Fact] + [Test] public async Task When_expiring_a_cache_entry_no_longer_there() { //Arrange @@ -47,11 +46,11 @@ public async Task When_expiring_a_cache_entry_no_longer_there() var afterExpiryExists = await inbox.ExistsAsync(command.Id, contextKey, null); //Assert - Assert.NotNull(foundCommand); - Assert.False(afterExpiryExists); + await Assert.That(foundCommand).IsNotNull(); + await Assert.That(afterExpiryExists).IsFalse(); } - [Fact] + [Test] public async Task When_expiring_some_but_not_all() { //Arrange @@ -93,7 +92,7 @@ public async Task When_expiring_some_but_not_all() } //Assert - Assert.Equal(3, inbox.EntryCount); + await Assert.That(inbox.EntryCount).IsEqualTo(3); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Inbox/When_storing_items_in_inbox.cs b/tests/Paramore.Brighter.InMemory.Tests/Inbox/When_storing_items_in_inbox.cs index cd04576fcc..74e4cb7779 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Inbox/When_storing_items_in_inbox.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Inbox/When_storing_items_in_inbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2020 Ian Cooper @@ -26,16 +26,15 @@ THE SOFTWARE. */ using System; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.InMemory.Tests.Data; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Inbox { - [Trait("Category", "InMemory")] + [Category("InMemory")] public class InMemoryInboxTests { - [Fact] - public void When_storing_a_seen_message_in_the_inbox() + [Test] + public async Task When_storing_a_seen_message_in_the_inbox() { //Arrange var inbox = new InMemoryInbox(new FakeTimeProvider()); @@ -44,18 +43,18 @@ public void When_storing_a_seen_message_in_the_inbox() var command = new SimpleCommand(); //Act - inbox.Add(command, contextKey, null); + await inbox.AddAsync(command, contextKey, null); var storedCommand = inbox.Get(command.Id, contextKey, null); //Assert - Assert.NotNull(storedCommand); - Assert.Equal(command.Id, storedCommand.Id); + await Assert.That(storedCommand).IsNotNull(); + await Assert.That(storedCommand.Id).IsEqualTo(command.Id); } - [Fact] - public void When_testing_for_a_message_in_the_inbox() + [Test] + public async Task When_testing_for_a_message_in_the_inbox() { //Arrange var inbox = new InMemoryInbox(new FakeTimeProvider()); @@ -64,16 +63,16 @@ public void When_testing_for_a_message_in_the_inbox() var command = new SimpleCommand(); //Act - inbox.Add(command, contextKey, null); + await inbox.AddAsync(command, contextKey, null); - var exists = inbox.Exists(command.Id, contextKey, null); + var exists = await inbox.ExistsAsync(command.Id, contextKey, null); //Assert - Assert.True(exists); + await Assert.That(exists).IsTrue(); } - [Fact] - public void When_testing_for_a_missing_command() + [Test] + public async Task When_testing_for_a_missing_command() { //Arrange var inbox = new InMemoryInbox(new FakeTimeProvider()); @@ -82,15 +81,15 @@ public void When_testing_for_a_missing_command() var command = new SimpleCommand(); //Act - var exists = inbox.Exists(command.Id, contextKey, null); + var exists = await inbox.ExistsAsync(command.Id, contextKey, null); //Assert - Assert.False(exists); + await Assert.That(exists).IsFalse(); } - [Fact] - public void When_storing_multiple_entries_retrieve_the_right_one() + [Test] + public async Task When_storing_multiple_entries_retrieve_the_right_one() { //Arrange var inbox = new InMemoryInbox(new FakeTimeProvider()); @@ -99,7 +98,7 @@ public void When_storing_multiple_entries_retrieve_the_right_one() var commands = new SimpleCommand[] {new SimpleCommand(), new SimpleCommand(), new SimpleCommand(), new SimpleCommand(), new SimpleCommand()}; foreach (var command in commands) { - inbox.Add(command, contextKey, null); + await inbox.AddAsync(command, contextKey, null); } //Act @@ -107,16 +106,16 @@ public void When_storing_multiple_entries_retrieve_the_right_one() var lastCommand = inbox.Get(commands[4].Id, contextKey, null); //Assert - Assert.NotNull(firstCommand); - Assert.NotNull(lastCommand); + await Assert.That(firstCommand).IsNotNull(); + await Assert.That(lastCommand).IsNotNull(); - Assert.Equal(commands[0].Id, firstCommand.Id); - Assert.Equal(commands[4].Id, lastCommand.Id); + await Assert.That(firstCommand.Id).IsEqualTo(commands[0].Id); + await Assert.That(lastCommand.Id).IsEqualTo(commands[4].Id); } - [Fact] - public void When_storing_multiple_entries_exists_should_find() + [Test] + public async Task When_storing_multiple_entries_exists_should_find() { //Arrange var inbox = new InMemoryInbox(new FakeTimeProvider()); @@ -125,21 +124,21 @@ public void When_storing_multiple_entries_exists_should_find() var commands = new SimpleCommand[] {new SimpleCommand(), new SimpleCommand(), new SimpleCommand(), new SimpleCommand(), new SimpleCommand()}; foreach (var command in commands) { - inbox.Add(command, contextKey, null); + await inbox.AddAsync(command, contextKey, null); } //Act - var firstCommandExists = inbox.Exists(commands[0].Id, contextKey, null); - var lastCommandExists = inbox.Exists(commands[4].Id, contextKey, null); + var firstCommandExists = await inbox.ExistsAsync(commands[0].Id, contextKey, null); + var lastCommandExists = await inbox.ExistsAsync(commands[4].Id, contextKey, null); //Assert - Assert.True(firstCommandExists); - Assert.True(lastCommandExists); + await Assert.That(firstCommandExists).IsTrue(); + await Assert.That(lastCommandExists).IsTrue(); } - [Fact] - public void When_storing_many_but_not_requested_exists_should_not_find() + [Test] + public async Task When_storing_many_but_not_requested_exists_should_not_find() { //Arrange var inbox = new InMemoryInbox(new FakeTimeProvider()); @@ -148,14 +147,14 @@ public void When_storing_many_but_not_requested_exists_should_not_find() var commands = new SimpleCommand[] {new SimpleCommand(), new SimpleCommand(), new SimpleCommand(), new SimpleCommand(), new SimpleCommand()}; foreach (var command in commands) { - inbox.Add(command, contextKey, null); + await inbox.AddAsync(command, contextKey, null); } //Act - var firstCommandExists = inbox.Exists(Guid.NewGuid().ToString(), contextKey, null); + var firstCommandExists = await inbox.ExistsAsync(Guid.NewGuid().ToString(), contextKey, null); //Assert - Assert.False(firstCommandExists); + await Assert.That(firstCommandExists).IsFalse(); } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Outbox/When_Retrieving_Messages_based_on_Age.cs b/tests/Paramore.Brighter.InMemory.Tests/Outbox/When_Retrieving_Messages_based_on_Age.cs index a7a3f0fb68..d5d9de7ee8 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Outbox/When_Retrieving_Messages_based_on_Age.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Outbox/When_Retrieving_Messages_based_on_Age.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -6,44 +6,43 @@ using Paramore.Brighter; using Paramore.Brighter.InMemory.Tests.Builders; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Outbox; -[Trait("Category", "InMemory")] +[Category("InMemory")] public class When_Retrieving_Messages_based_on_Age { - [Fact] - public void When_outstanding_in_outbox_they_are_retrieved_correctly() + [Test] + public async Task When_outstanding_in_outbox_they_are_retrieved_correctly() { var timeProvider = new FakeTimeProvider(); var outbox = new InMemoryOutbox(timeProvider) { Tracer = new BrighterTracer(timeProvider) }; var context = new RequestContext(); - outbox.Add(new MessageTestDataBuilder(), context); - outbox.Add(new MessageTestDataBuilder(), context); + await outbox.AddAsync(new MessageTestDataBuilder(), context); + await outbox.AddAsync(new MessageTestDataBuilder(), context); timeProvider.Advance(TimeSpan.FromSeconds(5)); - outbox.Add(new MessageTestDataBuilder(), context); - outbox.Add(new MessageTestDataBuilder(), context); + await outbox.AddAsync(new MessageTestDataBuilder(), context); + await outbox.AddAsync(new MessageTestDataBuilder(), context); - var messagesToDispatch = outbox.OutstandingMessages(TimeSpan.FromMilliseconds(2000), context); - var allMessages = outbox.OutstandingMessages(TimeSpan.Zero, context).ToArray(); + var messagesToDispatch = await outbox.OutstandingMessagesAsync(TimeSpan.FromMilliseconds(2000), context); + var allMessages = (await outbox.OutstandingMessagesAsync(TimeSpan.Zero, context)).ToArray(); foreach (var message in allMessages) { - outbox.MarkDispatched(message.Id, context); + await outbox.MarkDispatchedAsync(message.Id, context); } - var messagesAfterDispatch = outbox.OutstandingMessages(TimeSpan.Zero, context); + var messagesAfterDispatch = await outbox.OutstandingMessagesAsync(TimeSpan.Zero, context); - Assert.Equal(2, messagesToDispatch.Count()); - Assert.Equal(4, allMessages.Length); - Assert.Empty(messagesAfterDispatch); + await Assert.That(messagesToDispatch.Count()).IsEqualTo(2); + await Assert.That(allMessages.Length).IsEqualTo(4); + await Assert.That(messagesAfterDispatch).IsEmpty(); } - [Fact] + [Test] public async Task When_outstanding_in_outbox_they_are_retrieved_correctly_async() { var timeProvider = new FakeTimeProvider(); @@ -68,8 +67,8 @@ public async Task When_outstanding_in_outbox_they_are_retrieved_correctly_async( var messagesAfterDispatch = await outbox.OutstandingMessagesAsync(TimeSpan.Zero, context); - Assert.Equal(2, messagesToDispatch.Count()); - Assert.Equal(4, allMessages.Length); - Assert.Empty(messagesAfterDispatch); + await Assert.That(messagesToDispatch.Count()).IsEqualTo(2); + await Assert.That(allMessages.Length).IsEqualTo(4); + await Assert.That(messagesAfterDispatch).IsEmpty(); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Outbox/When_controlling_cache_size.cs b/tests/Paramore.Brighter.InMemory.Tests/Outbox/When_controlling_cache_size.cs index 9171c79cb0..492a9fc899 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Outbox/When_controlling_cache_size.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Outbox/When_controlling_cache_size.cs @@ -1,16 +1,15 @@ -using System; +using System; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.InMemory.Tests.Builders; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Outbox { - [Trait("Category", "InMemory")] + [Category("InMemory")] public class OutboxMaxSize { - [Fact] + [Test] public async Task When_max_size_is_exceeded_shrink() { //Arrange @@ -26,12 +25,12 @@ public async Task When_max_size_is_exceeded_shrink() var context = new RequestContext(); for(int i =1; i <= limit; i++) - outbox.Add(new MessageTestDataBuilder(), context); + await outbox.AddAsync(new MessageTestDataBuilder(), context); //Act - Assert.Equal(5, outbox.EntryCount); + await Assert.That(outbox.EntryCount).IsEqualTo(5); - outbox.Add(new MessageTestDataBuilder(), context); + await outbox.AddAsync(new MessageTestDataBuilder(), context); //Poll for compaction to complete - can be slow in CI environments int retries = 0; @@ -42,10 +41,10 @@ public async Task When_max_size_is_exceeded_shrink() } //should clear compaction percentage from the outbox, and then add the new one - Assert.Equal(3, outbox.EntryCount); + await Assert.That(outbox.EntryCount).IsEqualTo(3); } - [Fact] + [Test] public async Task When_shrinking_evict_oldest_messages_first() { //Arrange @@ -69,7 +68,7 @@ public async Task When_shrinking_evict_oldest_messages_first() } //Act - Assert.Equal(5, outbox.EntryCount); + await Assert.That(outbox.EntryCount).IsEqualTo(5); await outbox.AddAsync(new MessageTestDataBuilder(), context); @@ -82,11 +81,11 @@ public async Task When_shrinking_evict_oldest_messages_first() } //should clear compaction percentage from the outbox, and then add the new one - Assert.True((await outbox.GetAsync(messageIds[0], context)).IsEmpty); - Assert.True((await outbox.GetAsync(messageIds[1], context)).IsEmpty); - Assert.True((await outbox.GetAsync(messageIds[2], context)).IsEmpty); - Assert.False((await outbox.GetAsync(messageIds[3], context)).IsEmpty); - Assert.False(((await outbox.GetAsync(messageIds[4], context)).IsEmpty)); + await Assert.That((await outbox.GetAsync(messageIds[0], context)).IsEmpty).IsTrue(); + await Assert.That((await outbox.GetAsync(messageIds[1], context)).IsEmpty).IsTrue(); + await Assert.That((await outbox.GetAsync(messageIds[2], context)).IsEmpty).IsTrue(); + await Assert.That((await outbox.GetAsync(messageIds[3], context)).IsEmpty).IsFalse(); + await Assert.That(((await outbox.GetAsync(messageIds[4], context)).IsEmpty)).IsFalse(); } } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Outbox/When_expiring_message_in_outbox.cs b/tests/Paramore.Brighter.InMemory.Tests/Outbox/When_expiring_message_in_outbox.cs index af3ec3c25d..35684ab1ab 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Outbox/When_expiring_message_in_outbox.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Outbox/When_expiring_message_in_outbox.cs @@ -1,15 +1,14 @@ -using System; +using System; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Outbox { - [Trait("Category", "InMemory")] + [Category("InMemory")] public class OutboxEntryTimeToLiveTests { - [Fact] + [Test] public async Task When_expiring_a_cache_entry_no_longer_there() { //Arrange @@ -29,7 +28,7 @@ public async Task When_expiring_a_cache_entry_no_longer_there() //Act - outbox.Add(messageToAdd, new RequestContext()); + await outbox.AddAsync(messageToAdd, new RequestContext()); timeProvider.Advance(TimeSpan.FromMilliseconds(500)); //give the entry to time to expire @@ -41,10 +40,10 @@ public async Task When_expiring_a_cache_entry_no_longer_there() var message = await outbox.GetAsync(messageId, new RequestContext()); //Assert - Assert.True(message.IsEmpty); + await Assert.That(message.IsEmpty).IsTrue(); } - [Fact] + [Test] public async Task When_over_ttl_but_no_sweep_run() { //Arrange @@ -71,8 +70,8 @@ public async Task When_over_ttl_but_no_sweep_run() var message = await outbox.GetAsync(messageId, new RequestContext()); //Assert - Assert.NotNull(message); - Assert.Equal(messageId, message.Id); + await Assert.That(message).IsNotNull(); + await Assert.That(message.Id).IsEqualTo(messageId); } } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Outbox/When_storing_message_in_outbox.cs b/tests/Paramore.Brighter.InMemory.Tests/Outbox/When_storing_message_in_outbox.cs index 6101aa8907..ab2d225560 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Outbox/When_storing_message_in_outbox.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Outbox/When_storing_message_in_outbox.cs @@ -4,17 +4,16 @@ using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.InMemory.Tests.Builders; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Outbox { - [Trait("Category", "InMemory")] + [Category("InMemory")] public class InMemoryOutboxTests { private FakeTimeProvider _timeProvider = new(); - [Fact] - public void When_reading_from_outbox() + [Test] + public async Task When_reading_from_outbox() { //Arrange var outbox = new InMemoryOutbox(_timeProvider) { Tracer = new BrighterTracer() }; @@ -26,21 +25,21 @@ public void When_reading_from_outbox() //Act var context = new RequestContext(); - outbox.Add(messageToAdd, context); + await outbox.AddAsync(messageToAdd, context); - var retrievedMessage = outbox.Get(messageId, context); + var retrievedMessage = await outbox.GetAsync(messageId, context); //Assert - Assert.NotNull(retrievedMessage); - Assert.Equal(messageId, retrievedMessage.Id); - Assert.Equal(messageToAdd.Header.Topic, retrievedMessage.Header.Topic); - Assert.Equal(messageToAdd.Header.MessageType, retrievedMessage.Header.MessageType); - Assert.Equal(messageToAdd.Body.Value, retrievedMessage.Body.Value); + await Assert.That(retrievedMessage).IsNotNull(); + await Assert.That(retrievedMessage.Id).IsEqualTo(messageId); + await Assert.That(retrievedMessage.Header.Topic).IsEqualTo(messageToAdd.Header.Topic); + await Assert.That(retrievedMessage.Header.MessageType).IsEqualTo(messageToAdd.Header.MessageType); + await Assert.That(retrievedMessage.Body.Value).IsEqualTo(messageToAdd.Body.Value); } - [Fact] - public void When_marking_dispatched_in_outbox() + [Test] + public async Task When_marking_dispatched_in_outbox() { //Arrange var outbox = new InMemoryOutbox(_timeProvider){Tracer = new BrighterTracer()}; @@ -53,23 +52,23 @@ public void When_marking_dispatched_in_outbox() //Act var context = new RequestContext(); - outbox.Add(messageToAdd, context); + await outbox.AddAsync(messageToAdd, context); var dispatchedAt = _timeProvider.GetUtcNow(); - outbox.MarkDispatched(messageId, context, dispatchedAt); + await outbox.MarkDispatchedAsync(messageId, context, dispatchedAt); _timeProvider.Advance(TimeSpan.FromSeconds(10)); - var dispatchedMessages = outbox.DispatchedMessages(TimeSpan.FromSeconds(5), context); + var dispatchedMessages = await outbox.DispatchedMessagesAsync(TimeSpan.FromSeconds(5), context); //Assert IEnumerable collection = dispatchedMessages as Message[] ?? dispatchedMessages.ToArray(); - Assert.Single(collection); - Assert.Equal(messageId, collection.First().Id); + await Assert.That(collection).HasSingleItem(); + await Assert.That(collection.First().Id).IsEqualTo(messageId); } - [Fact] - public void When_looking_for_undispatched_messages_in_outbox() + [Test] + public async Task When_looking_for_undispatched_messages_in_outbox() { //Arrange var outbox = new InMemoryOutbox(_timeProvider){Tracer = new BrighterTracer()}; @@ -82,21 +81,21 @@ public void When_looking_for_undispatched_messages_in_outbox() //Act var context = new RequestContext(); - outbox.Add(messageToAdd, context); + await outbox.AddAsync(messageToAdd, context); _timeProvider.Advance(TimeSpan.FromMilliseconds(500)); - var outstandingMessages = outbox.OutstandingMessages(TimeSpan.Zero, context); + var outstandingMessages = await outbox.OutstandingMessagesAsync(TimeSpan.Zero, context); //Assert IEnumerable collection = outstandingMessages as Message[] ?? outstandingMessages.ToArray(); - Assert.Single(collection); - Assert.Equal(messageId, collection.First().Id); + await Assert.That(collection).HasSingleItem(); + await Assert.That(collection.First().Id).IsEqualTo(messageId); } - [Fact] - public void When_there_are_multiple_items_retrieve_by_id() + [Test] + public async Task When_there_are_multiple_items_retrieve_by_id() { //Arrange var outbox = new InMemoryOutbox( _timeProvider){Tracer = new BrighterTracer()}; @@ -106,18 +105,18 @@ public void When_there_are_multiple_items_retrieve_by_id() for(int i =0; i <= 4; i++) { RequestContext requestContext = context; - outbox.Add(new MessageTestDataBuilder().WithId(messageIds[i]), requestContext); + await outbox.AddAsync(new MessageTestDataBuilder().WithId(messageIds[i]), requestContext); } //Act - var message = outbox.Get(messageIds[2], context); + var message = await outbox.GetAsync(messageIds[2], context); //Assert - Assert.Equal(messageIds[2], message.Id); + await Assert.That(message.Id).IsEqualTo(messageIds[2]); } - [Fact] - public void When_there_are_multiple_items_and_some_are_dispatched() + [Test] + public async Task When_there_are_multiple_items_and_some_are_dispatched() { //Arrange var outbox = new InMemoryOutbox(_timeProvider){Tracer = new BrighterTracer()}; @@ -127,29 +126,29 @@ public void When_there_are_multiple_items_and_some_are_dispatched() for(int i =0; i <= 4; i++) { RequestContext requestContext = context; - outbox.Add(new MessageTestDataBuilder().WithId(messageIds[i]), requestContext); + await outbox.AddAsync(new MessageTestDataBuilder().WithId(messageIds[i]), requestContext); } //Act var now = _timeProvider.GetUtcNow(); - outbox.MarkDispatched(messageIds[0], context, now); - outbox.MarkDispatched(messageIds[4], context, now); + await outbox.MarkDispatchedAsync(messageIds[0], context, now); + await outbox.MarkDispatchedAsync(messageIds[4], context, now); _timeProvider.Advance(TimeSpan.FromSeconds(10)); - var sentMessages = outbox.DispatchedMessages(TimeSpan.FromSeconds(5), context); - var outstandingMessages = outbox.OutstandingMessages(TimeSpan.Zero, context); + var sentMessages = await outbox.DispatchedMessagesAsync(TimeSpan.FromSeconds(5), context); + var outstandingMessages = await outbox.OutstandingMessagesAsync(TimeSpan.Zero, context); //Assert var messages = sentMessages as Message[] ?? sentMessages.ToArray(); - Assert.Equal(2, messages.Length); - Assert.Contains(messages, msg => msg.Id == messageIds[0]); - Assert.Contains(messages, msg => msg.Id == messageIds[4]); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages).Contains(msg => msg.Id == messageIds[0]); + await Assert.That(messages).Contains(msg => msg.Id == messageIds[4]); var collection = outstandingMessages as Message[] ?? outstandingMessages.ToArray(); - Assert.Equal(3, collection.Length); - Assert.Contains(collection, msg => msg.Id == messageIds[1]); - Assert.Contains(collection, msg => msg.Id == messageIds[2]); - Assert.Contains(collection, msg => msg.Id == messageIds[3]); } + await Assert.That(collection.Length).IsEqualTo(3); + await Assert.That(collection).Contains(msg => msg.Id == messageIds[1]); + await Assert.That(collection).Contains(msg => msg.Id == messageIds[2]); + await Assert.That(collection).Contains(msg => msg.Id == messageIds[3]); } } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Paramore.Brighter.InMemory.Tests.csproj b/tests/Paramore.Brighter.InMemory.Tests/Paramore.Brighter.InMemory.Tests.csproj index f0b83afadc..64d838ef88 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Paramore.Brighter.InMemory.Tests.csproj +++ b/tests/Paramore.Brighter.InMemory.Tests/Paramore.Brighter.InMemory.Tests.csproj @@ -1,31 +1,15 @@ - - - $(BrighterTestTargetFrameworks) - false - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - + + $(BrighterTestTargetFrameworks) + false + Exe + + + + + + + + + + \ No newline at end of file diff --git a/tests/Paramore.Brighter.InMemory.Tests/Producer/When_adding_messages_to_the_producer.cs b/tests/Paramore.Brighter.InMemory.Tests/Producer/When_adding_messages_to_the_producer.cs index 96a5803463..8d460998ec 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Producer/When_adding_messages_to_the_producer.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Producer/When_adding_messages_to_the_producer.cs @@ -1,15 +1,14 @@ -using System; +using System; using System.Linq; using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Producer; public class InMemoryMessageProducerTests { - [Fact] - public void When_adding_messages_to_the_producer() + [Test] + public async Task When_adding_messages_to_the_producer() { // arrange const string topic = "test_topic"; @@ -18,11 +17,11 @@ public void When_adding_messages_to_the_producer() var producer = new InMemoryMessageProducer(bus, instrumentationOptions:InstrumentationOptions.All); // act - producer.Send(message); + await producer.SendAsync(message); // assert var messages = bus.Stream(new RoutingKey(topic)); - Assert.Single(messages); - Assert.Equal(message.Id, messages.First().Id); + await Assert.That(messages).HasSingleItem(); + await Assert.That(messages.First().Id).IsEqualTo(message.Id); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Producer/When_sending_async_with_delay_and_scheduler_configured_should_use_scheduler.cs b/tests/Paramore.Brighter.InMemory.Tests/Producer/When_sending_async_with_delay_and_scheduler_configured_should_use_scheduler.cs index 0c8234b675..689a88cb19 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Producer/When_sending_async_with_delay_and_scheduler_configured_should_use_scheduler.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Producer/When_sending_async_with_delay_and_scheduler_configured_should_use_scheduler.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2025 Ian Cooper @@ -26,7 +26,6 @@ THE SOFTWARE. */ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Time.Testing; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Producer; @@ -57,19 +56,19 @@ public When_sending_async_with_delay_and_scheduler_configured_should_use_schedul _delay = TimeSpan.FromSeconds(30); } - [Fact] + [Test] public async Task Should_call_scheduler_schedule_async_method() { // Act await _producer.SendWithDelayAsync(_message, _delay); // Assert - Assert.True(_scheduler.ScheduleAsyncCalled, "Scheduler.ScheduleAsync should have been called"); - Assert.Equal(_message, _scheduler.ScheduledMessage); - Assert.Equal(_delay, _scheduler.ScheduledDelay); + await Assert.That(_scheduler.ScheduleAsyncCalled).IsTrue(); + await Assert.That(_scheduler.ScheduledMessage).IsEqualTo(_message); + await Assert.That(_scheduler.ScheduledDelay).IsEqualTo(_delay); } - [Fact] + [Test] public async Task Should_not_send_message_immediately_to_bus() { // Act @@ -77,7 +76,7 @@ public async Task Should_not_send_message_immediately_to_bus() // Assert var messagesOnBus = _bus.Stream(new RoutingKey("test.topic")); - Assert.Empty(messagesOnBus); + await Assert.That(messagesOnBus).IsEmpty(); } /// diff --git a/tests/Paramore.Brighter.InMemory.Tests/Producer/When_sending_with_delay_and_no_scheduler_should_use_timer_fallback.cs b/tests/Paramore.Brighter.InMemory.Tests/Producer/When_sending_with_delay_and_no_scheduler_should_use_timer_fallback.cs index 4d86137887..9dbf6bdafa 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Producer/When_sending_with_delay_and_no_scheduler_should_use_timer_fallback.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Producer/When_sending_with_delay_and_no_scheduler_should_use_timer_fallback.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2025 Ian Cooper @@ -24,7 +24,6 @@ THE SOFTWARE. */ using System; using System.Threading.Tasks; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Producer; @@ -52,18 +51,19 @@ public SchedulerNotConfiguredTests() _delay = TimeSpan.FromSeconds(30); } - [Fact] - public void When_sending_with_delay_and_no_scheduler_should_throw_exception() + [Test] + public Task When_sending_with_delay_and_no_scheduler_should_throw_exception() { // Assert - Assert.Throws(() => + Assert.ThrowsExactly(() => { // Act _producer.SendWithDelay(_message, _delay); }); + return Task.CompletedTask; } - [Fact] + [Test] public async Task When_sending_async_with_delay_and_no_scheduler_should_throw_exception() { // Assert diff --git a/tests/Paramore.Brighter.InMemory.Tests/Producer/When_sending_with_delay_and_scheduler_configured_should_use_scheduler.cs b/tests/Paramore.Brighter.InMemory.Tests/Producer/When_sending_with_delay_and_scheduler_configured_should_use_scheduler.cs index 1c13982e33..7073b5c35e 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Producer/When_sending_with_delay_and_scheduler_configured_should_use_scheduler.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Producer/When_sending_with_delay_and_scheduler_configured_should_use_scheduler.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2025 Ian Cooper @@ -24,7 +24,6 @@ THE SOFTWARE. */ using System; using Microsoft.Extensions.Time.Testing; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Producer; @@ -55,27 +54,27 @@ public When_sending_with_delay_and_scheduler_configured_should_use_scheduler() _delay = TimeSpan.FromSeconds(30); } - [Fact] - public void Should_call_scheduler_schedule_method() + [Test] + public async Task Should_call_scheduler_schedule_method() { // Act _producer.SendWithDelay(_message, _delay); // Assert - Assert.True(_scheduler.ScheduleCalled, "Scheduler.Schedule should have been called"); - Assert.Equal(_message, _scheduler.ScheduledMessage); - Assert.Equal(_delay, _scheduler.ScheduledDelay); + await Assert.That(_scheduler.ScheduleCalled).IsTrue(); + await Assert.That(_scheduler.ScheduledMessage).IsEqualTo(_message); + await Assert.That(_scheduler.ScheduledDelay).IsEqualTo(_delay); } - [Fact] - public void Should_not_send_message_immediately_to_bus() + [Test] + public async Task Should_not_send_message_immediately_to_bus() { // Act _producer.SendWithDelay(_message, _delay); // Assert var messagesOnBus = _bus.Stream(new RoutingKey("test.topic")); - Assert.Empty(messagesOnBus); + await Assert.That(messagesOnBus).IsEmpty(); } /// diff --git a/tests/Paramore.Brighter.InMemory.Tests/Producer/When_sending_with_zero_delay_should_send_immediately_without_scheduler.cs b/tests/Paramore.Brighter.InMemory.Tests/Producer/When_sending_with_zero_delay_should_send_immediately_without_scheduler.cs index 6d432dd777..16f32f8540 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Producer/When_sending_with_zero_delay_should_send_immediately_without_scheduler.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Producer/When_sending_with_zero_delay_should_send_immediately_without_scheduler.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2025 Ian Cooper @@ -25,7 +25,6 @@ THE SOFTWARE. */ using System; using System.Linq; using Microsoft.Extensions.Time.Testing; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Producer; @@ -55,38 +54,38 @@ public When_sending_with_zero_delay_should_send_immediately_without_scheduler() new MessageBody("test content")); } - [Fact] - public void Should_send_message_directly_to_bus_when_delay_is_zero() + [Test] + public async Task Should_send_message_directly_to_bus_when_delay_is_zero() { // Act _producer.SendWithDelay(_message, TimeSpan.Zero); // Assert var messagesOnBus = _bus.Stream(_routingKey); - Assert.Single(messagesOnBus); - Assert.Equal(_message.Id, messagesOnBus.First().Id); + await Assert.That(messagesOnBus).HasSingleItem(); + await Assert.That(messagesOnBus.First().Id).IsEqualTo(_message.Id); } - [Fact] - public void Should_send_message_directly_to_bus_when_delay_is_null() + [Test] + public async Task Should_send_message_directly_to_bus_when_delay_is_null() { // Act _producer.SendWithDelay(_message, null); // Assert var messagesOnBus = _bus.Stream(_routingKey); - Assert.Single(messagesOnBus); - Assert.Equal(_message.Id, messagesOnBus.First().Id); + await Assert.That(messagesOnBus).HasSingleItem(); + await Assert.That(messagesOnBus.First().Id).IsEqualTo(_message.Id); } - [Fact] - public void Should_not_invoke_scheduler_when_delay_is_zero() + [Test] + public async Task Should_not_invoke_scheduler_when_delay_is_zero() { // Act _producer.SendWithDelay(_message, TimeSpan.Zero); // Assert - Assert.False(_scheduler.ScheduleCalled, "Scheduler should NOT have been called for zero delay"); + await Assert.That(_scheduler.ScheduleCalled).IsFalse(); } /// diff --git a/tests/Paramore.Brighter.InMemory.Tests/Scheduler/When_scheduling_a_message.cs b/tests/Paramore.Brighter.InMemory.Tests/Scheduler/When_scheduling_a_message.cs index dc4b568c59..2b3640c230 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Scheduler/When_scheduling_a_message.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Scheduler/When_scheduling_a_message.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Text.Json; using System.Transactions; @@ -10,12 +10,10 @@ using Paramore.Brighter.Scheduler.Handlers; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Scheduler; -[Trait("Category", "InMemory")] -[Collection("CommandProcess")] +[Category("InMemory")] public class InMemorySchedulerMessageTests { private readonly InMemorySchedulerFactory _scheduler; @@ -90,8 +88,8 @@ public InMemorySchedulerMessageTests() ); } - [Fact] - public void When_scheduler_a_message_with_a_datetimeoffset() + [Test] + public async Task When_scheduler_a_message_with_a_datetimeoffset() { var req = new MyEvent(); var message = @@ -103,32 +101,32 @@ public void When_scheduler_a_message_with_a_datetimeoffset() var id = scheduler.Schedule(message, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); - var actual = _outbox.Get(message.Id, new RequestContext()); - - Assert.Equivalent(message.Body, actual.Body); - Assert.Equal(message.Id, actual.Id); - Assert.Equal(message.Persist, actual.Persist); - Assert.Equal(message.Redelivered, actual.Redelivered); - Assert.Equal(message.DeliveryTag, actual.DeliveryTag); - Assert.Equal(message.Header.MessageType, actual.Header.MessageType); - Assert.Equal(message.Header.Topic, actual.Header.Topic); - Assert.Equal(message.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(message.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(message.Header.ContentType, actual.Header.ContentType); - Assert.Equal(message.Header.HandledCount, actual.Header.HandledCount); + var actual = await _outbox.GetAsync(message.Id, new RequestContext()); + + await Assert.That(actual.Body).IsEquivalentTo(message.Body); + await Assert.That(actual.Id).IsEqualTo(message.Id); + await Assert.That(actual.Persist).IsEqualTo(message.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(message.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(message.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(message.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(message.Header.HandledCount); } - [Fact] - public void When_scheduler_a_message_with_a_timespan() + [Test] + public async Task When_scheduler_a_message_with_a_timespan() { var req = new MyEvent(); var message = @@ -139,32 +137,32 @@ public void When_scheduler_a_message_with_a_timespan() var scheduler = (IAmAMessageSchedulerSync)_scheduler.Create(_processor); var id = scheduler.Schedule(message, TimeSpan.FromSeconds(1)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); - - var actual = _outbox.Get(req.Id, new RequestContext()); - - Assert.Equivalent(message.Body, actual.Body); - Assert.Equal(message.Id, actual.Id); - Assert.Equal(message.Persist, actual.Persist); - Assert.Equal(message.Redelivered, actual.Redelivered); - Assert.Equal(message.DeliveryTag, actual.DeliveryTag); - Assert.Equal(message.Header.MessageType, actual.Header.MessageType); - Assert.Equal(message.Header.Topic, actual.Header.Topic); - Assert.Equal(message.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(message.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(message.Header.ContentType, actual.Header.ContentType); - Assert.Equal(message.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); + + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); + + await Assert.That(actual.Body).IsEquivalentTo(message.Body); + await Assert.That(actual.Id).IsEqualTo(message.Id); + await Assert.That(actual.Persist).IsEqualTo(message.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(message.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(message.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(message.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(message.Header.HandledCount); } - [Fact] - public void When_reschedule_a_message_with_a_datetimeoffset() + [Test] + public async Task When_reschedule_a_message_with_a_datetimeoffset() { var req = new MyEvent(); var message = @@ -175,36 +173,36 @@ public void When_reschedule_a_message_with_a_datetimeoffset() var scheduler = (IAmAMessageSchedulerSync)_scheduler.Create(_processor); var id = scheduler.Schedule(message, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(id.Length).IsNotEqualTo(0); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); scheduler.ReScheduler(id, _timeProvider.GetUtcNow().Add(TimeSpan.FromHours(1))); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); _timeProvider.Advance(TimeSpan.FromHours(2)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); - var actual = _outbox.Get(req.Id, new RequestContext()); - - Assert.Equivalent(message.Body, actual.Body); - Assert.Equal(message.Id, actual.Id); - Assert.Equal(message.Persist, actual.Persist); - Assert.Equal(message.Redelivered, actual.Redelivered); - Assert.Equal(message.DeliveryTag, actual.DeliveryTag); - Assert.Equal(message.Header.MessageType, actual.Header.MessageType); - Assert.Equal(message.Header.Topic, actual.Header.Topic); - Assert.Equal(message.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(message.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(message.Header.ContentType, actual.Header.ContentType); - Assert.Equal(message.Header.HandledCount, actual.Header.HandledCount); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); + + await Assert.That(actual.Body).IsEquivalentTo(message.Body); + await Assert.That(actual.Id).IsEqualTo(message.Id); + await Assert.That(actual.Persist).IsEqualTo(message.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(message.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(message.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(message.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(message.Header.HandledCount); } - [Fact] - public void When_reschedule_a_message_with_a_timespan() + [Test] + public async Task When_reschedule_a_message_with_a_timespan() { var req = new MyEvent(); var message = @@ -215,28 +213,28 @@ public void When_reschedule_a_message_with_a_timespan() var scheduler = (IAmAMessageSchedulerSync)_scheduler.Create(_processor); var id = scheduler.Schedule(message, TimeSpan.FromHours(1)); - Assert.NotEqual(0, id.Length); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(id.Length).IsNotEqualTo(0); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); scheduler.ReScheduler(id, TimeSpan.FromHours(1)); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); _timeProvider.Advance(TimeSpan.FromHours(2)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.NotEqual(expected.Body, actual.Body); - Assert.NotEqual(expected.Id, actual.Id); - Assert.NotEqual(expected.Header.MessageType, actual.Header.MessageType); - Assert.NotEqual(expected.Header.Topic, actual.Header.Topic); + await Assert.That(actual.Body).IsNotEqualTo(expected.Body); + await Assert.That(actual.Id).IsNotEqualTo(expected.Id); + await Assert.That(actual.Header.MessageType).IsNotEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsNotEqualTo(expected.Header.Topic); } - [Fact] - public void When_cancel_scheduler_message_with_a_datetimeoffset() + [Test] + public async Task When_cancel_scheduler_message_with_a_datetimeoffset() { var req = new MyEvent(); var message = @@ -247,7 +245,7 @@ public void When_cancel_scheduler_message_with_a_datetimeoffset() var scheduler = (IAmAMessageSchedulerSync)_scheduler.Create(_processor); var id = scheduler.Schedule(message, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); scheduler.Cancel(id); @@ -255,17 +253,17 @@ public void When_cancel_scheduler_message_with_a_datetimeoffset() var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equal(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); + await Assert.That(actual.Body).IsEqualTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); } - [Fact] - public void When_cancel_scheduler_request_with_a_timespan() + [Test] + public async Task When_cancel_scheduler_request_with_a_timespan() { var req = new MyEvent(); var message = @@ -276,26 +274,26 @@ public void When_cancel_scheduler_request_with_a_timespan() var scheduler = (IAmAMessageSchedulerSync)_scheduler.Create(_processor); var id = scheduler.Schedule(message, TimeSpan.FromHours(1)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); scheduler.Cancel(id); _timeProvider.Advance(TimeSpan.FromSeconds(2)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Scheduler/When_scheduling_a_message_async.cs b/tests/Paramore.Brighter.InMemory.Tests/Scheduler/When_scheduling_a_message_async.cs index 4f1f7cd636..5abd530e5b 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Scheduler/When_scheduling_a_message_async.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Scheduler/When_scheduling_a_message_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; @@ -12,12 +12,10 @@ using Paramore.Brighter.Scheduler.Handlers; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Scheduler; -[Trait("Category", "InMemory")] -[Collection("CommandProcess")] +[Category("InMemory")] public class InMemorySchedulerMessageAsyncTests { private readonly InMemorySchedulerFactory _scheduler; @@ -99,7 +97,7 @@ public InMemorySchedulerMessageAsyncTests() ); } - [Fact] + [Test] public async Task When_scheduler_a_message_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -112,32 +110,32 @@ public async Task When_scheduler_a_message_with_a_datetimeoffset_async() var id = await scheduler.ScheduleAsync(message, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); - var actual = _outbox.Get(message.Id, new RequestContext()); + var actual = await _outbox.GetAsync(message.Id, new RequestContext()); - Assert.Equivalent(message.Body, actual.Body); - Assert.Equal(message.Id, actual.Id); - Assert.Equal(message.Persist, actual.Persist); - Assert.Equal(message.Redelivered, actual.Redelivered); - Assert.Equal(message.DeliveryTag, actual.DeliveryTag); - Assert.Equal(message.Header.MessageType, actual.Header.MessageType); - Assert.Equal(message.Header.Topic, actual.Header.Topic); - Assert.Equal(message.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(message.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(message.Header.ContentType, actual.Header.ContentType); - Assert.Equal(message.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(message.Body); + await Assert.That(actual.Id).IsEqualTo(message.Id); + await Assert.That(actual.Persist).IsEqualTo(message.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(message.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(message.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(message.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(message.Header.HandledCount); } - [Fact] + [Test] public async Task When_scheduler_a_message_with_a_timespan_async() { var req = new MyEvent(); @@ -149,31 +147,31 @@ public async Task When_scheduler_a_message_with_a_timespan_async() var scheduler = (IAmAMessageSchedulerAsync)_scheduler.Create(_processor); var id = await scheduler.ScheduleAsync(message, TimeSpan.FromSeconds(1)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); - - var actual = _outbox.Get(req.Id, new RequestContext()); - - Assert.Equivalent(message.Body, actual.Body); - Assert.Equal(message.Id, actual.Id); - Assert.Equal(message.Persist, actual.Persist); - Assert.Equal(message.Redelivered, actual.Redelivered); - Assert.Equal(message.DeliveryTag, actual.DeliveryTag); - Assert.Equal(message.Header.MessageType, actual.Header.MessageType); - Assert.Equal(message.Header.Topic, actual.Header.Topic); - Assert.Equal(message.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(message.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(message.Header.ContentType, actual.Header.ContentType); - Assert.Equal(message.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); + + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); + + await Assert.That(actual.Body).IsEquivalentTo(message.Body); + await Assert.That(actual.Id).IsEqualTo(message.Id); + await Assert.That(actual.Persist).IsEqualTo(message.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(message.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(message.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(message.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(message.Header.HandledCount); } - [Fact] + [Test] public async Task When_reschedule_a_message_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -185,35 +183,35 @@ public async Task When_reschedule_a_message_with_a_datetimeoffset_async() var scheduler = (IAmAMessageSchedulerAsync)_scheduler.Create(_processor); var id = await scheduler.ScheduleAsync(message, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(id.Length).IsNotEqualTo(0); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); await scheduler.ReSchedulerAsync(id, _timeProvider.GetUtcNow().Add(TimeSpan.FromHours(1))); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); _timeProvider.Advance(TimeSpan.FromHours(2)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); - var actual = _outbox.Get(req.Id, new RequestContext()); - - Assert.Equivalent(message.Body.Value, actual.Body.Value); - Assert.Equal(message.Id, actual.Id); - Assert.Equal(message.Persist, actual.Persist); - Assert.Equal(message.Redelivered, actual.Redelivered); - Assert.Equal(message.DeliveryTag, actual.DeliveryTag); - Assert.Equal(message.Header.MessageType, actual.Header.MessageType); - Assert.Equal(message.Header.Topic, actual.Header.Topic); - Assert.Equal(message.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(message.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(message.Header.ContentType, actual.Header.ContentType); - Assert.Equal(message.Header.HandledCount, actual.Header.HandledCount); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); + + await Assert.That(actual.Body.Value).IsEquivalentTo(message.Body.Value); + await Assert.That(actual.Id).IsEqualTo(message.Id); + await Assert.That(actual.Persist).IsEqualTo(message.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(message.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(message.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(message.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(message.Header.HandledCount); } - [Fact] + [Test] public async Task When_reschedule_a_message_with_a_timespan_async() { var req = new MyEvent(); @@ -225,21 +223,21 @@ public async Task When_reschedule_a_message_with_a_timespan_async() var scheduler = (IAmAMessageSchedulerAsync)_scheduler.Create(_processor); var id = await scheduler.ScheduleAsync(message, TimeSpan.FromHours(1)); - Assert.NotEqual(0, id.Length); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(id.Length).IsNotEqualTo(0); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); await scheduler.ReSchedulerAsync(id, TimeSpan.FromHours(1)); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); _timeProvider.Advance(TimeSpan.FromHours(2)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); - Assert.NotEqual(Message.Empty, _outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); } - [Fact] + [Test] public async Task When_cancel_scheduler_message_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -251,31 +249,31 @@ public async Task When_cancel_scheduler_message_with_a_datetimeoffset_async() var scheduler = (IAmAMessageSchedulerAsync)_scheduler.Create(_processor); var id = await scheduler.ScheduleAsync(message, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); await scheduler.CancelAsync(id); _timeProvider.Advance(TimeSpan.FromSeconds(2)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_cancel_scheduler_request_with_a_timespan_async() { var req = new MyEvent(); @@ -287,26 +285,26 @@ public async Task When_cancel_scheduler_request_with_a_timespan_async() var scheduler = (IAmAMessageSchedulerAsync)_scheduler.Create(_processor); var id = await scheduler.ScheduleAsync(message, TimeSpan.FromHours(1)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); await scheduler.CancelAsync(id); _timeProvider.Advance(TimeSpan.FromSeconds(2)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Scheduler/When_scheduling_a_request.cs b/tests/Paramore.Brighter.InMemory.Tests/Scheduler/When_scheduling_a_request.cs index 7c67f3586e..13cebeb359 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Scheduler/When_scheduling_a_request.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Scheduler/When_scheduling_a_request.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Transactions; @@ -10,12 +10,10 @@ using Paramore.Brighter.Scheduler.Handlers; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Scheduler; -[Trait("Category", "InMemory")] -[Collection("CommandProcess")] +[Category("InMemory")] public class InMemorySchedulerRequestTests { private readonly InMemorySchedulerFactory _scheduler; @@ -90,327 +88,327 @@ public InMemorySchedulerRequestTests() #region Scheduler - [Fact] - public void When_scheduler_send_request_with_a_datetimeoffset() + [Test] + public async Task When_scheduler_send_request_with_a_datetimeoffset() { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, RequestSchedulerType.Send, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] - public void When_scheduler_send_request_with_a_timespan() + [Test] + public async Task When_scheduler_send_request_with_a_timespan() { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, RequestSchedulerType.Send, TimeSpan.FromSeconds(1)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] - public void When_scheduler_publish_request_with_a_datetimeoffset() + [Test] + public async Task When_scheduler_publish_request_with_a_datetimeoffset() { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, RequestSchedulerType.Publish, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] - public void When_scheduler_publish_request_with_a_timespan() + [Test] + public async Task When_scheduler_publish_request_with_a_timespan() { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, RequestSchedulerType.Publish, TimeSpan.FromSeconds(1)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] - public void When_scheduler_post_request_with_a_datetimeoffset() + [Test] + public async Task When_scheduler_post_request_with_a_datetimeoffset() { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, RequestSchedulerType.Post, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.NotEqual(Message.Empty,_outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); } - [Fact] - public void When_scheduler_post_request_with_a_timespan() + [Test] + public async Task When_scheduler_post_request_with_a_timespan() { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, RequestSchedulerType.Post, TimeSpan.FromSeconds(1)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); - Assert.NotEqual(Message.Empty,_outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); } #endregion #region Rescheduler - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Publish)] - public void When_reschedule_request_with_a_datetimeoffset(RequestSchedulerType type) + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Publish)] + public async Task When_reschedule_request_with_a_datetimeoffset(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, type, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); scheduler.ReScheduler(id, _timeProvider.GetUtcNow().Add(TimeSpan.FromHours(1))); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); _timeProvider.Advance(TimeSpan.FromHours(2)); - Assert.Contains(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Publish)] - public void When_reschedule_send_request_with_a_timespan(RequestSchedulerType type) + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Publish)] + public async Task When_reschedule_send_request_with_a_timespan(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, type, TimeSpan.FromHours(1)); - Assert.NotEqual(0, id.Length); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(id.Length).IsNotEqualTo(0); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); scheduler.ReScheduler(id, TimeSpan.FromHours(1)); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); _timeProvider.Advance(TimeSpan.FromHours(2)); - Assert.Contains(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } #endregion #region Cancel - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] - public void When_cancel_scheduler_request_with_a_datetimeoffset(RequestSchedulerType type) + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] + public async Task When_cancel_scheduler_request_with_a_datetimeoffset(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, type, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); scheduler.Cancel(id); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] - public void When_cancel_scheduler_request_with_a_timespan(RequestSchedulerType type) + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] + public async Task When_cancel_scheduler_request_with_a_timespan(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, type, TimeSpan.FromHours(1)); - Assert.NotEqual(0, id.Length); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(id.Length).IsNotEqualTo(0); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); scheduler.Cancel(id); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } #endregion diff --git a/tests/Paramore.Brighter.InMemory.Tests/Scheduler/When_scheduling_a_request_async.cs b/tests/Paramore.Brighter.InMemory.Tests/Scheduler/When_scheduling_a_request_async.cs index ff69b5be9c..2869ebb583 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Scheduler/When_scheduling_a_request_async.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Scheduler/When_scheduling_a_request_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -11,13 +11,11 @@ using Paramore.Brighter.Scheduler.Handlers; using Polly; using Polly.Registry; -using Xunit; using MyEventHandlerAsync = Paramore.Brighter.InMemory.Tests.TestDoubles.MyEventHandlerAsync; namespace Paramore.Brighter.InMemory.Tests.Scheduler; -[Trait("Category", "InMemory")] -[Collection("CommandProcess")] +[Category("InMemory")] public class InMemorySchedulerRequestAsyncTests { private readonly InMemorySchedulerFactory _scheduler; @@ -98,7 +96,7 @@ public InMemorySchedulerRequestAsyncTests() #region Scheduler - [Fact] + [Test] public async Task When_scheduler_send_request_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -106,64 +104,64 @@ public async Task When_scheduler_send_request_with_a_datetimeoffset_async() var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Send, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_scheduler_send_request_with_a_timespan_asc() { var req = new MyEvent(); var scheduler = _scheduler.CreateAsync(_processor); var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Send, TimeSpan.FromSeconds(1)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_scheduler_publish_request_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -171,64 +169,64 @@ public async Task When_scheduler_publish_request_with_a_datetimeoffset_async() var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Publish, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_scheduler_publish_request_with_a_timespan() { var req = new MyEvent(); var scheduler = _scheduler.CreateAsync(_processor); var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Publish, TimeSpan.FromSeconds(1)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_scheduler_post_request_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -236,122 +234,122 @@ public async Task When_scheduler_post_request_with_a_datetimeoffset_async() var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Post, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.NotEqual(Message.Empty,_outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); } - [Fact] + [Test] public async Task When_scheduler_post_request_with_a_timespan_async() { var req = new MyEvent(); var scheduler = _scheduler.CreateAsync(_processor); var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Post, TimeSpan.FromSeconds(1)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); - Assert.NotEqual(Message.Empty, _outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); } #endregion #region Rescheduler - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_reschedule_request_with_a_datetimeoffset_async(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateAsync(_processor); var id = await scheduler.ScheduleAsync(req, type, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); await scheduler.ReSchedulerAsync(id, _timeProvider.GetUtcNow().Add(TimeSpan.FromHours(1))); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); _timeProvider.Advance(TimeSpan.FromHours(2)); - Assert.Contains(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_reschedule_send_request_with_a_timespan_async(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateAsync(_processor); var id = await scheduler.ScheduleAsync(req, type, TimeSpan.FromHours(1)); - Assert.NotEqual(0, id.Length); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(id.Length).IsNotEqualTo(0); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await scheduler.ReSchedulerAsync(id, TimeSpan.FromHours(1)); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); _timeProvider.Advance(TimeSpan.FromHours(2)); - Assert.Contains(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } #endregion #region Cancel - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_cancel_scheduler_request_with_a_datetimeoffset(RequestSchedulerType type) { var req = new MyEvent(); @@ -359,67 +357,67 @@ public async Task When_cancel_scheduler_request_with_a_datetimeoffset(RequestSch var id = await scheduler.ScheduleAsync(req, type, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await scheduler.CancelAsync(id); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_cancel_scheduler_request_with_a_timespan_async(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateAsync(_processor); var id = await scheduler.ScheduleAsync(req, type, TimeSpan.FromHours(1)); - Assert.NotEqual(0, id.Length); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(id.Length).IsNotEqualTo(0); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await scheduler.CancelAsync(id); _timeProvider.Advance(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } #endregion diff --git a/tests/Paramore.Brighter.InMemory.Tests/Scheduler/When_scheduling_message_with_existing_id_should_atomically_replace_timer.cs b/tests/Paramore.Brighter.InMemory.Tests/Scheduler/When_scheduling_message_with_existing_id_should_atomically_replace_timer.cs index d7bf79f187..d2ff2d4f7c 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Scheduler/When_scheduling_message_with_existing_id_should_atomically_replace_timer.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Scheduler/When_scheduling_message_with_existing_id_should_atomically_replace_timer.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2025 Ian Cooper @@ -36,7 +36,6 @@ THE SOFTWARE. */ using Paramore.Brighter.Scheduler.Handlers; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Scheduler; @@ -44,8 +43,8 @@ namespace Paramore.Brighter.InMemory.Tests.Scheduler; /// Tests that the InMemoryScheduler uses atomic operations when replacing timers /// for messages with the same scheduler ID, preventing race conditions. /// -[Trait("Category", "InMemory")] -[Collection("CommandProcess")] +[Category("InMemory")] +[NotInParallel("CommandProcess")] public class When_scheduling_message_with_existing_id_should_atomically_replace_timer { private readonly InMemorySchedulerFactory _schedulerFactory; @@ -125,7 +124,7 @@ public When_scheduling_message_with_existing_id_should_atomically_replace_timer( ); } - [Fact] + [Test] public async Task When_scheduling_same_id_concurrently_should_not_have_race_condition() { // Arrange @@ -160,11 +159,11 @@ public async Task When_scheduling_same_id_concurrently_should_not_have_race_cond await Task.WhenAll(tasks); // Assert - No exceptions should occur during concurrent scheduling - Assert.Empty(exceptions); + await Assert.That(exceptions).IsEmpty(); } - [Fact] - public void When_replacing_timer_should_dispose_old_timer_before_creating_new() + [Test] + public async Task When_replacing_timer_should_dispose_old_timer_before_creating_new() { // Arrange var scheduler = (IAmAMessageSchedulerSync)_schedulerFactory.Create(_processor); @@ -178,8 +177,8 @@ public void When_replacing_timer_should_dispose_old_timer_before_creating_new() var secondId = scheduler.Schedule(secondMessage, TimeSpan.FromMinutes(5)); // Assert - Both calls return the same scheduler ID - Assert.Equal(FixedSchedulerId, firstId); - Assert.Equal(FixedSchedulerId, secondId); + await Assert.That(firstId).IsEqualTo(FixedSchedulerId); + await Assert.That(secondId).IsEqualTo(FixedSchedulerId); // Advance time past the second delay (5 minutes) but not the first (10 minutes) _timeProvider.Advance(TimeSpan.FromMinutes(6)); @@ -187,11 +186,11 @@ public void When_replacing_timer_should_dispose_old_timer_before_creating_new() // The second message should have been delivered (timer was replaced with shorter delay) // Only one message should be in the bus (no orphaned timer delivering the first message) var messages = _internalBus.Stream(_routingKey); - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); } - [Fact] - public void When_scheduling_same_id_multiple_times_should_only_deliver_last_message() + [Test] + public async Task When_scheduling_same_id_multiple_times_should_only_deliver_last_message() { // Arrange var scheduler = (IAmAMessageSchedulerSync)_schedulerFactory.Create(_processor); @@ -209,7 +208,7 @@ public void When_scheduling_same_id_multiple_times_should_only_deliver_last_mess // Assert - Only ONE message should be delivered (no orphaned timers) var deliveredMessages = _internalBus.Stream(_routingKey); - Assert.Single(deliveredMessages); + await Assert.That(deliveredMessages).HasSingleItem(); } private Message CreateMessage(int index) diff --git a/tests/Paramore.Brighter.InMemory.Tests/Sweeper/When_sweeping_the_outbox.cs b/tests/Paramore.Brighter.InMemory.Tests/Sweeper/When_sweeping_the_outbox.cs index fe334f78c1..24037de3a3 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Sweeper/When_sweeping_the_outbox.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Sweeper/When_sweeping_the_outbox.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -8,17 +8,16 @@ using Paramore.Brighter.InMemory.Tests.TestDoubles; using Paramore.Brighter.Observability; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Sweeper { - [Trait("Category", "InMemory")] - [Collection("CommandProcess")] + [Category("InMemory")] + [NotInParallel("CommandProcess")] public class SweeperTests { private const string MyTopic = "MyTopic"; - [Fact] + [Test] public async Task When_outstanding_in_outbox_sweep_clears_them() { //Arrange @@ -84,11 +83,11 @@ public async Task When_outstanding_in_outbox_sweep_clears_them() await Task.Delay(1000); //Give the sweep time to run //Assert - Assert.Equal(3, internalBus.Stream(routingKey).Count()); - Assert.Empty(await outbox.OutstandingMessagesAsync(TimeSpan.Zero, new RequestContext())); + await Assert.That(internalBus.Stream(routingKey).Count()).IsEqualTo(3); + await Assert.That(await outbox.OutstandingMessagesAsync(TimeSpan.Zero, new RequestContext())).IsEmpty(); } - [Fact] + [Test] public async Task When_outstanding_in_outbox_sweep_clears_them_async() { //Arrange @@ -155,11 +154,11 @@ public async Task When_outstanding_in_outbox_sweep_clears_them_async() await Task.Delay(1000); //Give the sweep time to run //Assert - Assert.Equal(3, internalBus.Stream(routingKey).Count()); - Assert.Empty((await outbox.OutstandingMessagesAsync(TimeSpan.Zero, new RequestContext()))); + await Assert.That(internalBus.Stream(routingKey).Count()).IsEqualTo(3); + await Assert.That((await outbox.OutstandingMessagesAsync(TimeSpan.Zero, new RequestContext()))).IsEmpty(); } - [Fact] + [Test] public async Task When_too_new_to_sweep_leaves_them() { //Arrange @@ -233,11 +232,11 @@ public async Task When_too_new_to_sweep_leaves_them() await Task.Delay(1000); //Give the sweep time to run //Assert - Assert.Single(internalBus.Stream(routingKey)); - Assert.Equal(3, outbox.OutstandingMessages(TimeSpan.Zero, new RequestContext()).Count()); + await Assert.That(internalBus.Stream(routingKey)).HasSingleItem(); + await Assert.That((await outbox.OutstandingMessagesAsync(TimeSpan.Zero, new RequestContext())).Count()).IsEqualTo(3); } - [Fact] + [Test] public async Task When_too_new_to_sweep_leaves_them_async() { //Arrange @@ -308,8 +307,8 @@ public async Task When_too_new_to_sweep_leaves_them_async() await Task.Delay(1000); //Give the sweep time to run //Assert - Assert.Single(internalBus.Stream(routingKey)); - Assert.Equal(3, (await outbox.OutstandingMessagesAsync(TimeSpan.Zero, new RequestContext())).Count()); + await Assert.That(internalBus.Stream(routingKey)).HasSingleItem(); + await Assert.That((await outbox.OutstandingMessagesAsync(TimeSpan.Zero, new RequestContext())).Count()).IsEqualTo(3); } } } diff --git a/tests/Paramore.Brighter.InMemory.Tests/Sweeper/When_sweeping_the_outbox_with_circuit_breaker.cs b/tests/Paramore.Brighter.InMemory.Tests/Sweeper/When_sweeping_the_outbox_with_circuit_breaker.cs index 2b486070c1..48a5e14170 100644 --- a/tests/Paramore.Brighter.InMemory.Tests/Sweeper/When_sweeping_the_outbox_with_circuit_breaker.cs +++ b/tests/Paramore.Brighter.InMemory.Tests/Sweeper/When_sweeping_the_outbox_with_circuit_breaker.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -13,11 +13,10 @@ using Paramore.Brighter.Observability; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.InMemory.Tests.Sweeper { - [Collection("CommandProcess")] + [NotInParallel("CommandProcess")] public class SweeperTestsWithCircuitBreaker { private readonly Message _messageOne; @@ -111,9 +110,9 @@ public SweeperTestsWithCircuitBreaker() } - [Theory] - [InlineData(true)] - [InlineData(false)] + [Test] + [Arguments(true)] + [Arguments(false)] public async Task When_outstanding_in_outbox_with_trippedTopic_sweep_clears_them_async(bool useBulk) { // Arrange @@ -127,13 +126,13 @@ public async Task When_outstanding_in_outbox_with_trippedTopic_sweep_clears_them // Act (clear non tripped) await _sweeper.SweepAsync(); await Task.Delay(1000); - Assert.True(_internalBus.Stream(_routingKeyOne).Any()); - Assert.False(_internalBus.Stream(_routingKeyTwo).Any()); + await Assert.That(_internalBus.Stream(_routingKeyOne).Any()).IsTrue(); + await Assert.That(_internalBus.Stream(_routingKeyTwo).Any()).IsFalse(); var sentMessage = _internalBus.Dequeue(_routingKeyOne); - Assert.NotNull(sentMessage); - Assert.Equal(_messageOne.Id, sentMessage.Id); - Assert.Equal(_messageOne.Header.Topic, sentMessage.Header.Topic); - Assert.Equal(_messageOne.Body.Value, sentMessage.Body.Value); + await Assert.That(sentMessage).IsNotNull(); + await Assert.That(sentMessage.Id).IsEqualTo(_messageOne.Id); + await Assert.That(sentMessage.Header.Topic).IsEqualTo(_messageOne.Header.Topic); + await Assert.That(sentMessage.Body.Value).IsEqualTo(_messageOne.Body.Value); // Act (clear tripped) await _sweeper.SweepAsync(); @@ -141,15 +140,15 @@ public async Task When_outstanding_in_outbox_with_trippedTopic_sweep_clears_them // Assert var sentMessage2 = _internalBus.Dequeue(_routingKeyTwo, TimeSpan.FromSeconds(1)); - Assert.NotNull(sentMessage2); - Assert.Equal(_messageTwo.Id, sentMessage2.Id); - Assert.Equal(_messageTwo.Header.Topic, sentMessage2.Header.Topic); - Assert.Equal(_messageTwo.Body.Value, sentMessage2.Body.Value); + await Assert.That(sentMessage2).IsNotNull(); + await Assert.That(sentMessage2.Id).IsEqualTo(_messageTwo.Id); + await Assert.That(sentMessage2.Header.Topic).IsEqualTo(_messageTwo.Header.Topic); + await Assert.That(sentMessage2.Body.Value).IsEqualTo(_messageTwo.Body.Value); } - [Theory] - [InlineData(true)] - [InlineData(false)] + [Test] + [Arguments(true)] + [Arguments(false)] public async Task When_outstanding_in_outbox_and_one_topic_trips_Then_nonTripped_are_cleared_on_second_sweep(bool useBulk) { // Arrange @@ -165,25 +164,25 @@ public async Task When_outstanding_in_outbox_and_one_topic_trips_Then_nonTripped // first sweep trips failing topics await _sweeper.SweepAsync(); await Task.Delay(1000); //Give the sweep time to run - Assert.False(_internalBus.Stream(_routingKeyOne).Any()); - Assert.False(_internalBus.Stream(_routingKeyTwo).Any()); + await Assert.That(_internalBus.Stream(_routingKeyOne).Any()).IsFalse(); + await Assert.That(_internalBus.Stream(_routingKeyTwo).Any()).IsFalse(); // second sweep skips tripped topics await _sweeper.SweepAsync(); await Task.Delay(1000); - Assert.True(_internalBus.Stream(_routingKeyOne).Any()); - Assert.True(_internalBus.Stream(_routingKeyTwo).Any()); + await Assert.That(_internalBus.Stream(_routingKeyOne).Any()).IsTrue(); + await Assert.That(_internalBus.Stream(_routingKeyTwo).Any()).IsTrue(); var sentMessage = _internalBus.Dequeue(_routingKeyOne); - Assert.NotNull(sentMessage); - Assert.Equal(_messageOne.Id, sentMessage.Id); - Assert.Equal(_messageOne.Header.Topic, sentMessage.Header.Topic); - Assert.Equal(_messageOne.Body.Value, sentMessage.Body.Value); + await Assert.That(sentMessage).IsNotNull(); + await Assert.That(sentMessage.Id).IsEqualTo(_messageOne.Id); + await Assert.That(sentMessage.Header.Topic).IsEqualTo(_messageOne.Header.Topic); + await Assert.That(sentMessage.Body.Value).IsEqualTo(_messageOne.Body.Value); var sentMessage2 = _internalBus.Dequeue(_routingKeyTwo, TimeSpan.FromSeconds(1)); - Assert.NotNull(sentMessage2); - Assert.Equal(_messageTwo.Id, sentMessage2.Id); - Assert.Equal(_messageTwo.Header.Topic, sentMessage2.Header.Topic); - Assert.Equal(_messageTwo.Body.Value, sentMessage2.Body.Value); + await Assert.That(sentMessage2).IsNotNull(); + await Assert.That(sentMessage2.Id).IsEqualTo(_messageTwo.Id); + await Assert.That(sentMessage2.Header.Topic).IsEqualTo(_messageTwo.Header.Topic); + await Assert.That(sentMessage2.Body.Value).IsEqualTo(_messageTwo.Body.Value); } } } diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_a_message_is_acknowledged_update_offset_async.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_a_message_is_acknowledged_update_offset_async.cs index 91766908db..f9e1947396 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_a_message_is_acknowledged_update_offset_async.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_a_message_is_acknowledged_update_offset_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; @@ -6,25 +6,20 @@ using Confluent.Kafka; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Proactor; -[Trait("Category", "Kafka")] -[Trait("Fragile", "CI")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition +[Category("Kafka")] +[Property("Fragile", "CI")] public class KafkaMessageConsumerUpdateOffsetAsync : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly IAmAProducerRegistry _producerRegistry; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaMessageConsumerUpdateOffsetAsync(ITestOutputHelper output) + public KafkaMessageConsumerUpdateOffsetAsync() { - _output = output; _producerRegistry = new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration { Name = "Kafka Producer Send Test", BootStrapServers = new[] { "localhost:9092" } }, [ @@ -40,8 +35,8 @@ public KafkaMessageConsumerUpdateOffsetAsync(ITestOutputHelper output) ]).Create(); } - //[Fact(Skip = "As it has to wait for the messages to flush, only tends to run well in debug")] - [Fact] + //[Test, Skip("As it has to wait for the messages to flush, only tends to run well in debug")] + [Test] public async Task When_a_message_is_acknowledged_update_offset() { //Let topic propagate in the broker @@ -77,16 +72,16 @@ await producerAsync.SendAsync( ((KafkaMessageProducer)producerAsync).Flush(); //check we sent everything - Assert.DoesNotContain(sentMessages, dr => dr.Value == false); + await Assert.That(sentMessages).DoesNotContain(dr => dr.Value == false); //This will create, then dispose the consumer (flushing offsets) Message[] messages = await ConsumeMessagesAsync(groupId, batchLimit: 5); //check we read the first 5 messages - Assert.Equal(5, messages.Length); + await Assert.That(messages.Length).IsEqualTo(5); for (int i = 0; i < 5; i++) { - Assert.Equal(sentMessageIds[i], messages[i].Id); + await Assert.That(messages[i].Id).IsEqualTo(sentMessageIds[i]); } //allow time for committed offsets to propagate in the broker @@ -96,10 +91,10 @@ await producerAsync.SendAsync( Message[] newMessages = await ConsumeMessagesAsync(groupId, batchLimit: 5); //check we read the next 5 messages - Assert.Equal(5, newMessages.Length); + await Assert.That(newMessages.Length).IsEqualTo(5); for (int i = 0; i < 5; i++) { - Assert.Equal(sentMessageIds[i + 5], newMessages[i].Id); + await Assert.That(newMessages[i].Id).IsEqualTo(sentMessageIds[i + 5]); } } @@ -144,7 +139,7 @@ async Task ConsumeMessageAsync(IAmAMessageConsumerAsync consumer) catch (ChannelFailureException cfx) { //Lots of reasons to be here as Kafka propagates a topic, or the test cluster is still initializing - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); await Task.Delay(1000); } } while (maxTries <= 10); @@ -174,3 +169,4 @@ public void Dispose() _producerRegistry.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_a_set_of_messages_is_sent_preserve_order_async.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_a_set_of_messages_is_sent_preserve_order_async.cs index 627d6f1429..51278ab065 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_a_set_of_messages_is_sent_preserve_order_async.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_a_set_of_messages_is_sent_preserve_order_async.cs @@ -1,17 +1,14 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Confluent.Kafka; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Proactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition +[Category("Kafka")] public class KafkaMessageConsumerPreservesOrderAsync : IDisposable { private readonly string _queueName = Guid.NewGuid().ToString(); @@ -19,11 +16,9 @@ public class KafkaMessageConsumerPreservesOrderAsync : IDisposable private readonly IAmAProducerRegistry _producerRegistry; private readonly string _partitionKey = Guid.NewGuid().ToString(); private readonly string _kafkaGroupId = Guid.NewGuid().ToString(); - private readonly ITestOutputHelper _output; - public KafkaMessageConsumerPreservesOrderAsync(ITestOutputHelper output) + public KafkaMessageConsumerPreservesOrderAsync() { - _output = output; _producerRegistry = new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration { @@ -45,8 +40,8 @@ public KafkaMessageConsumerPreservesOrderAsync(ITestOutputHelper output) ]).Create(); } - //[Fact(Skip = "As it has to wait for the messages to flush, only tends to run well in debug")] - [Fact] + //[Test, Skip("As it has to wait for the messages to flush, only tends to run well in debug")] + [Test] public async Task When_a_message_is_sent_keep_order() { //Let topic propagate in the broker @@ -77,22 +72,22 @@ public async Task When_a_message_is_sent_keep_order() var firstMessage = await ConsumeMessagesAsync(consumer); var message = firstMessage.First(); - Assert.Equal(msgId, message.Id); + await Assert.That(message.Id).IsEqualTo(msgId); await consumer.AcknowledgeAsync(message); var secondMessage = await ConsumeMessagesAsync(consumer); message = secondMessage.First(); - Assert.Equal(msgId2, message.Id); + await Assert.That(message.Id).IsEqualTo(msgId2); await consumer.AcknowledgeAsync(message); var thirdMessages = await ConsumeMessagesAsync(consumer); message = thirdMessages.First(); - Assert.Equal(msgId3, message.Id); + await Assert.That(message.Id).IsEqualTo(msgId3); await consumer.AcknowledgeAsync(message); var fourthMessage = await ConsumeMessagesAsync(consumer); message = fourthMessage.First(); - Assert.Equal(msgId4, message.Id); + await Assert.That(message.Id).IsEqualTo(msgId4); await consumer.AcknowledgeAsync(message); } finally @@ -142,7 +137,7 @@ private async Task> ConsumeMessagesAsync(IAmAMessageConsume catch (ChannelFailureException cfx) { //Lots of reasons to be here as Kafka propagates a topic, or the test cluster is still initializing - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); await Task.Delay(1000); } } while (maxTries <= 10); @@ -174,3 +169,4 @@ public void Dispose() _producerRegistry.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_consumer_assumes_topic_but_missing_async.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_consumer_assumes_topic_but_missing_async.cs index fe88e18bf3..78f2bc8405 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_consumer_assumes_topic_but_missing_async.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_consumer_assumes_topic_but_missing_async.cs @@ -1,13 +1,10 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Proactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition +[Category("Kafka")] public class KafkaProducerAssumeTestsAsync : IDisposable { private readonly string _queueName = Guid.NewGuid().ToString(); @@ -40,8 +37,8 @@ public KafkaProducerAssumeTestsAsync() //Watch your local Docker container when checking failures for this test, should be //KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false" - [Fact] - [Trait("Fragile", "CI")] + [Test] + [Property("Fragile", "CI")] public async Task When_a_consumer_declares_topics() { //Let topic propagate in the broker @@ -73,7 +70,7 @@ public async Task When_a_consumer_declares_topics() //allow callback to run await Task.Delay(3000); - Assert.False(messagePublished); + await Assert.That(messagePublished).IsFalse(); } public void Dispose() @@ -81,3 +78,4 @@ public void Dispose() _producerRegistry.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_consumer_declares_topic_async.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_consumer_declares_topic_async.cs index 742426cce7..27ddc4f7c9 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_consumer_declares_topic_async.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_consumer_declares_topic_async.cs @@ -1,27 +1,22 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Proactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition -public class KafkaConsumerDeclareTestsAsync : IAsyncDisposable, IDisposable +[Category("Kafka")] +public class KafkaConsumerDeclareTestsAsync : IAsyncDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly IAmAProducerRegistry _producerRegistry; private readonly IAmAMessageConsumerAsync _consumer; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaConsumerDeclareTestsAsync(ITestOutputHelper output) + public KafkaConsumerDeclareTestsAsync() { string groupId = Guid.NewGuid().ToString(); - _output = output; _producerRegistry = new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration { @@ -57,8 +52,8 @@ public KafkaConsumerDeclareTestsAsync(ITestOutputHelper output) } - //[Fact(Skip = "As it has to wait for the messages to flush, only tends to run well in debug")] - [Fact] + //[Test, Skip("As it has to wait for the messages to flush, only tends to run well in debug")] + [Test] public async Task When_a_consumer_declares_topics() { //Let topic propagate in the broker @@ -104,19 +99,20 @@ public async Task When_a_consumer_declares_topics() catch (ChannelFailureException cfx) { //Lots of reasons to be here as Kafka propagates a topic, or the test cluster is still initializing - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); - Task.Delay(1000).GetAwaiter().GetResult(); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + await Task.Delay(1000); } } while (maxTries <= 10); - Assert.Single(messages); - Assert.Equal(MessageType.MT_COMMAND, messages[0].Header.MessageType); - Assert.Equal(_partitionKey, messages[0].Header.PartitionKey); - Assert.Equal(message.Body.Value, messages[0].Body.Value); + await Assert.That(messages).HasSingleItem(); + await Assert.That(messages[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(messages[0].Header.PartitionKey).IsEqualTo(_partitionKey); + await Assert.That(messages[0].Body.Value).IsEqualTo(message.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { _producerRegistry?.Dispose(); ((IAmAMessageConsumerSync)_consumer).Dispose(); @@ -129,3 +125,4 @@ public async ValueTask DisposeAsync() } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_kafka_consumer_requeues_async_with_delay_should_use_producer.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_kafka_consumer_requeues_async_with_delay_should_use_producer.cs index e37de730a6..8614051090 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_kafka_consumer_requeues_async_with_delay_should_use_producer.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_kafka_consumer_requeues_async_with_delay_should_use_producer.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -26,8 +26,6 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Proactor; @@ -36,27 +34,25 @@ namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Proactor; /// via a lazily-created producer. Previously RequeueAsync was a no-op; now it delegates to the producer /// so that requeued messages are actually redelivered. /// -[Trait("Category", "Kafka")] -[Collection("Kafka")] -public class KafkaConsumerRequeueAsyncTests : IAsyncDisposable, IDisposable +[Category("Kafka")] +public class KafkaConsumerRequeueAsyncTests : IAsyncDisposable { - private readonly ITestOutputHelper _output; private readonly string _topic = Guid.NewGuid().ToString(); private readonly string _channelName = Guid.NewGuid().ToString(); - private readonly IAmAProducerRegistry _producerRegistry; - private readonly IAmAMessageConsumerAsync _consumer; - private readonly Message _message; + private IAmAProducerRegistry _producerRegistry; + private IAmAMessageConsumerAsync _consumer; + private Message _message; - public KafkaConsumerRequeueAsyncTests(ITestOutputHelper output) + [Before(Test)] + public async Task Setup() { string groupId = Guid.NewGuid().ToString(); - _output = output; _message = new Message( new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey(_topic), MessageType.MT_COMMAND), new MessageBody("test content for async requeue")); - _producerRegistry = new KafkaProducerRegistryFactory( + _producerRegistry = await new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration { Name = "Kafka Producer Requeue Async Test", @@ -72,7 +68,7 @@ public KafkaConsumerRequeueAsyncTests(ITestOutputHelper output) RequestTimeoutMs = 2000, MakeChannels = OnMissingChannel.Create } - ]).CreateAsync().Result; + ]).CreateAsync(); _consumer = new KafkaMessageConsumerFactory( new KafkaMessagingGatewayConfiguration @@ -91,7 +87,7 @@ public KafkaConsumerRequeueAsyncTests(ITestOutputHelper output) )); } - [Fact] + [Test] public async Task When_requeuing_async_should_publish_message_via_producer() { // Arrange - send a message and receive it @@ -100,19 +96,19 @@ public async Task When_requeuing_async_should_publish_message_via_producer() ((KafkaMessageProducer)producer).Flush(); var received = await GetMessageAsync(); - Assert.NotEqual(MessageType.MT_NONE, received.Header.MessageType); - _output.WriteLine($"Received body length: {received.Body.Bytes.Length}, value: '{received.Body.Value}'"); + await Assert.That(received.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + Console.WriteLine($"Received body length: {received.Body.Bytes.Length}, value: '{received.Body.Value}'"); // Act - requeue the message asynchronously (no delay, so producer sends immediately) var result = await _consumer.RequeueAsync(received); // Assert - requeue should return true - Assert.True(result, "RequeueAsync should succeed"); + await Assert.That(result).IsTrue(); // Assert - message should be available again on the topic (published via producer) var requeued = await GetMessageAsync(); - _output.WriteLine($"Requeued body length: {requeued.Body.Bytes.Length}, value: '{requeued.Body.Value}'"); - Assert.Equal(_message.Body.Value, requeued.Body.Value); + Console.WriteLine($"Requeued body length: {requeued.Body.Bytes.Length}, value: '{requeued.Body.Value}'"); + await Assert.That(requeued.Body.Value).IsEqualTo(_message.Body.Value); } private async Task GetMessageAsync() @@ -134,7 +130,7 @@ private async Task GetMessageAsync() } catch (ChannelFailureException cfx) { - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); await Task.Delay(1000); } } while (maxTries <= 10); @@ -145,7 +141,8 @@ private async Task GetMessageAsync() return messages[0]; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { _producerRegistry?.Dispose(); ((IAmAMessageConsumerSync)_consumer)?.Dispose(); @@ -157,3 +154,4 @@ public async ValueTask DisposeAsync() await _consumer.DisposeAsync(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_nacking_a_message_it_should_be_redelivered_async.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_nacking_a_message_it_should_be_redelivered_async.cs index 81ba9eb877..9ce7b47102 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_nacking_a_message_it_should_be_redelivered_async.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_nacking_a_message_it_should_be_redelivered_async.cs @@ -3,24 +3,19 @@ using Confluent.Kafka; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Proactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition +[Category("Kafka")] public class KafkaMessageConsumerNackRedeliveryAsync : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly IAmAProducerRegistry _producerRegistry; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaMessageConsumerNackRedeliveryAsync(ITestOutputHelper output) + public KafkaMessageConsumerNackRedeliveryAsync() { - _output = output; _producerRegistry = new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration { @@ -39,7 +34,7 @@ public KafkaMessageConsumerNackRedeliveryAsync(ITestOutputHelper output) ]).Create(); } - [Fact] + [Test] public async Task When_nacking_a_message_async_it_should_be_redelivered() { // let topic propagate in the broker @@ -64,18 +59,18 @@ await producer.SendAsync( //Act - receive the message, nack it, then receive again var firstReceive = await ReceiveMessageAsync(consumer); - Assert.Equal(sentMessageId, firstReceive.Id); + await Assert.That(firstReceive.Id).IsEqualTo(sentMessageId); await consumer.NackAsync(firstReceive); var secondReceive = await ReceiveMessageAsync(consumer); //Assert - the same message should be redelivered - Assert.Equal(sentMessageId, secondReceive.Id); - Assert.Equal(sentBody, secondReceive.Body.Value); + await Assert.That(secondReceive.Id).IsEqualTo(sentMessageId); + await Assert.That(secondReceive.Body.Value).IsEqualTo(sentBody); } - [Fact] + [Test] public async Task When_acking_later_message_async_it_should_not_skip_nacked_message() { // let topic propagate in the broker @@ -105,7 +100,7 @@ await producer.SendAsync( //Act - receive message 1, nack it; receive message 1 again (redelivered), then ack it var firstReceive = await ReceiveMessageAsync(consumer); - Assert.Equal(firstMessageId, firstReceive.Id); + await Assert.That(firstReceive.Id).IsEqualTo(firstMessageId); await consumer.NackAsync(firstReceive); @@ -113,14 +108,14 @@ await producer.SendAsync( var redelivered = await ReceiveMessageAsync(consumer); //Assert - the nacked message is redelivered, not skipped by the second message's existence - Assert.Equal(firstMessageId, redelivered.Id); + await Assert.That(redelivered.Id).IsEqualTo(firstMessageId); // Now ack the redelivered message and confirm we get the second message await consumer.AcknowledgeAsync(redelivered); var secondReceive = await ReceiveMessageAsync(consumer); - Assert.NotEqual(MessageType.MT_NONE, secondReceive.Header.MessageType); - Assert.Equal(secondMessageId, secondReceive.Id); + await Assert.That(secondReceive.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(secondReceive.Id).IsEqualTo(secondMessageId); } private async Task ReceiveMessageAsync(IAmAMessageConsumerAsync consumer) @@ -141,7 +136,7 @@ private async Task ReceiveMessageAsync(IAmAMessageConsumerAsync consume } catch (ChannelFailureException cfx) { - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); await Task.Delay(1000); } } while (maxTries <= 10); @@ -176,3 +171,4 @@ public void Dispose() _producerRegistry?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_offsets_awaiting_next_acknowledge_sweep_them_async.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_offsets_awaiting_next_acknowledge_sweep_them_async.cs index 7a3ef34228..35229a26aa 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_offsets_awaiting_next_acknowledge_sweep_them_async.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_offsets_awaiting_next_acknowledge_sweep_them_async.cs @@ -1,29 +1,25 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Proactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition -public class KafkaMessageConsumerSweepOffsetsAsync : IAsyncDisposable, IDisposable +[Category("Kafka")] +public class KafkaMessageConsumerSweepOffsetsAsync : IAsyncDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); - private readonly IAmAProducerRegistry _producerRegistry; - private readonly KafkaMessageConsumer _consumer; + private IAmAProducerRegistry _producerRegistry; + private KafkaMessageConsumer _consumer; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaMessageConsumerSweepOffsetsAsync(ITestOutputHelper output) + [Before(Test)] + public async Task Setup() { string groupId = Guid.NewGuid().ToString(); - _output = output; - _producerRegistry = new KafkaProducerRegistryFactory( + _producerRegistry = await new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration { Name = "Kafka Producer Send Test", @@ -41,7 +37,7 @@ public KafkaMessageConsumerSweepOffsetsAsync(ITestOutputHelper output) RequestTimeoutMs = 2000, MakeChannels = OnMissingChannel.Create } - ]).CreateAsync().Result; + ]).CreateAsync(); _consumer = (KafkaMessageConsumer) new KafkaMessageConsumerFactory( new KafkaMessagingGatewayConfiguration @@ -59,8 +55,8 @@ public KafkaMessageConsumerSweepOffsetsAsync(ITestOutputHelper output) numOfPartitions: 1, replicationFactor: 1, makeChannels: OnMissingChannel.Create)); } - //[Fact(Skip = "As it has to wait for the messages to flush, only tends to run well in debug")] - [Fact] + //[Test, Skip("As it has to wait for the messages to flush, only tends to run well in debug")] + [Test] public async Task When_a_message_is_acknowledged_but_no_batch_sent_sweep_offsets() { //allow time for topic to propogate @@ -93,7 +89,7 @@ await producerAsync.SendAsync(new Message( consumedMessages.Add(await ReadMessageAsync()); } - Assert.Equal(9, consumedMessages.Count); + await Assert.That(consumedMessages.Count).IsEqualTo(9); //Let time elapse with no activity await Task.Delay(10000); @@ -110,7 +106,7 @@ await producerAsync.SendAsync(new Message( } //Sweeper will commit these - Assert.Equal(0,_consumer.StoredOffsets()); + await Assert.That(_consumer.StoredOffsets()).IsEqualTo(0); _consumer.Close(); return; @@ -140,7 +136,7 @@ async Task ReadMessageAsync() catch (ChannelFailureException cfx) { //Lots of reasons to be here as Kafka propagates a topic, or the test cluster is still initializing - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); await Task.Delay(1000); } } while (maxTries <= 10); @@ -149,10 +145,11 @@ async Task ReadMessageAsync() } } - public void Dispose() + [After(Test)] + public async Task Cleanup() { _producerRegistry?.Dispose(); - _consumer.Dispose(); + await _consumer.DisposeAsync(); } public async ValueTask DisposeAsync() @@ -161,3 +158,4 @@ public async ValueTask DisposeAsync() await _consumer.DisposeAsync(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_posting_a_message_async.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_posting_a_message_async.cs index 1491f61235..34645fec50 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_posting_a_message_async.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_posting_a_message_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Net.Mime; using System.Text.Json; @@ -6,27 +6,23 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Proactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition -public class KafkaMessageProducerSendTestsAsync : IAsyncDisposable, IDisposable +[Category("Kafka")] +public class KafkaMessageProducerSendTestsAsync : IAsyncDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); - private readonly IAmAProducerRegistry _producerRegistry; - private readonly IAmAMessageConsumerAsync _consumer; + private IAmAProducerRegistry _producerRegistry; + private IAmAMessageConsumerAsync _consumer; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaMessageProducerSendTestsAsync(ITestOutputHelper output) + [Before(Test)] + public async Task Setup() { string groupId = Guid.NewGuid().ToString(); - _output = output; - _producerRegistry = new KafkaProducerRegistryFactory( + _producerRegistry = await new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration { Name = "Kafka Producer Send Test", BootStrapServers = new[] { "localhost:9092" } @@ -43,7 +39,7 @@ public KafkaMessageProducerSendTestsAsync(ITestOutputHelper output) RequestTimeoutMs = 2000, MakeChannels = OnMissingChannel.Create } - ]).CreateAsync().Result; + ]).CreateAsync(); _consumer = new KafkaMessageConsumerFactory( new KafkaMessagingGatewayConfiguration @@ -59,8 +55,8 @@ public KafkaMessageProducerSendTestsAsync(ITestOutputHelper output) ); } - //[Fact(Skip = "As it has to wait for the messages to flush, only tends to run well in debug")] - [Fact] + //[Test, Skip("As it has to wait for the messages to flush, only tends to run well in debug")] + [Test] public async Task When_posting_a_message() { //Let topic propagate in the broker @@ -102,19 +98,19 @@ public async Task When_posting_a_message() //allow the message publication callback to run await Task.Delay(10000); - Assert.True(messagePublished); + await Assert.That(messagePublished).IsTrue(); var receivedMessage = await GetMessageAsync(); var receivedCommand = JsonSerializer.Deserialize(receivedMessage.Body.Value, JsonSerialisationOptions.Options); - Assert.Equal(MessageType.MT_COMMAND, receivedMessage.Header.MessageType); - Assert.Equal(_partitionKey, receivedMessage.Header.PartitionKey); - Assert.Equal(message.Body.Bytes, receivedMessage.Body.Bytes); - Assert.Equal(message.Body.Value, receivedMessage.Body.Value); - Assert.Equal(message.Header.TimeStamp, receivedMessage.Header.TimeStamp, TimeSpan.FromSeconds(5)); - Assert.Equal(command.Id, receivedCommand.Id); - Assert.Equal(command.Value, receivedCommand.Value); + await Assert.That(receivedMessage.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(receivedMessage.Header.PartitionKey).IsEqualTo(_partitionKey); + await Assert.That(receivedMessage.Body.Bytes).IsEqualTo(message.Body.Bytes); + await Assert.That(receivedMessage.Body.Value).IsEqualTo(message.Body.Value); + await Assert.That(receivedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(5)); + await Assert.That(receivedCommand.Id).IsEqualTo(command.Id); + await Assert.That(receivedCommand.Value).IsEqualTo(command.Value); } private async Task GetMessageAsync() @@ -142,7 +138,7 @@ private async Task GetMessageAsync() catch (ChannelFailureException cfx) { //Lots of reasons to be here as Kafka propagates a topic, or the test cluster is still initializing - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); await Task.Delay(1000); } } while (maxTries <= 10); @@ -153,7 +149,8 @@ private async Task GetMessageAsync() return messages[0]; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { _producerRegistry?.Dispose(); ((IAmAMessageConsumerSync)_consumer)?.Dispose(); @@ -165,3 +162,4 @@ public async ValueTask DisposeAsync() await _consumer.DisposeAsync(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_posting_a_message_with_header_bytes_async.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_posting_a_message_with_header_bytes_async.cs index 0b73658c15..c48923e92c 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_posting_a_message_with_header_bytes_async.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_posting_a_message_with_header_bytes_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Net; using System.Net.Mime; @@ -8,30 +8,26 @@ using Confluent.SchemaRegistry.Serdes; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Proactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition -public class KafkaMessageProducerHeaderBytesSendTestsAsync : IAsyncDisposable, IDisposable +[Category("Kafka")] +public class KafkaMessageProducerHeaderBytesSendTestsAsync : IAsyncDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); - private readonly IAmAProducerRegistry _producerRegistry; - private readonly IAmAMessageConsumerAsync _consumer; + private IAmAProducerRegistry _producerRegistry; + private IAmAMessageConsumerAsync _consumer; private readonly string _partitionKey = Guid.NewGuid().ToString(); - private readonly IAsyncSerializer _serializer; - private readonly IAsyncDeserializer _deserializer; - private readonly SerializationContext _serializationContext; + private IAsyncSerializer _serializer; + private IAsyncDeserializer _deserializer; + private SerializationContext _serializationContext; - public KafkaMessageProducerHeaderBytesSendTestsAsync(ITestOutputHelper output) + [Before(Test)] + public async Task Setup() { string groupId = Guid.NewGuid().ToString(); - _output = output; - _producerRegistry = new KafkaProducerRegistryFactory( + _producerRegistry = await new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration { Name = "Kafka Producer Send Test", @@ -49,7 +45,7 @@ public KafkaMessageProducerHeaderBytesSendTestsAsync(ITestOutputHelper output) RequestTimeoutMs = 2000, MakeChannels = OnMissingChannel.Create } - ]).CreateAsync().Result; + ]).CreateAsync(); _consumer = new KafkaMessageConsumerFactory( new KafkaMessagingGatewayConfiguration @@ -73,8 +69,8 @@ public KafkaMessageProducerHeaderBytesSendTestsAsync(ITestOutputHelper output) _serializationContext = new SerializationContext(MessageComponentType.Value, _topic); } - //[Fact(Skip = "As it has to wait for the messages to flush, only tends to run well in debug")] - [Fact] + //[Test, Skip("As it has to wait for the messages to flush, only tends to run well in debug")] + [Test] public async Task When_posting_a_message_via_the_messaging_gateway() { //Let topic propagate in the broker @@ -112,19 +108,19 @@ public async Task When_posting_a_message_via_the_messaging_gateway() var received = await GetMessageAsync(); - Assert.True(received.Body.Bytes.Length > 5); + await Assert.That(received.Body.Bytes.Length > 5).IsTrue(); var receivedSchemaId = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(received.Body.Bytes.Skip(1).Take(4).ToArray())); var receivedCommand =await _deserializer.DeserializeAsync(received.Body.Bytes, received.Body.Bytes is null, _serializationContext); //assert - Assert.Equal(MessageType.MT_COMMAND, received.Header.MessageType); - Assert.Equal(_partitionKey, received.Header.PartitionKey); - Assert.Equal(body, received.Body.Bytes); - Assert.Equal(schemaId, receivedSchemaId); - Assert.Equal(myCommand.Id, receivedCommand.Id); - Assert.Equal(myCommand.Value, receivedCommand.Value); + await Assert.That(received.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(received.Header.PartitionKey).IsEqualTo(_partitionKey); + await Assert.That(received.Body.Bytes).IsEqualTo(body); + await Assert.That(receivedSchemaId).IsEqualTo(schemaId); + await Assert.That(receivedCommand.Id).IsEqualTo(myCommand.Id); + await Assert.That(receivedCommand.Value).IsEqualTo(myCommand.Value); } private async Task GetMessageAsync() @@ -151,7 +147,7 @@ private async Task GetMessageAsync() catch (ChannelFailureException cfx) { //Lots of reasons to be here as Kafka propagates a topic, or the test cluster is still initializing - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); await Task.Delay(1000); } @@ -163,7 +159,8 @@ private async Task GetMessageAsync() return messages[0]; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { _producerRegistry?.Dispose(); ((IAmAMessageConsumerSync)_consumer)?.Dispose(); @@ -175,3 +172,4 @@ public async ValueTask DisposeAsync() await _consumer.DisposeAsync(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_recieving_a_message_without_partition_key_header_async.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_recieving_a_message_without_partition_key_header_async.cs index 530a1bc340..aa86a02784 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_recieving_a_message_without_partition_key_header_async.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_recieving_a_message_without_partition_key_header_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text; using System.Text.Json; using System.Threading.Tasks; @@ -6,26 +6,21 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; using Acks = Confluent.Kafka.Acks; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Proactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition +[Category("Kafka")] public class KafkaMessageProducerMissingHeaderTestsAsync : IAsyncDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly IAmAMessageConsumerAsync _consumer; private readonly IProducer _producer; - public KafkaMessageProducerMissingHeaderTestsAsync(ITestOutputHelper output) + public KafkaMessageProducerMissingHeaderTestsAsync() { string groupId = Guid.NewGuid().ToString(); - _output = output; var clientConfig = new ClientConfig { @@ -52,7 +47,7 @@ public KafkaMessageProducerMissingHeaderTestsAsync(ITestOutputHelper output) _producer = new ProducerBuilder(producerConfig) .SetErrorHandler((_, error) => { - output.WriteLine($"Kafka producer failed with Code: {error.Code}, Reason: { error.Reason}, Fatal: {error.IsFatal}", error.Code, error.Reason, error.IsFatal); + Console.WriteLine($"Kafka producer failed with Code: {error.Code}, Reason: { error.Reason}, Fatal: {error.IsFatal}"); }) .Build(); @@ -69,8 +64,8 @@ public KafkaMessageProducerMissingHeaderTestsAsync(ITestOutputHelper output) numOfPartitions: 1, replicationFactor: 1, makeChannels: OnMissingChannel.Create)); } - //[Fact(Skip = "As it has to wait for the messages to flush, only tends to run well in debug")] - [Fact] + //[Test, Skip("As it has to wait for the messages to flush, only tends to run well in debug")] + [Test] public async Task When_recieving_a_message_without_partition_key_header() { await Task.Delay(500); //Let topic propagate in the broker @@ -97,8 +92,8 @@ public async Task When_recieving_a_message_without_partition_key_header() var receivedMessage = await GetMessageAsync(); //Where we lack a partition key header, assume non-Brighter header and set to message key - Assert.Equal(kafkaMessage.Key, receivedMessage.Header.PartitionKey); - Assert.Equal(value, receivedMessage.Body.Bytes); + await Assert.That(receivedMessage.Header.PartitionKey).IsEqualTo(kafkaMessage.Key); + await Assert.That(receivedMessage.Body.Bytes).IsEqualTo(value); } private async Task GetMessageAsync() @@ -125,7 +120,7 @@ private async Task GetMessageAsync() catch (ChannelFailureException cfx) { //Lots of reasons to be here as Kafka propagates a topic, or the test cluster is still initializing - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); await Task.Delay(1000); } } while (maxTries <= 10); @@ -136,7 +131,8 @@ private async Task GetMessageAsync() return messages[0]; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { _producer?.Dispose(); ((IAmAMessageConsumerSync)_consumer)?.Dispose(); @@ -148,3 +144,4 @@ public async ValueTask DisposeAsync() await _consumer.DisposeAsync(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs index cf28488f77..25a4382572 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs @@ -26,25 +26,20 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Proactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] +[Category("Kafka")] public class KafkaMessageConsumerDLQAsyncTests : IAsyncDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly string _dlqTopic; private readonly KafkaMessageProducer _producer; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaMessageConsumerDLQAsyncTests(ITestOutputHelper output) + public KafkaMessageConsumerDLQAsyncTests() { - _output = output; _dlqTopic = $"{_topic}.dlq"; // Create producer directly for the data topic @@ -69,7 +64,7 @@ public KafkaMessageConsumerDLQAsyncTests(ITestOutputHelper output) _producer.Init(); } - [Fact] + [Test] public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq_async() { //Arrange - let topics propagate in the broker @@ -96,20 +91,20 @@ public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq_ await using (var consumer = CreateConsumer(groupId, dlqRoutingKey)) { receivedMessage = await ConsumeMessageAsync(consumer); - Assert.Equal(messageId, receivedMessage.Id); + await Assert.That(receivedMessage.Id).IsEqualTo(messageId); - _output.WriteLine($"About to reject message {messageId} with DeliveryError"); + Console.WriteLine($"About to reject message {messageId} with DeliveryError"); //reject with DeliveryError reason await consumer.RejectAsync(receivedMessage, new MessageRejectionReason(RejectionReason.DeliveryError, "Test delivery error")); - _output.WriteLine($"Message {messageId} rejected, waiting for DLQ propagation"); + Console.WriteLine($"Message {messageId} rejected, waiting for DLQ propagation"); //yield to allow DLQ message to be produced and topic to be created await Task.Delay(TimeSpan.FromMilliseconds(3000)); } - _output.WriteLine("Creating DLQ consumer"); + Console.WriteLine("Creating DLQ consumer"); //yield to allow DLQ topic to propagate await Task.Delay(TimeSpan.FromMilliseconds(1000)); @@ -117,17 +112,17 @@ public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq_ //Assert - verify message appears on DLQ await using (var dlqConsumer = CreateDLQConsumer(groupId)) { - _output.WriteLine("Attempting to consume from DLQ"); + Console.WriteLine("Attempting to consume from DLQ"); var dlqMessage = await ConsumeMessageAsync(dlqConsumer); - Assert.NotNull(dlqMessage); - Assert.Equal(MessageType.MT_COMMAND, dlqMessage.Header.MessageType); - Assert.Equal(receivedMessage.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage).IsNotNull(); + await Assert.That(dlqMessage.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(receivedMessage.Body.Value); //verify rejection metadata was added - Assert.True(dlqMessage.Header.Bag.ContainsKey("OriginalTopic")); - Assert.Equal(_topic, dlqMessage.Header.Bag["OriginalTopic"]); - Assert.True(dlqMessage.Header.Bag.ContainsKey("RejectionReason")); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("OriginalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["OriginalTopic"]).IsEqualTo(_topic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("RejectionReason")).IsTrue(); } } @@ -193,7 +188,7 @@ private async Task ConsumeMessageAsync(IAmAMessageConsumerAsync consume } catch (ChannelFailureException cfx) { - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); await Task.Delay(1000); } } while (maxTries <= 10); @@ -203,7 +198,12 @@ private async Task ConsumeMessageAsync(IAmAMessageConsumerAsync consume public async ValueTask DisposeAsync() { - _producer?.Dispose(); + if(_producer != null) + { + await _producer.DisposeAsync(); + } + await Task.CompletedTask; } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log_async.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log_async.cs index 929ac270e5..0732a8533a 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log_async.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log_async.cs @@ -26,24 +26,19 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Proactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] +[Category("Kafka")] public class KafkaMessageConsumerNoChannelsAsyncTests : IAsyncDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly KafkaMessageProducer _producer; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaMessageConsumerNoChannelsAsyncTests(ITestOutputHelper output) + public KafkaMessageConsumerNoChannelsAsyncTests() { - _output = output; // Create producer directly for the data topic var publication = new KafkaPublication @@ -67,7 +62,7 @@ public KafkaMessageConsumerNoChannelsAsyncTests(ITestOutputHelper output) _producer.Init(); } - [Fact] + [Test] public async Task When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log_async() { //Arrange - let topics propagate in the broker @@ -99,23 +94,23 @@ public async Task When_rejecting_message_with_no_channels_configured_should_ackn await using (var consumer = CreateConsumerWithNoChannels(groupId)) { var receivedMessage1 = await ConsumeMessageAsync(consumer); - Assert.Equal(messageId1, receivedMessage1.Id); + await Assert.That(receivedMessage1.Id).IsEqualTo(messageId1); - _output.WriteLine($"About to reject message {messageId1} with no channels configured"); + Console.WriteLine($"About to reject message {messageId1} with no channels configured"); //reject with no channels configured - should acknowledge and log warning var rejected = await consumer.RejectAsync(receivedMessage1, new MessageRejectionReason(RejectionReason.DeliveryError, "Test rejection with no channels async")); - _output.WriteLine($"Message {messageId1} rejected, attempting to consume next message"); + Console.WriteLine($"Message {messageId1} rejected, attempting to consume next message"); //Assert - verify rejection returned true and we can consume the next message - Assert.True(rejected, "RejectAsync should return true even with no channels"); + await Assert.That(rejected).IsTrue(); //verify we can consume the next message (proving first was acknowledged) var receivedMessage2 = await ConsumeMessageAsync(consumer); - Assert.Equal(messageId2, receivedMessage2.Id); + await Assert.That(receivedMessage2.Id).IsEqualTo(messageId2); - _output.WriteLine($"Successfully consumed message {messageId2} after rejection"); + Console.WriteLine($"Successfully consumed message {messageId2} after rejection"); } //Additional verification: ensure no messages were sent to non-existent DLQ @@ -163,7 +158,7 @@ private async Task ConsumeMessageAsync(IAmAMessageConsumerAsync consume } catch (ChannelFailureException cfx) { - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); await Task.Delay(1000); } } while (maxTries <= 10); @@ -173,8 +168,13 @@ private async Task ConsumeMessageAsync(IAmAMessageConsumerAsync consume public async ValueTask DisposeAsync() { - _producer?.Dispose(); + if(_producer != null) + { + await _producer.DisposeAsync(); + } + await Task.CompletedTask; } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq_async.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq_async.cs index e5a00f14f5..e991de03f6 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq_async.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq_async.cs @@ -26,25 +26,20 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Proactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] +[Category("Kafka")] public class KafkaMessageConsumerInvalidMessageFallbackAsyncTests : IAsyncDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly string _dlqTopic; private readonly KafkaMessageProducer _producer; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaMessageConsumerInvalidMessageFallbackAsyncTests(ITestOutputHelper output) + public KafkaMessageConsumerInvalidMessageFallbackAsyncTests() { - _output = output; _dlqTopic = $"{_topic}.dlq"; // Create producer directly for the data topic @@ -69,7 +64,7 @@ public KafkaMessageConsumerInvalidMessageFallbackAsyncTests(ITestOutputHelper ou _producer.Init(); } - [Fact] + [Test] public async Task When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq_async() { //Arrange - let topics propagate in the broker @@ -96,20 +91,20 @@ public async Task When_rejecting_message_with_unacceptable_and_no_invalid_channe await using (var consumer = CreateConsumerWithDlqOnly(groupId, dlqRoutingKey)) { receivedMessage = await ConsumeMessageAsync(consumer); - Assert.Equal(messageId, receivedMessage.Id); + await Assert.That(receivedMessage.Id).IsEqualTo(messageId); - _output.WriteLine($"About to reject message {messageId} with Unacceptable reason (no invalid channel configured)"); + Console.WriteLine($"About to reject message {messageId} with Unacceptable reason (no invalid channel configured)"); //reject with Unacceptable reason - should fall back to DLQ since no invalid channel configured await consumer.RejectAsync(receivedMessage, new MessageRejectionReason(RejectionReason.Unacceptable, "Test unacceptable message fallback async")); - _output.WriteLine($"Message {messageId} rejected, waiting for DLQ propagation"); + Console.WriteLine($"Message {messageId} rejected, waiting for DLQ propagation"); //yield to allow DLQ message to be produced and topic to be created await Task.Delay(TimeSpan.FromMilliseconds(3000)); } - _output.WriteLine("Creating DLQ consumer"); + Console.WriteLine("Creating DLQ consumer"); //yield to allow DLQ topic to propagate await Task.Delay(TimeSpan.FromMilliseconds(1000)); @@ -117,18 +112,18 @@ public async Task When_rejecting_message_with_unacceptable_and_no_invalid_channe //Assert - verify message appears on DLQ (not invalid message channel) await using (var dlqConsumer = CreateDLQConsumer(groupId)) { - _output.WriteLine("Attempting to consume from DLQ"); + Console.WriteLine("Attempting to consume from DLQ"); var dlqMessage = await ConsumeMessageAsync(dlqConsumer); - Assert.NotNull(dlqMessage); - Assert.Equal(MessageType.MT_COMMAND, dlqMessage.Header.MessageType); - Assert.Equal(receivedMessage.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage).IsNotNull(); + await Assert.That(dlqMessage.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(receivedMessage.Body.Value); //verify rejection metadata was added - Assert.True(dlqMessage.Header.Bag.ContainsKey("OriginalTopic")); - Assert.Equal(_topic, dlqMessage.Header.Bag["OriginalTopic"]); - Assert.True(dlqMessage.Header.Bag.ContainsKey("RejectionReason")); - Assert.Equal("Unacceptable", dlqMessage.Header.Bag["RejectionReason"]); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("OriginalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["OriginalTopic"]).IsEqualTo(_topic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("RejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["RejectionReason"]).IsEqualTo("Unacceptable"); } } @@ -195,7 +190,7 @@ private async Task ConsumeMessageAsync(IAmAMessageConsumerAsync consume } catch (ChannelFailureException cfx) { - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); await Task.Delay(1000); } } while (maxTries <= 10); @@ -205,7 +200,12 @@ private async Task ConsumeMessageAsync(IAmAMessageConsumerAsync consume public async ValueTask DisposeAsync() { - _producer?.Dispose(); + if(_producer != null) + { + await _producer.DisposeAsync(); + } + await Task.CompletedTask; } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel_async.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel_async.cs index 19bfc78945..a5464453b8 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel_async.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel_async.cs @@ -26,25 +26,20 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Proactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] +[Category("Kafka")] public class KafkaMessageConsumerInvalidMessageAsyncTests : IAsyncDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly string _invalidMessageTopic; private readonly KafkaMessageProducer _producer; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaMessageConsumerInvalidMessageAsyncTests(ITestOutputHelper output) + public KafkaMessageConsumerInvalidMessageAsyncTests() { - _output = output; _invalidMessageTopic = $"{_topic}.invalid"; // Create producer directly for the data topic @@ -69,7 +64,7 @@ public KafkaMessageConsumerInvalidMessageAsyncTests(ITestOutputHelper output) _producer.Init(); } - [Fact] + [Test] public async Task When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel_async() { //Arrange - let topics propagate in the broker @@ -96,20 +91,20 @@ public async Task When_rejecting_message_with_unacceptable_reason_should_send_to await using (var consumer = CreateConsumer(groupId, invalidMessageRoutingKey)) { receivedMessage = await ConsumeMessageAsync(consumer); - Assert.Equal(messageId, receivedMessage.Id); + await Assert.That(receivedMessage.Id).IsEqualTo(messageId); - _output.WriteLine($"About to reject message {messageId} with Unacceptable reason"); + Console.WriteLine($"About to reject message {messageId} with Unacceptable reason"); //reject with Unacceptable reason await consumer.RejectAsync(receivedMessage, new MessageRejectionReason(RejectionReason.Unacceptable, "Test unacceptable message async")); - _output.WriteLine($"Message {messageId} rejected, waiting for invalid message channel propagation"); + Console.WriteLine($"Message {messageId} rejected, waiting for invalid message channel propagation"); //yield to allow invalid message to be produced and topic to be created await Task.Delay(TimeSpan.FromMilliseconds(3000)); } - _output.WriteLine("Creating invalid message channel consumer"); + Console.WriteLine("Creating invalid message channel consumer"); //yield to allow invalid message topic to propagate await Task.Delay(TimeSpan.FromMilliseconds(1000)); @@ -117,18 +112,18 @@ public async Task When_rejecting_message_with_unacceptable_reason_should_send_to //Assert - verify message appears on invalid message channel await using (var invalidMessageConsumer = CreateInvalidMessageConsumer(groupId)) { - _output.WriteLine("Attempting to consume from invalid message channel"); + Console.WriteLine("Attempting to consume from invalid message channel"); var invalidMessage = await ConsumeMessageAsync(invalidMessageConsumer); - Assert.NotNull(invalidMessage); - Assert.Equal(MessageType.MT_COMMAND, invalidMessage.Header.MessageType); - Assert.Equal(receivedMessage.Body.Value, invalidMessage.Body.Value); + await Assert.That(invalidMessage).IsNotNull(); + await Assert.That(invalidMessage.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(invalidMessage.Body.Value).IsEqualTo(receivedMessage.Body.Value); //verify rejection metadata was added - Assert.True(invalidMessage.Header.Bag.ContainsKey("OriginalTopic")); - Assert.Equal(_topic, invalidMessage.Header.Bag["OriginalTopic"]); - Assert.True(invalidMessage.Header.Bag.ContainsKey("RejectionReason")); - Assert.Equal("Unacceptable", invalidMessage.Header.Bag["RejectionReason"]); + await Assert.That(invalidMessage.Header.Bag.ContainsKey("OriginalTopic")).IsTrue(); + await Assert.That(invalidMessage.Header.Bag["OriginalTopic"]).IsEqualTo(_topic); + await Assert.That(invalidMessage.Header.Bag.ContainsKey("RejectionReason")).IsTrue(); + await Assert.That(invalidMessage.Header.Bag["RejectionReason"]).IsEqualTo("Unacceptable"); } } @@ -194,7 +189,7 @@ private async Task ConsumeMessageAsync(IAmAMessageConsumerAsync consume } catch (ChannelFailureException cfx) { - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); await Task.Delay(1000); } } while (maxTries <= 10); @@ -204,7 +199,12 @@ private async Task ConsumeMessageAsync(IAmAMessageConsumerAsync consume public async ValueTask DisposeAsync() { - _producer?.Dispose(); + if(_producer != null) + { + await _producer.DisposeAsync(); + } + await Task.CompletedTask; } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_rejecting_message_with_unknown_reason_should_send_to_dlq_async.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_rejecting_message_with_unknown_reason_should_send_to_dlq_async.cs index 78c04ecec7..5df2320497 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_rejecting_message_with_unknown_reason_should_send_to_dlq_async.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_rejecting_message_with_unknown_reason_should_send_to_dlq_async.cs @@ -26,25 +26,20 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Proactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] +[Category("Kafka")] public class KafkaMessageConsumerUnknownReasonAsyncTests : IAsyncDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly string _dlqTopic; private readonly KafkaMessageProducer _producer; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaMessageConsumerUnknownReasonAsyncTests(ITestOutputHelper output) + public KafkaMessageConsumerUnknownReasonAsyncTests() { - _output = output; _dlqTopic = $"{_topic}.dlq"; // Create producer directly for the data topic @@ -69,7 +64,7 @@ public KafkaMessageConsumerUnknownReasonAsyncTests(ITestOutputHelper output) _producer.Init(); } - [Fact] + [Test] public async Task When_rejecting_message_with_unknown_reason_should_send_to_dlq_async() { //Arrange - let topics propagate in the broker @@ -96,20 +91,20 @@ public async Task When_rejecting_message_with_unknown_reason_should_send_to_dlq_ await using (var consumer = CreateConsumerAsync(groupId, dlqRoutingKey)) { receivedMessage = await ConsumeMessageAsync(consumer); - Assert.Equal(messageId, receivedMessage.Id); + await Assert.That(receivedMessage.Id).IsEqualTo(messageId); - _output.WriteLine($"About to reject message {messageId} with unknown reason (None)"); + Console.WriteLine($"About to reject message {messageId} with unknown reason (None)"); //reject with None reason - should route to DLQ via default case await consumer.RejectAsync(receivedMessage, new MessageRejectionReason(RejectionReason.None, "Test unknown rejection reason async")); - _output.WriteLine($"Message {messageId} rejected, waiting for DLQ propagation"); + Console.WriteLine($"Message {messageId} rejected, waiting for DLQ propagation"); //yield to allow DLQ message to be produced and topic to be created await Task.Delay(TimeSpan.FromMilliseconds(3000)); } - _output.WriteLine("Creating DLQ consumer"); + Console.WriteLine("Creating DLQ consumer"); //yield to allow DLQ topic to propagate await Task.Delay(TimeSpan.FromMilliseconds(1000)); @@ -117,18 +112,18 @@ public async Task When_rejecting_message_with_unknown_reason_should_send_to_dlq_ //Assert - verify message appears on DLQ (default routing behavior) await using (var dlqConsumer = CreateDLQConsumerAsync(groupId)) { - _output.WriteLine("Attempting to consume from DLQ"); + Console.WriteLine("Attempting to consume from DLQ"); var dlqMessage = await ConsumeMessageAsync(dlqConsumer); - Assert.NotNull(dlqMessage); - Assert.Equal(MessageType.MT_COMMAND, dlqMessage.Header.MessageType); - Assert.Equal(receivedMessage.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage).IsNotNull(); + await Assert.That(dlqMessage.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(receivedMessage.Body.Value); //verify rejection metadata was added - Assert.True(dlqMessage.Header.Bag.ContainsKey("OriginalTopic")); - Assert.Equal(_topic, dlqMessage.Header.Bag["OriginalTopic"]); - Assert.True(dlqMessage.Header.Bag.ContainsKey("RejectionReason")); - Assert.Equal("None", dlqMessage.Header.Bag["RejectionReason"]); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("OriginalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["OriginalTopic"]).IsEqualTo(_topic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("RejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["RejectionReason"]).IsEqualTo("None"); } } @@ -194,7 +189,7 @@ private async Task ConsumeMessageAsync(IAmAMessageConsumerAsync consume } catch (ChannelFailureException cfx) { - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); await Task.Delay(1000); } } while (maxTries <= 10); @@ -204,7 +199,12 @@ private async Task ConsumeMessageAsync(IAmAMessageConsumerAsync consume public async ValueTask DisposeAsync() { - _producer?.Dispose(); + if(_producer != null) + { + await _producer.DisposeAsync(); + } + await Task.CompletedTask; } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_sweeper_timeout_reached_should_commit_uncommitted_offsets_async.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_sweeper_timeout_reached_should_commit_uncommitted_offsets_async.cs index 3e652f9df8..3b0e433605 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_sweeper_timeout_reached_should_commit_uncommitted_offsets_async.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Proactor/When_sweeper_timeout_reached_should_commit_uncommitted_offsets_async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2025 Rafael Andrade @@ -27,29 +27,25 @@ THE SOFTWARE. */ using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Proactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition -public class WhenSweeperTimeoutReachedShouldCommitUncommittedOffsetsAsync : IAsyncDisposable, IDisposable +[Category("Kafka")] +public class WhenSweeperTimeoutReachedShouldCommitUncommittedOffsetsAsync : IAsyncDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); - private readonly IAmAProducerRegistry _producerRegistry; - private readonly KafkaMessageConsumer _consumer; + private IAmAProducerRegistry _producerRegistry; + private KafkaMessageConsumer _consumer; private readonly string _partitionKey = Guid.NewGuid().ToString(); - private readonly FakeTimeProvider _fakeTimeProvider; + private FakeTimeProvider _fakeTimeProvider; - public WhenSweeperTimeoutReachedShouldCommitUncommittedOffsetsAsync(ITestOutputHelper output) + [Before(Test)] + public async Task Setup() { var groupId = Uuid.New().ToString("N"); - _output = output; - - _producerRegistry = new KafkaProducerRegistryFactory( + + _producerRegistry = await new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration { Name = "Kafka Producer Send Test", @@ -67,7 +63,7 @@ public WhenSweeperTimeoutReachedShouldCommitUncommittedOffsetsAsync(ITestOutputH RequestTimeoutMs = 2000, MakeChannels = OnMissingChannel.Create } - ]).CreateAsync().Result; + ]).CreateAsync(); // Create a fake time provider to control time in the test _fakeTimeProvider = new FakeTimeProvider(); @@ -80,8 +76,8 @@ public WhenSweeperTimeoutReachedShouldCommitUncommittedOffsetsAsync(ITestOutputH commitBatchSize: 20, //Large commit batch size to ensure sweeper is triggered sweepUncommittedOffsetsInterval: TimeSpan.FromSeconds(30), messagePumpType: MessagePumpType.Proactor, - numOfPartitions: 1, - replicationFactor: 1, + numOfPartitions: 1, + replicationFactor: 1, makeChannels: OnMissingChannel.Create) { TimeProvider = _fakeTimeProvider }; _consumer = (KafkaMessageConsumer) new KafkaMessageConsumerFactory( @@ -93,7 +89,7 @@ public WhenSweeperTimeoutReachedShouldCommitUncommittedOffsetsAsync(ITestOutputH .CreateAsync(subscription); } - [Fact] + [Test] public async Task When_sweeper_timeout_reached_should_commit_uncommitted_offsets_async() { //Arrange @@ -128,8 +124,8 @@ await producerAsync.SendAsync(new Message( } //Assert - messages consumed and acknowledged but not yet committed - Assert.Equal(5, consumedMessages.Count); - Assert.Equal(5, _consumer.StoredOffsets()); + await Assert.That(consumedMessages.Count).IsEqualTo(5); + await Assert.That(_consumer.StoredOffsets()).IsEqualTo(5); //Act - Advance time beyond the sweeper interval (30 seconds) _fakeTimeProvider.Advance(TimeSpan.FromSeconds(31)); @@ -138,7 +134,7 @@ await producerAsync.SendAsync(new Message( await Task.Delay(2000); //Assert - Sweeper should have committed the offsets - Assert.Equal(0, _consumer.StoredOffsets()); + await Assert.That(_consumer.StoredOffsets()).IsEqualTo(0); _consumer.Close(); } @@ -168,7 +164,7 @@ private async Task ReadMessageAsync() catch (ChannelFailureException cfx) { //Lots of reasons to be here as Kafka propagates a topic, or the test cluster is still initializing - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); await Task.Delay(1000); } } while (maxTries <= 10); @@ -176,10 +172,11 @@ private async Task ReadMessageAsync() return messages[0]; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { _producerRegistry?.Dispose(); - _consumer.Dispose(); + await _consumer.DisposeAsync(); } public async ValueTask DisposeAsync() @@ -188,3 +185,4 @@ public async ValueTask DisposeAsync() await _consumer.DisposeAsync(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_a_message_is_acknowledged_update_offset.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_a_message_is_acknowledged_update_offset.cs index 80c451aab1..528f96f4a4 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_a_message_is_acknowledged_update_offset.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_a_message_is_acknowledged_update_offset.cs @@ -1,27 +1,22 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Confluent.Kafka; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition +[Category("Kafka")] public class KafkaMessageConsumerUpdateOffset : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly IAmAProducerRegistry _producerRegistry; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaMessageConsumerUpdateOffset(ITestOutputHelper output) + public KafkaMessageConsumerUpdateOffset() { - _output = output; _producerRegistry = new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration { @@ -42,8 +37,8 @@ public KafkaMessageConsumerUpdateOffset(ITestOutputHelper output) ]).Create(); } - //[Fact(Skip = "Fragile as commit thread needs to be scheduled to run")] - [Fact] + //[Test, Skip("Fragile as commit thread needs to be scheduled to run")] + [Test] public async Task When_a_message_is_acknowldgede_update_offset() { // let topic propogate in the broker @@ -74,20 +69,20 @@ public async Task When_a_message_is_acknowldgede_update_offset() Message[] messages = await ConsumeMessages(groupId: groupId, batchLimit: 5); //check we read the first 5 messages - Assert.Equal(5, messages.Length); + await Assert.That(messages.Length).IsEqualTo(5); for (int i = 0; i < 5; i++) { - Assert.Equal(sentMessages[i], messages[i].Id); + await Assert.That(messages[i].Id).IsEqualTo(sentMessages[i]); } //This will create a new consumer for the same group Message[] newMessages = await ConsumeMessages(groupId, batchLimit: 5); //check we read the next 5 messages - Assert.Equal(5, newMessages.Length); + await Assert.That(newMessages.Length).IsEqualTo(5); for (int i = 0; i < 5; i++) { - Assert.Equal(sentMessages[i + 5], newMessages[i].Id); + await Assert.That(newMessages[i].Id).IsEqualTo(sentMessages[i + 5]); } } @@ -98,7 +93,7 @@ private async Task ConsumeMessages(string groupId, int batchLimit) { for (int i = 0; i < batchLimit; i++) { - consumedMessages.Add(ConsumeMessage(consumer)); + consumedMessages.Add(await ConsumeMessage(consumer)); } //yield to allow commits to flush @@ -107,7 +102,7 @@ private async Task ConsumeMessages(string groupId, int batchLimit) return consumedMessages.ToArray(); - Message ConsumeMessage(IAmAMessageConsumerSync consumer) + async Task ConsumeMessage(IAmAMessageConsumerSync consumer) { Message[] messages = [new Message()]; int maxTries = 0; @@ -128,8 +123,8 @@ Message ConsumeMessage(IAmAMessageConsumerSync consumer) catch (ChannelFailureException cfx) { //Lots of reasons to be here as Kafka propagates a topic, or the test cluster is still initializing - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); - Task.Delay(1000).GetAwaiter().GetResult(); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + await Task.Delay(1000); } } while (maxTries <= 10); @@ -164,3 +159,4 @@ public void Dispose() _producerRegistry?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_a_set_of_messages_is_sent_preserve_order.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_a_set_of_messages_is_sent_preserve_order.cs index 337647c25e..bdb9056603 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_a_set_of_messages_is_sent_preserve_order.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_a_set_of_messages_is_sent_preserve_order.cs @@ -1,20 +1,16 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Confluent.Kafka; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition +[Category("Kafka")] public class KafkaMessageConsumerPreservesOrder : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly RoutingKey _topic = new(Guid.NewGuid().ToString()); private readonly IAmAProducerRegistry _producerRegistry; @@ -22,9 +18,8 @@ public class KafkaMessageConsumerPreservesOrder : IDisposable private readonly string _kafkaGroupId = Guid.NewGuid().ToString(); - public KafkaMessageConsumerPreservesOrder (ITestOutputHelper output) + public KafkaMessageConsumerPreservesOrder () { - _output = output; _producerRegistry = new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration { @@ -46,7 +41,7 @@ public KafkaMessageConsumerPreservesOrder (ITestOutputHelper output) ]).Create(); } - [Fact] + [Test] public async Task When_a_message_is_sent_keep_order() { //Let topic propogate @@ -69,24 +64,24 @@ public async Task When_a_message_is_sent_keep_order() consumer = CreateConsumer(); //Now read messages in order - var firstMessage = ConsumeMessages(consumer); + var firstMessage = await ConsumeMessages(consumer); var message = firstMessage.First(); - Assert.Equal(msgId, message.Id); + await Assert.That(message.Id).IsEqualTo(msgId); consumer.Acknowledge(message); - var secondMessage = ConsumeMessages(consumer); + var secondMessage = await ConsumeMessages(consumer); message = secondMessage.First(); - Assert.Equal(msgId2, message.Id); + await Assert.That(message.Id).IsEqualTo(msgId2); consumer.Acknowledge(message); - var thirdMessages = ConsumeMessages(consumer); + var thirdMessages = await ConsumeMessages(consumer); message = thirdMessages.First(); - Assert.Equal(msgId3, message.Id); + await Assert.That(message.Id).IsEqualTo(msgId3); consumer.Acknowledge(message); - var fourthMessage = ConsumeMessages(consumer); + var fourthMessage = await ConsumeMessages(consumer); message = fourthMessage.First(); - Assert.Equal(msgId4, message.Id); + await Assert.That(message.Id).IsEqualTo(msgId4); consumer.Acknowledge(message); } @@ -113,7 +108,7 @@ private string SendMessage(IAmAMessageProducerSync producer) return messageId; } - private IEnumerable ConsumeMessages(IAmAMessageConsumerSync consumer) + private async Task> ConsumeMessages(IAmAMessageConsumerSync consumer) { var messages = Array.Empty(); int maxTries = 0; @@ -130,8 +125,8 @@ private IEnumerable ConsumeMessages(IAmAMessageConsumerSync consumer) catch (ChannelFailureException cfx) { //Lots of reasons to be here as Kafka propagates a topic, or the test cluster is still initializing - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); - Task.Delay(1000).GetAwaiter().GetResult(); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + await Task.Delay(1000); } } while (maxTries <= 10); @@ -165,3 +160,4 @@ public void Dispose() _producerRegistry?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_committing_offsets_during_revoke_should_not_race.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_committing_offsets_during_revoke_should_not_race.cs index 1000888f52..a4b9219357 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_committing_offsets_during_revoke_should_not_race.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_committing_offsets_during_revoke_should_not_race.cs @@ -4,25 +4,20 @@ using Confluent.Kafka; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Trait("Fragile", "CI")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition +[Category("Kafka")] +[Property("Fragile", "CI")] public class KafkaMessageConsumerCommitRevokeConcurrency : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly IAmAProducerRegistry _producerRegistry; private readonly string _groupId = Guid.NewGuid().ToString(); - public KafkaMessageConsumerCommitRevokeConcurrency(ITestOutputHelper output) + public KafkaMessageConsumerCommitRevokeConcurrency() { - _output = output; _producerRegistry = new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration { @@ -55,9 +50,9 @@ public KafkaMessageConsumerCommitRevokeConcurrency(ITestOutputHelper output) /// This test is inherently timing-dependent — it maximises the chance of overlap between background /// commits and the revoke handler by using commitBatchSize: 1 and rapid message acknowledgement. /// - [Theory] - [InlineData(PartitionAssignmentStrategy.RoundRobin)] - [InlineData(PartitionAssignmentStrategy.CooperativeSticky)] + [Test] + [Arguments(PartitionAssignmentStrategy.RoundRobin)] + [Arguments(PartitionAssignmentStrategy.CooperativeSticky)] public async Task When_committing_offsets_during_revoke_should_not_race_with_background_commit( PartitionAssignmentStrategy partitionAssignmentStrategy) { @@ -87,50 +82,50 @@ public async Task When_committing_offsets_during_revoke_should_not_race_with_bac //consume a few messages to get consumer A established for (int j = 0; j < 5; j++) { - var msg = ReadMessage(consumerA); + var msg = await ReadMessage(consumerA); if (msg.Header.MessageType != MessageType.MT_NONE) { - consumerA.Acknowledge(msg); + await consumerA.AcknowledgeAsync(msg); } } - _output.WriteLine("Consumer A established, starting rapid consume + acknowledge"); + Console.WriteLine("Consumer A established, starting rapid consume + acknowledge"); //now start a rapid consume-acknowledge cycle while simultaneously triggering a rebalance //by adding consumer B to the group Exception? caughtException = null; - var consumeTask = Task.Run(() => + var consumeTask = Task.Run(async () => { try { for (int j = 0; j < 20; j++) { - var msg = ReadMessage(consumerA); + var msg = await ReadMessage(consumerA); if (msg.Header.MessageType != MessageType.MT_NONE) { //each acknowledge fires a background commit (batch size = 1) - consumerA.Acknowledge(msg); + await consumerA.AcknowledgeAsync(msg); } } } catch (Exception ex) { caughtException = ex; - _output.WriteLine($"Consumer A exception during consume: {ex.Message}"); + Console.WriteLine($"Consumer A exception during consume: {ex.Message}"); } }); //give consumer A a moment to start consuming, then trigger rebalance await Task.Delay(500); - _output.WriteLine("Adding consumer B to trigger rebalance"); + Console.WriteLine("Adding consumer B to trigger rebalance"); using var consumerB = CreateConsumer(commitBatchSize: 10, partitionAssignmentStrategy: partitionAssignmentStrategy); //consumer B polls to join the group and trigger rebalance try { - _ = consumerB.Receive(TimeSpan.FromMilliseconds(5000)); + _ = await consumerB.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); } catch (ChannelFailureException) { @@ -140,12 +135,12 @@ public async Task When_committing_offsets_during_revoke_should_not_race_with_bac await consumeTask; //the key assertion: consumer A should not have thrown during the rebalance - Assert.Null(caughtException); + await Assert.That(caughtException).IsNull(); //consumer A should still be functional after the rebalance - _ = consumerA.Receive(TimeSpan.FromMilliseconds(2000)); + _ = await consumerA.ReceiveAsync(TimeSpan.FromMilliseconds(2000)); - _output.WriteLine("Test completed - no race condition errors"); + Console.WriteLine("Test completed - no race condition errors"); } private KafkaMessageConsumer CreateConsumer(int commitBatchSize, @@ -171,7 +166,7 @@ private KafkaMessageConsumer CreateConsumer(int commitBatchSize, )); } - private Message ReadMessage(KafkaMessageConsumer consumer) + private async Task ReadMessage(KafkaMessageConsumer consumer) { Message[] messages = [new Message()]; int maxTries = 0; @@ -180,7 +175,7 @@ private Message ReadMessage(KafkaMessageConsumer consumer) try { maxTries++; - messages = consumer.Receive(TimeSpan.FromMilliseconds(1000)); + messages = await consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); if (messages[0].Header.MessageType != MessageType.MT_NONE) { @@ -189,8 +184,8 @@ private Message ReadMessage(KafkaMessageConsumer consumer) } catch (ChannelFailureException cfx) { - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); - Task.Delay(500).GetAwaiter().GetResult(); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + await Task.Delay(500); } } while (maxTries <= 10); @@ -202,3 +197,4 @@ public void Dispose() _producerRegistry?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_consumer_assumes_topic_but_missing.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_consumer_assumes_topic_but_missing.cs index 1c12bc55cb..9bfa0a2ef5 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_consumer_assumes_topic_but_missing.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_consumer_assumes_topic_but_missing.cs @@ -1,24 +1,19 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition +[Category("Kafka")] public class KafkaProducerAssumeTests : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly IAmAProducerRegistry _producerRegistry; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaProducerAssumeTests(ITestOutputHelper output) + public KafkaProducerAssumeTests() { - _output = output; _producerRegistry = new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration { @@ -43,8 +38,8 @@ public KafkaProducerAssumeTests(ITestOutputHelper output) //Watch your local Docker container when checking failures for this test, should be //KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false" - [Fact] - [Trait("Fragile", "CI")] + [Test] + [Property("Fragile", "CI")] public async Task When_a_consumer_declares_topics() { //Let topic propogate @@ -72,7 +67,7 @@ public async Task When_a_consumer_declares_topics() ((KafkaMessageProducer)producer).Flush(); - Assert.False(messagePublished); + await Assert.That(messagePublished).IsFalse(); } public void Dispose() @@ -80,3 +75,4 @@ public void Dispose() _producerRegistry?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_consumer_declares_topic.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_consumer_declares_topic.cs index 3010cdf37d..d52c0aa7fd 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_consumer_declares_topic.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_consumer_declares_topic.cs @@ -1,27 +1,22 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition +[Category("Kafka")] public class KafkaConsumerDeclareTests : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly IAmAProducerRegistry _producerRegistry; private readonly IAmAMessageConsumerSync _consumer; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaConsumerDeclareTests (ITestOutputHelper output) + public KafkaConsumerDeclareTests () { string groupId = Guid.NewGuid().ToString(); - _output = output; _producerRegistry = new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration { @@ -61,7 +56,7 @@ public KafkaConsumerDeclareTests (ITestOutputHelper output) } - [Fact] + [Test] public async Task When_a_consumer_declares_topics() { //Let topic propogate @@ -83,14 +78,14 @@ public async Task When_a_consumer_declares_topics() //ensure the messages are sent ((KafkaMessageProducer)producer).Flush(); - Message receivedMessage = ConsumeMessage(); + Message receivedMessage = await ConsumeMessage(); - Assert.Equal(MessageType.MT_COMMAND, receivedMessage.Header.MessageType); - Assert.Equal(_partitionKey, receivedMessage.Header.PartitionKey); - Assert.Equal(message.Body.Value, receivedMessage.Body.Value); + await Assert.That(receivedMessage.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(receivedMessage.Header.PartitionKey).IsEqualTo(_partitionKey); + await Assert.That(receivedMessage.Body.Value).IsEqualTo(message.Body.Value); } - private Message ConsumeMessage() + private async Task ConsumeMessage() { Message[] messages = new Message[0]; int maxTries = 0; @@ -109,8 +104,8 @@ private Message ConsumeMessage() catch (ChannelFailureException cfx) { //Lots of reasons to be here as Kafka propagates a topic, or the test cluster is still initializing - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); - Task.Delay(1000).GetAwaiter().GetResult(); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + await Task.Delay(1000); } } while (maxTries <= 10); @@ -124,3 +119,4 @@ public void Dispose() _consumer?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_converting_brighterheader_to_kafkaheader.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_converting_brighterheader_to_kafkaheader.cs index 41c29707c5..817cdba0dc 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_converting_brighterheader_to_kafkaheader.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_converting_brighterheader_to_kafkaheader.cs @@ -1,19 +1,17 @@ -using System; +using System; using System.Collections.Generic; using System.Globalization; using System.Net.Mime; using Confluent.Kafka; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] // +[Category("Kafka")] public class KafkaDefaultMessageHeaderBuilderTests { - [Fact] - public void When_converting_brighterheader_to_kafkaheader() + [Test] + public async Task When_converting_brighterheader_to_kafkaheader() { //arrange var message = new Message( @@ -54,27 +52,28 @@ public void When_converting_brighterheader_to_kafkaheader() //assert //known properties - Assert.Equal(message.Header.MessageType.ToString().ToByteArray(), headers.GetLastBytes(HeaderNames.MESSAGE_TYPE)); - Assert.Equal(message.Header.MessageId.Value.ToByteArray(), headers.GetLastBytes(HeaderNames.MESSAGE_ID)); - Assert.Equal(message.Header.Topic.Value.ToByteArray(), headers.GetLastBytes(HeaderNames.TOPIC)); - Assert.Equal(message.Header.TimeStamp.DateTime.ToString(CultureInfo.InvariantCulture).ToByteArray(), headers.GetLastBytes(HeaderNames.TIMESTAMP)); - Assert.Equal(message.Header.CorrelationId.Value.ToByteArray(), headers.GetLastBytes(HeaderNames.CORRELATION_ID)); - Assert.Equal(message.Header.PartitionKey.Value.ToByteArray(), headers.GetLastBytes(HeaderNames.PARTITIONKEY)); - Assert.Equal(message.Header.ContentType!.ToString().ToByteArray(), headers.GetLastBytes(HeaderNames.CONTENT_TYPE)); - Assert.Equal(message.Header.ReplyTo!.Value.ToByteArray(), headers.GetLastBytes(HeaderNames.REPLY_TO)); - Assert.Equal(message.Header.Delayed.TotalMilliseconds.ToString().ToByteArray(), headers.GetLastBytes(HeaderNames.DELAYED_MILLISECONDS)); - Assert.Equal(message.Header.HandledCount.ToString().ToByteArray(), headers.GetLastBytes(HeaderNames.HANDLED_COUNT)); - Assert.Equal(message.Header.Type.Value.ToByteArray(), headers.GetLastBytes(HeaderNames.CLOUD_EVENTS_TYPE)); - Assert.Equal(message.Header.Subject!.ToByteArray(), headers.GetLastBytes(HeaderNames.CLOUD_EVENTS_SUBJECT)); - Assert.Equal(message.Header.Source.ToString().ToByteArray(), headers.GetLastBytes(HeaderNames.CLOUD_EVENTS_SOURCE)); - Assert.Equal(message.Header.DataSchema!.ToString().ToByteArray(), headers.GetLastBytes(HeaderNames.CLOUD_EVENTS_DATA_SCHEMA)); + await Assert.That(headers.GetLastBytes(HeaderNames.MESSAGE_TYPE)).IsEqualTo(message.Header.MessageType.ToString().ToByteArray()); + await Assert.That(headers.GetLastBytes(HeaderNames.MESSAGE_ID)).IsEqualTo(message.Header.MessageId.Value.ToByteArray()); + await Assert.That(headers.GetLastBytes(HeaderNames.TOPIC)).IsEqualTo(message.Header.Topic.Value.ToByteArray()); + await Assert.That(headers.GetLastBytes(HeaderNames.TIMESTAMP)).IsEqualTo(message.Header.TimeStamp.DateTime.ToString(CultureInfo.InvariantCulture).ToByteArray()); + await Assert.That(headers.GetLastBytes(HeaderNames.CORRELATION_ID)).IsEqualTo(message.Header.CorrelationId.Value.ToByteArray()); + await Assert.That(headers.GetLastBytes(HeaderNames.PARTITIONKEY)).IsEqualTo(message.Header.PartitionKey.Value.ToByteArray()); + await Assert.That(headers.GetLastBytes(HeaderNames.CONTENT_TYPE)).IsEqualTo(message.Header.ContentType!.ToString().ToByteArray()); + await Assert.That(headers.GetLastBytes(HeaderNames.REPLY_TO)).IsEqualTo(message.Header.ReplyTo!.Value.ToByteArray()); + await Assert.That(headers.GetLastBytes(HeaderNames.DELAYED_MILLISECONDS)).IsEqualTo(message.Header.Delayed.TotalMilliseconds.ToString().ToByteArray()); + await Assert.That(headers.GetLastBytes(HeaderNames.HANDLED_COUNT)).IsEqualTo(message.Header.HandledCount.ToString().ToByteArray()); + await Assert.That(headers.GetLastBytes(HeaderNames.CLOUD_EVENTS_TYPE)).IsEqualTo(message.Header.Type.Value.ToByteArray()); + await Assert.That(headers.GetLastBytes(HeaderNames.CLOUD_EVENTS_SUBJECT)).IsEqualTo(message.Header.Subject!.ToByteArray()); + await Assert.That(headers.GetLastBytes(HeaderNames.CLOUD_EVENTS_SOURCE)).IsEqualTo(message.Header.Source.ToString().ToByteArray()); + await Assert.That(headers.GetLastBytes(HeaderNames.CLOUD_EVENTS_DATA_SCHEMA)).IsEqualTo(message.Header.DataSchema!.ToString().ToByteArray()); //bag properties - Assert.Equal(bag["myguid"].ToString()!.ToByteArray(), headers.GetLastBytes("myguid")); - Assert.Equal(bag["mystring"].ToString()!.ToByteArray(), headers.GetLastBytes("mystring")); - Assert.Equal(bag["myint"].ToString()!.ToByteArray(), headers.GetLastBytes("myint")); - Assert.Equal(bag["mydouble"].ToString()!.ToByteArray(), headers.GetLastBytes("mydouble")); - Assert.Equal(myDateTime.ToByteArray(), headers.GetLastBytes("mydatetime")); + await Assert.That(headers.GetLastBytes("myguid")).IsEqualTo(bag["myguid"].ToString()!.ToByteArray()); + await Assert.That(headers.GetLastBytes("mystring")).IsEqualTo(bag["mystring"].ToString()!.ToByteArray()); + await Assert.That(headers.GetLastBytes("myint")).IsEqualTo(bag["myint"].ToString()!.ToByteArray()); + await Assert.That(headers.GetLastBytes("mydouble")).IsEqualTo(bag["mydouble"].ToString()!.ToByteArray()); + await Assert.That(headers.GetLastBytes("mydatetime")).IsEqualTo(myDateTime.ToByteArray()); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_converting_kafkaheader_to_brighterheader.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_converting_kafkaheader_to_brighterheader.cs index f9acebe5ac..ac85fdee32 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_converting_kafkaheader_to_brighterheader.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_converting_kafkaheader_to_brighterheader.cs @@ -1,20 +1,18 @@ -using System; +using System; using System.Collections.Generic; using System.Globalization; using System.Net.Mime; using Confluent.Kafka; using Paramore.Brighter.Extensions; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] // +[Category("Kafka")] public class KafkaHeaderToBrighterTests { - [Fact] - public void When_converting_kafkaheader_to_brighterheader() + [Test] + public async Task When_converting_kafkaheader_to_brighterheader() { //arrange @@ -58,22 +56,23 @@ public void When_converting_kafkaheader_to_brighterheader() var readMessage = new KafkaMessageCreator().CreateMessage(result); //assert - Assert.Equal(message.Id, readMessage.Id); - Assert.Equal(message.Header.MessageType, readMessage.Header.MessageType); - Assert.Equal(message.Header.MessageId, readMessage.Header.MessageId); - Assert.Equal(message.Header.CorrelationId, readMessage.Header.CorrelationId); - Assert.Equal(message.Header.ContentType, readMessage.Header.ContentType); - Assert.Equal(message.Header.Topic, readMessage.Header.Topic); - Assert.Equal(message.Header.Delayed, readMessage.Header.Delayed); - Assert.Equal(message.Header.HandledCount, readMessage.Header.HandledCount); - Assert.Equal(message.Header.TimeStamp, readMessage.Header.TimeStamp, TimeSpan.FromSeconds(5)); + await Assert.That(readMessage.Id).IsEqualTo(message.Id); + await Assert.That(readMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(readMessage.Header.MessageId).IsEqualTo(message.Header.MessageId); + await Assert.That(readMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(readMessage.Header.ContentType).IsEqualTo(message.Header.ContentType); + await Assert.That(readMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(readMessage.Header.Delayed).IsEqualTo(message.Header.Delayed); + await Assert.That(readMessage.Header.HandledCount).IsEqualTo(message.Header.HandledCount); + await Assert.That(readMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(5)); //NOTE: Because we can only coerce the byte[] to a string for a unknown bag key, coercing to a specific //type has to be done by the user of the bag. - Assert.Equal(bag["myguid"].ToString(), readMessage.Header.Bag["myguid"]); - Assert.Equal(bag["mystring"].ToString(), readMessage.Header.Bag["mystring"]); - Assert.Equal(bag["myint"].ToString(), readMessage.Header.Bag["myint"]); - Assert.Equal(bag["mydouble"].ToString(), readMessage.Header.Bag["mydouble"]); - Assert.Equal(((DateTime)bag["mydatetime"]).ToString(CultureInfo.InvariantCulture), readMessage.Header.Bag["mydatetime"]); + await Assert.That(readMessage.Header.Bag["myguid"]).IsEqualTo(bag["myguid"].ToString()); + await Assert.That(readMessage.Header.Bag["mystring"]).IsEqualTo(bag["mystring"].ToString()); + await Assert.That(readMessage.Header.Bag["myint"]).IsEqualTo(bag["myint"].ToString()); + await Assert.That(readMessage.Header.Bag["mydouble"]).IsEqualTo(bag["mydouble"].ToString()); + await Assert.That(readMessage.Header.Bag["mydatetime"]).IsEqualTo(((DateTime)bag["mydatetime"]).ToString(CultureInfo.InvariantCulture)); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_creating_dlq_producer_with_make_channels_create_should_create_topic.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_creating_dlq_producer_with_make_channels_create_should_create_topic.cs index b8dfb6106a..699f9c6fd2 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_creating_dlq_producer_with_make_channels_create_should_create_topic.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_creating_dlq_producer_with_make_channels_create_should_create_topic.cs @@ -26,25 +26,20 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] +[Category("Kafka")] public class KafkaMessageConsumerMakeChannelsTests : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly string _dlqTopic; private readonly KafkaMessageProducer _producer; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaMessageConsumerMakeChannelsTests(ITestOutputHelper output) + public KafkaMessageConsumerMakeChannelsTests() { - _output = output; _dlqTopic = $"{_topic}.dlq"; // Create producer directly for the data topic @@ -69,7 +64,7 @@ public KafkaMessageConsumerMakeChannelsTests(ITestOutputHelper output) _producer.Init(); } - [Fact] + [Test] public async Task When_creating_dlq_producer_with_make_channels_create_should_create_topic() { //Arrange - let topics propagate in the broker @@ -85,7 +80,7 @@ public async Task When_creating_dlq_producer_with_make_channels_create_should_cr new MessageHeader(messageId, routingKey, MessageType.MT_COMMAND) { PartitionKey = _partitionKey }, new MessageBody($"test content for make channels") ); - _producer.Send(sentMessage); + await _producer.SendAsync(sentMessage); _producer.Flush(); //Act - create consumer with OnMissingChannel.Create and reject a message @@ -93,21 +88,21 @@ public async Task When_creating_dlq_producer_with_make_channels_create_should_cr Message? receivedMessage; using (var consumer = CreateConsumer(groupId, dlqRoutingKey, OnMissingChannel.Create)) { - receivedMessage = ConsumeMessage(consumer); - Assert.Equal(messageId, receivedMessage.Id); + receivedMessage = await ConsumeMessage(consumer); + await Assert.That(receivedMessage.Id).IsEqualTo(messageId); - _output.WriteLine($"About to reject message {messageId} - DLQ topic should be created automatically"); + Console.WriteLine($"About to reject message {messageId} - DLQ topic should be created automatically"); //reject with DeliveryError - DLQ producer will inherit MakeChannels.Create and create topic consumer.Reject(receivedMessage, new MessageRejectionReason(RejectionReason.DeliveryError, "Test MakeChannels inheritance")); - _output.WriteLine($"Message {messageId} rejected, waiting for DLQ propagation"); + Console.WriteLine($"Message {messageId} rejected, waiting for DLQ propagation"); //yield to allow DLQ message to be produced and topic to be created await Task.Delay(TimeSpan.FromMilliseconds(3000)); } - _output.WriteLine("Creating DLQ consumer to verify topic was created"); + Console.WriteLine("Creating DLQ consumer to verify topic was created"); //yield to allow DLQ topic to propagate await Task.Delay(TimeSpan.FromMilliseconds(1000)); @@ -116,18 +111,18 @@ public async Task When_creating_dlq_producer_with_make_channels_create_should_cr //If MakeChannels inheritance didn't work, the topic wouldn't exist and this would fail using (var dlqConsumer = CreateDLQConsumer(groupId)) { - _output.WriteLine("Attempting to consume from DLQ - this proves topic was auto-created"); - var dlqMessage = ConsumeMessage(dlqConsumer); + Console.WriteLine("Attempting to consume from DLQ - this proves topic was auto-created"); + var dlqMessage = await ConsumeMessage(dlqConsumer); - Assert.NotNull(dlqMessage); - Assert.Equal(MessageType.MT_COMMAND, dlqMessage.Header.MessageType); - Assert.Equal(receivedMessage.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage).IsNotNull(); + await Assert.That(dlqMessage.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(receivedMessage.Body.Value); //verify the DLQ topic was created and message was sent successfully - Assert.True(dlqMessage.Header.Bag.ContainsKey("OriginalTopic")); - Assert.Equal(_topic, dlqMessage.Header.Bag["OriginalTopic"]); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("OriginalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["OriginalTopic"]).IsEqualTo(_topic); - _output.WriteLine("DLQ topic was successfully created via MakeChannels.Create inheritance"); + Console.WriteLine("DLQ topic was successfully created via MakeChannels.Create inheritance"); } } @@ -176,7 +171,7 @@ private IAmAMessageConsumerSync CreateDLQConsumer(string groupId) )); } - private Message ConsumeMessage(IAmAMessageConsumerSync consumer) + private async Task ConsumeMessage(IAmAMessageConsumerSync consumer) { int maxTries = 0; do @@ -193,8 +188,8 @@ private Message ConsumeMessage(IAmAMessageConsumerSync consumer) } catch (ChannelFailureException cfx) { - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); - Task.Delay(1000).GetAwaiter().GetResult(); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + await Task.Delay(1000); } } while (maxTries <= 10); @@ -206,3 +201,4 @@ public void Dispose() _producer?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_kafka_consumer_disposes_should_dispose_requeue_producer.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_kafka_consumer_disposes_should_dispose_requeue_producer.cs index 9b6297c8c3..ad9714def4 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_kafka_consumer_disposes_should_dispose_requeue_producer.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_kafka_consumer_disposes_should_dispose_requeue_producer.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -26,8 +26,6 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; @@ -35,20 +33,17 @@ namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; /// When the Kafka consumer is disposed, it should dispose the lazily-created requeue producer. /// If no requeue was ever performed, disposal should succeed without error. /// -[Trait("Category", "Kafka")] -[Collection("Kafka")] +[Category("Kafka")] public class KafkaConsumerDisposesRequeueProducerTests : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _topic = Guid.NewGuid().ToString(); private readonly string _channelName = Guid.NewGuid().ToString(); private readonly IAmAProducerRegistry _producerRegistry; private readonly IAmAMessageConsumerSync _consumer; - public KafkaConsumerDisposesRequeueProducerTests(ITestOutputHelper output) + public KafkaConsumerDisposesRequeueProducerTests() { string groupId = Guid.NewGuid().ToString(); - _output = output; _producerRegistry = new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration @@ -85,8 +80,8 @@ public KafkaConsumerDisposesRequeueProducerTests(ITestOutputHelper output) )); } - [Fact] - public void When_consumer_requeues_then_disposes_should_dispose_producer() + [Test] + public async Task When_consumer_requeues_then_disposes_should_dispose_producer() { // Arrange - send a message and receive it to have something to requeue var message = new Message( @@ -97,26 +92,24 @@ public void When_consumer_requeues_then_disposes_should_dispose_producer() producer.Send(message); ((KafkaMessageProducer)producer).Flush(); - var received = GetMessage(); - Assert.NotEqual(MessageType.MT_NONE, received.Header.MessageType); + var received = await GetMessage(); + await Assert.That(received.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); // Act - requeue to trigger lazy producer creation, then dispose _consumer.Requeue(received); // Assert - disposing should not throw (producer cleanup succeeds) - var exception = Record.Exception(() => _consumer.Dispose()); - Assert.Null(exception); + await Assert.That(() => _consumer.Dispose()).ThrowsNothing(); } - [Fact] - public void When_consumer_disposes_without_requeue_should_not_throw() + [Test] + public async Task When_consumer_disposes_without_requeue_should_not_throw() { // Act + Assert - disposing without ever requeuing should succeed - var exception = Record.Exception(() => _consumer.Dispose()); - Assert.Null(exception); + await Assert.That(() => _consumer.Dispose()).ThrowsNothing(); } - private Message GetMessage() + private async Task GetMessage() { Message[] messages = []; int maxTries = 0; @@ -135,8 +128,8 @@ private Message GetMessage() } catch (ChannelFailureException cfx) { - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); - Task.Delay(1000).GetAwaiter().GetResult(); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + await Task.Delay(1000); } } while (maxTries <= 10); @@ -153,3 +146,4 @@ public void Dispose() try { _consumer?.Dispose(); } catch { /* already disposed */ } } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_kafka_consumer_requeues_with_delay_should_use_producer.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_kafka_consumer_requeues_with_delay_should_use_producer.cs index 24d4381feb..9d6c6054a9 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_kafka_consumer_requeues_with_delay_should_use_producer.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_kafka_consumer_requeues_with_delay_should_use_producer.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -26,8 +26,6 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; @@ -36,21 +34,18 @@ namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; /// via a lazily-created producer. Previously Requeue was a no-op; now it delegates to the producer /// so that requeued messages are actually redelivered. /// -[Trait("Category", "Kafka")] -[Collection("Kafka")] +[Category("Kafka")] public class KafkaConsumerRequeueTests : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _topic = Guid.NewGuid().ToString(); private readonly string _channelName = Guid.NewGuid().ToString(); private readonly IAmAProducerRegistry _producerRegistry; private readonly IAmAMessageConsumerSync _consumer; private readonly Message _message; - public KafkaConsumerRequeueTests(ITestOutputHelper output) + public KafkaConsumerRequeueTests() { string groupId = Guid.NewGuid().ToString(); - _output = output; _message = new Message( new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey(_topic), MessageType.MT_COMMAND), @@ -91,33 +86,33 @@ public KafkaConsumerRequeueTests(ITestOutputHelper output) )); } - [Fact] - public void When_requeuing_should_publish_message_via_producer() + [Test] + public async Task When_requeuing_should_publish_message_via_producer() { // Arrange - send a message and receive it var producer = (IAmAMessageProducerSync)_producerRegistry.LookupBy(new RoutingKey(_topic)); producer.Send(_message); ((KafkaMessageProducer)producer).Flush(); - var received = GetMessage(); - Assert.NotEqual(MessageType.MT_NONE, received.Header.MessageType); - _output.WriteLine($"Received body length: {received.Body.Bytes.Length}, value: '{received.Body.Value}'"); - _output.WriteLine($"Received topic: {received.Header.Topic}"); + var received = await GetMessage(); + await Assert.That(received.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + Console.WriteLine($"Received body length: {received.Body.Bytes.Length}, value: '{received.Body.Value}'"); + Console.WriteLine($"Received topic: {received.Header.Topic}"); // Act - requeue the message (no delay, so producer sends immediately) var result = _consumer.Requeue(received); // Assert - requeue should return true - Assert.True(result, "Requeue should succeed"); + await Assert.That(result).IsTrue(); // Assert - message should be available again on the topic (published via producer) - var requeued = GetMessage(); - _output.WriteLine($"Requeued body length: {requeued.Body.Bytes.Length}, value: '{requeued.Body.Value}'"); - _output.WriteLine($"Requeued topic: {requeued.Header.Topic}, type: {requeued.Header.MessageType}"); - Assert.Equal(_message.Body.Value, requeued.Body.Value); + var requeued = await GetMessage(); + Console.WriteLine($"Requeued body length: {requeued.Body.Bytes.Length}, value: '{requeued.Body.Value}'"); + Console.WriteLine($"Requeued topic: {requeued.Header.Topic}, type: {requeued.Header.MessageType}"); + await Assert.That(requeued.Body.Value).IsEqualTo(_message.Body.Value); } - private Message GetMessage() + private async Task GetMessage() { Message[] messages = []; int maxTries = 0; @@ -136,8 +131,8 @@ private Message GetMessage() } catch (ChannelFailureException cfx) { - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); - Task.Delay(1000).GetAwaiter().GetResult(); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + await Task.Delay(1000); } } while (maxTries <= 10); @@ -153,3 +148,4 @@ public void Dispose() _consumer?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_kafka_consumer_requeues_with_delay_should_use_scheduler.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_kafka_consumer_requeues_with_delay_should_use_scheduler.cs index 347fcfda8e..01be50ec8b 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_kafka_consumer_requeues_with_delay_should_use_scheduler.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_kafka_consumer_requeues_with_delay_should_use_scheduler.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -26,8 +26,6 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; @@ -36,21 +34,18 @@ namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; /// should delegate to the scheduler. This test verifies that the scheduler passed to the consumer /// constructor is wired through to the producer's Scheduler property. /// -[Trait("Category", "Kafka")] -[Collection("Kafka")] +[Category("Kafka")] public class KafkaConsumerRequeueSchedulerTests : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _topic = Guid.NewGuid().ToString(); private readonly IAmAProducerRegistry _producerRegistry; private readonly KafkaMessageConsumer _consumer; private readonly SpySchedulerSync _scheduler; private readonly Message _message; - public KafkaConsumerRequeueSchedulerTests(ITestOutputHelper output) + public KafkaConsumerRequeueSchedulerTests() { string groupId = Guid.NewGuid().ToString(); - _output = output; _message = new Message( new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey(_topic), MessageType.MT_COMMAND), @@ -91,27 +86,26 @@ public KafkaConsumerRequeueSchedulerTests(ITestOutputHelper output) scheduler: _scheduler); } - [Fact] - public void When_requeuing_with_delay_should_use_scheduler() + [Test] + public async Task When_requeuing_with_delay_should_use_scheduler() { // Arrange - send a message and receive it var producer = (IAmAMessageProducerSync)_producerRegistry.LookupBy(new RoutingKey(_topic)); producer.Send(_message); ((KafkaMessageProducer)producer).Flush(); - var received = GetMessage(); - Assert.NotEqual(MessageType.MT_NONE, received.Header.MessageType); + var received = await GetMessage(); + await Assert.That(received.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); // Act - requeue with non-zero delay (should use scheduler via producer) - _consumer.Requeue(received, TimeSpan.FromSeconds(5)); + await _consumer.RequeueAsync(received, TimeSpan.FromSeconds(5)); // Assert - scheduler should have been called (proves producer has scheduler configured) - Assert.True(_scheduler.ScheduleCalled, - "Scheduler.Schedule should have been called via the lazily created producer"); - Assert.Equal(TimeSpan.FromSeconds(5), _scheduler.ScheduledDelay); + await Assert.That(_scheduler.ScheduleCalled).IsTrue(); + await Assert.That(_scheduler.ScheduledDelay).IsEqualTo(TimeSpan.FromSeconds(5)); } - private Message GetMessage() + private async Task GetMessage() { Message[] messages = []; int maxTries = 0; @@ -120,18 +114,18 @@ private Message GetMessage() try { maxTries++; - messages = _consumer.Receive(TimeSpan.FromMilliseconds(1000)); + messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - _consumer.Acknowledge(messages[0]); + await _consumer.AcknowledgeAsync(messages[0]); break; } } catch (ChannelFailureException cfx) { - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); - Task.Delay(1000).GetAwaiter().GetResult(); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + await Task.Delay(1000); } } while (maxTries <= 10); @@ -178,3 +172,4 @@ public string Schedule(Message message, TimeSpan delay) public void Cancel(string id) { } } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_nacking_a_message_it_should_be_redelivered.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_nacking_a_message_it_should_be_redelivered.cs index 3947ceffb3..a57aabe4a7 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_nacking_a_message_it_should_be_redelivered.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_nacking_a_message_it_should_be_redelivered.cs @@ -3,24 +3,19 @@ using Confluent.Kafka; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition +[Category("Kafka")] public class KafkaMessageConsumerNackRedelivery : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly IAmAProducerRegistry _producerRegistry; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaMessageConsumerNackRedelivery(ITestOutputHelper output) + public KafkaMessageConsumerNackRedelivery() { - _output = output; _producerRegistry = new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration { @@ -39,7 +34,7 @@ public KafkaMessageConsumerNackRedelivery(ITestOutputHelper output) ]).Create(); } - [Fact] + [Test] public async Task When_nacking_a_message_it_should_be_redelivered() { // let topic propagate in the broker @@ -64,18 +59,18 @@ public async Task When_nacking_a_message_it_should_be_redelivered() //Act - receive the message, nack it, then receive again var firstReceive = await ReceiveMessageAsync(consumer); - Assert.Equal(sentMessageId, firstReceive.Id); + await Assert.That(firstReceive.Id).IsEqualTo(sentMessageId); consumer.Nack(firstReceive); var secondReceive = await ReceiveMessageAsync(consumer); //Assert - the same message should be redelivered - Assert.Equal(sentMessageId, secondReceive.Id); - Assert.Equal(sentBody, secondReceive.Body.Value); + await Assert.That(secondReceive.Id).IsEqualTo(sentMessageId); + await Assert.That(secondReceive.Body.Value).IsEqualTo(sentBody); } - [Fact] + [Test] public async Task When_acking_later_message_it_should_not_skip_nacked_message() { // let topic propagate in the broker @@ -105,7 +100,7 @@ public async Task When_acking_later_message_it_should_not_skip_nacked_message() //Act - receive message 1, nack it; receive message 1 again (redelivered), then ack it var firstReceive = await ReceiveMessageAsync(consumer); - Assert.Equal(firstMessageId, firstReceive.Id); + await Assert.That(firstReceive.Id).IsEqualTo(firstMessageId); consumer.Nack(firstReceive); @@ -113,14 +108,14 @@ public async Task When_acking_later_message_it_should_not_skip_nacked_message() var redelivered = await ReceiveMessageAsync(consumer); //Assert - the nacked message is redelivered, not skipped by the second message's existence - Assert.Equal(firstMessageId, redelivered.Id); + await Assert.That(redelivered.Id).IsEqualTo(firstMessageId); // Now ack the redelivered message and confirm we get the second message consumer.Acknowledge(redelivered); var secondReceive = await ReceiveMessageAsync(consumer); - Assert.NotEqual(MessageType.MT_NONE, secondReceive.Header.MessageType); - Assert.Equal(secondMessageId, secondReceive.Id); + await Assert.That(secondReceive.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(secondReceive.Id).IsEqualTo(secondMessageId); } private async Task ReceiveMessageAsync(IAmAMessageConsumerSync consumer) @@ -141,7 +136,7 @@ private async Task ReceiveMessageAsync(IAmAMessageConsumerSync consumer } catch (ChannelFailureException cfx) { - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); await Task.Delay(1000); } } while (maxTries <= 10); @@ -176,3 +171,4 @@ public void Dispose() _producerRegistry?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_offsets_awaiting_next_acknowledge_sweep_them.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_offsets_awaiting_next_acknowledge_sweep_them.cs index 1d1eaf13af..b8490d798b 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_offsets_awaiting_next_acknowledge_sweep_them.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_offsets_awaiting_next_acknowledge_sweep_them.cs @@ -1,28 +1,23 @@ -using System; +using System; using System.Collections.Generic; using System.Threading.Tasks; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition +[Category("Kafka")] public class KafkaMessageConsumerSweepOffsets : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly IAmAProducerRegistry _producerRegistry; private readonly KafkaMessageConsumer _consumer; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaMessageConsumerSweepOffsets(ITestOutputHelper output) + public KafkaMessageConsumerSweepOffsets() { string groupId = Guid.NewGuid().ToString(); - _output = output; _producerRegistry = new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration { @@ -63,7 +58,7 @@ public KafkaMessageConsumerSweepOffsets(ITestOutputHelper output) ); } - [Fact] + [Test] public async Task When_a_message_is_acknowldeged_but_no_batch_sent_sweep_offsets() { //allow topic to propogate on the broker @@ -93,8 +88,8 @@ public async Task When_a_message_is_acknowldeged_but_no_batch_sent_sweep_offsets consumedMessages.Add(await ReadMessageAsync()); } - Assert.Equal(9, consumedMessages.Count); - Assert.Equal(9, _consumer.StoredOffsets()); + await Assert.That(consumedMessages.Count).IsEqualTo(9); + await Assert.That(_consumer.StoredOffsets()).IsEqualTo(9); //Let time elapse with no activity await Task.Delay(10000); @@ -111,7 +106,7 @@ public async Task When_a_message_is_acknowldeged_but_no_batch_sent_sweep_offsets } //Sweeper will commit these - Assert.Equal(0, _consumer.StoredOffsets()); + await Assert.That(_consumer.StoredOffsets()).IsEqualTo(0); return; async Task ReadMessageAsync() @@ -123,11 +118,11 @@ async Task ReadMessageAsync() try { maxTries++; - messages = _consumer.Receive(TimeSpan.FromMilliseconds(1000)); + messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - _consumer.Acknowledge(messages[0]); + await _consumer.AcknowledgeAsync(messages[0]); return messages[0]; } @@ -135,7 +130,7 @@ async Task ReadMessageAsync() catch (ChannelFailureException cfx) { //Lots of reasons to be here as Kafka propagates a topic, or the test cluster is still initializing - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); await Task.Delay(1000); } } while (maxTries <= 10); @@ -151,3 +146,4 @@ public void Dispose() _consumer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_posting_a_message.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_posting_a_message.cs index 0c3f3f1ee4..9e446ca4a4 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_posting_a_message.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_posting_a_message.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Net.Mime; using System.Text.Json; @@ -8,26 +8,21 @@ using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; using Paramore.Brighter.Observability; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition +[Category("Kafka")] public class KafkaMessageProducerSendTests : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _channelName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly IAmAProducerRegistry _producerRegistry; private readonly IAmAMessageConsumerSync _consumer; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaMessageProducerSendTests(ITestOutputHelper output) + public KafkaMessageProducerSendTests() { string groupId = Guid.NewGuid().ToString(); - _output = output; _producerRegistry = new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration { Name = "Kafka Producer Send Test", BootStrapServers = new[] { "localhost:9092" } }, [ @@ -58,7 +53,7 @@ public KafkaMessageProducerSendTests(ITestOutputHelper output) ); } - [Fact] + [Test] public async Task When_posting_a_message() { //Let topic propagate in the broker @@ -125,41 +120,41 @@ public async Task When_posting_a_message() //allow propagation of callback await Task.Delay(1000); - Assert.True(messagePublished); + await Assert.That(messagePublished).IsTrue(); - var receivedMessage = GetMessage(); + var receivedMessage = await GetMessage(); var receivedCommand = JsonSerializer.Deserialize(receivedMessage.Body.Value, JsonSerialisationOptions.Options); - Assert.Equal(MessageType.MT_COMMAND, receivedMessage.Header.MessageType); - Assert.Equal(_partitionKey, receivedMessage.Header.PartitionKey); - Assert.Equal(message.Body.Bytes, receivedMessage.Body.Bytes); - Assert.Equal(message.Body.Value, receivedMessage.Body.Value); - Assert.Equal(command.Id, receivedCommand.Id); - Assert.Equal(command.Value, receivedCommand.Value); + await Assert.That(receivedMessage.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(receivedMessage.Header.PartitionKey).IsEqualTo(_partitionKey); + await Assert.That(receivedMessage.Body.Bytes).IsEqualTo(message.Body.Bytes); + await Assert.That(receivedMessage.Body.Value).IsEqualTo(message.Body.Value); + await Assert.That(receivedCommand.Id).IsEqualTo(command.Id); + await Assert.That(receivedCommand.Value).IsEqualTo(command.Value); // Assert header values - Assert.Equal(message.Header.MessageId, receivedMessage.Header.MessageId); - Assert.Equal(message.Header.Topic, receivedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, receivedMessage.Header.MessageType); - Assert.Equal(message.Header.Source,receivedMessage.Header.Source); - Assert.Equal(message.Header.Type,receivedMessage.Header.Type); - Assert.Equal(message.Header.TimeStamp, receivedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(message.Header.CorrelationId,receivedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, receivedMessage.Header.ReplyTo); - Assert.Equal(message.Header.ContentType,receivedMessage.Header.ContentType); - Assert.Equal(message.Header.HandledCount, receivedMessage.Header.HandledCount); - Assert.Equal(message.Header.DataSchema,receivedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject,receivedMessage.Header.Subject); - Assert.Equal(delayMilliseconds, receivedMessage.Header.Delayed); //we clear any delay from the producer, as it represents delay in the pipeline - Assert.Equal(message.Header.TraceParent,receivedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, receivedMessage.Header.TraceState); - Assert.Equal(message.Header.Baggage, receivedMessage.Header.Baggage); - Assert.True(message.Header.Bag.ContainsKey("Test Header")); - Assert.Equal("Test Value", message.Header.Bag["Test Header"]); + await Assert.That(receivedMessage.Header.MessageId).IsEqualTo(message.Header.MessageId); + await Assert.That(receivedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(receivedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(receivedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(receivedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(receivedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(receivedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(receivedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(receivedMessage.Header.ContentType).IsEqualTo(message.Header.ContentType); + await Assert.That(receivedMessage.Header.HandledCount).IsEqualTo(message.Header.HandledCount); + await Assert.That(receivedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(receivedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(receivedMessage.Header.Delayed).IsEqualTo(delayMilliseconds); //we clear any delay from the producer, as it represents delay in the pipeline + await Assert.That(receivedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(receivedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); + await Assert.That(receivedMessage.Header.Baggage).IsEqualTo(message.Header.Baggage); + await Assert.That(message.Header.Bag.ContainsKey("Test Header")).IsTrue(); + await Assert.That(message.Header.Bag["Test Header"]).IsEqualTo("Test Value"); } - private Message GetMessage() + private async Task GetMessage() { Message[] messages = []; int maxTries = 0; @@ -179,8 +174,8 @@ private Message GetMessage() catch (ChannelFailureException cfx) { //Lots of reasons to be here as Kafka propagates a topic, or the test cluster is still initializing - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); - Task.Delay(1000).GetAwaiter().GetResult(); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + await Task.Delay(1000); } } while (maxTries <= 10); @@ -196,3 +191,4 @@ public void Dispose() _consumer?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_posting_a_message_with_header_bytes.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_posting_a_message_with_header_bytes.cs index 319b51c603..c7b8179387 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_posting_a_message_with_header_bytes.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_posting_a_message_with_header_bytes.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Net; using System.Threading.Tasks; @@ -8,16 +8,12 @@ using Confluent.SchemaRegistry.Serdes; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition +[Category("Kafka")] public class KafkaMessageProducerHeaderBytesSendTests : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly IAmAProducerRegistry _producerRegistry; @@ -28,10 +24,9 @@ public class KafkaMessageProducerHeaderBytesSendTests : IDisposable private readonly SerializationContext _serializationContext; - public KafkaMessageProducerHeaderBytesSendTests (ITestOutputHelper output) + public KafkaMessageProducerHeaderBytesSendTests () { string groupId = Guid.NewGuid().ToString(); - _output = output; _producerRegistry = new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration { @@ -81,7 +76,7 @@ public KafkaMessageProducerHeaderBytesSendTests (ITestOutputHelper output) /// NOTE: This test needs the schema registry to be running, and has hardcoded it's port to 8081. Both of those /// may cause this test to fail, so check them if in doubt /// - [Fact] + [Test] public async Task When_posting_a_message_via_the_messaging_gateway() { @@ -116,25 +111,25 @@ public async Task When_posting_a_message_via_the_messaging_gateway() await Task.Delay(500); //Let the message propagate in the broker - var received = GetMessage(); + var received = await GetMessage(); - Assert.True(received.Body.Bytes.Length > 5); + await Assert.That(received.Body.Bytes.Length > 5).IsTrue(); var receivedSchemaId = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(received.Body.Bytes.Skip(1).Take(4).ToArray())); var receivedCommand = _deserializer.Deserialize(received.Body.Bytes, received.Body.Bytes is null, _serializationContext); //assert - Assert.Equal(MessageType.MT_COMMAND, received.Header.MessageType); - Assert.Equal(_partitionKey, received.Header.PartitionKey); - Assert.Equal(received.Body.Bytes, received.Body.Bytes); - Assert.Equal(received.Body.Value, received.Body.Value); - Assert.Equal(schemaId, receivedSchemaId); - Assert.Equal(myCommand.Id, receivedCommand.Id); - Assert.Equal(myCommand.Value, receivedCommand.Value); + await Assert.That(received.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(received.Header.PartitionKey).IsEqualTo(_partitionKey); + await Assert.That(received.Body.Bytes).IsEqualTo(received.Body.Bytes); + await Assert.That(received.Body.Value).IsEqualTo(received.Body.Value); + await Assert.That(receivedSchemaId).IsEqualTo(schemaId); + await Assert.That(receivedCommand.Id).IsEqualTo(myCommand.Id); + await Assert.That(receivedCommand.Value).IsEqualTo(myCommand.Value); } - private Message GetMessage() + private async Task GetMessage() { Message[] messages = Array.Empty(); int maxTries = 0; @@ -155,8 +150,8 @@ private Message GetMessage() catch (ChannelFailureException cfx) { //Lots of reasons to be here as Kafka propagates a topic, or the test cluster is still initializing - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); - Task.Delay(1000).GetAwaiter().GetResult(); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + await Task.Delay(1000); } } while (maxTries <= 10); @@ -173,3 +168,4 @@ public void Dispose() _consumer?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_recieving_a_message_without_partition_key_header.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_recieving_a_message_without_partition_key_header.cs index 168956137d..aa154ff2b6 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_recieving_a_message_without_partition_key_header.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_recieving_a_message_without_partition_key_header.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text; using System.Text.Json; using System.Threading.Tasks; @@ -6,26 +6,21 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; using Acks = Confluent.Kafka.Acks; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] // +[Category("Kafka")] public class KafkaMessageProducerMissingHeaderTests : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly IAmAMessageConsumerSync _consumer; private readonly IProducer _producer; - public KafkaMessageProducerMissingHeaderTests(ITestOutputHelper output) + public KafkaMessageProducerMissingHeaderTests() { string groupId = Guid.NewGuid().ToString(); - _output = output; var clientConfig = new ClientConfig @@ -53,7 +48,7 @@ public KafkaMessageProducerMissingHeaderTests(ITestOutputHelper output) _producer = new ProducerBuilder(producerConfig) .SetErrorHandler((_, error) => { - output.WriteLine($"Kafka producer failed with Code: {error.Code}, Reason: { error.Reason}, Fatal: {error.IsFatal}", error.Code, error.Reason, error.IsFatal); + Console.WriteLine($"Kafka producer failed with Code: {error.Code}, Reason: { error.Reason}, Fatal: {error.IsFatal}"); }) .Build(); @@ -74,7 +69,7 @@ public KafkaMessageProducerMissingHeaderTests(ITestOutputHelper output) ); } - [Fact] + [Test] public async Task When_recieving_a_message_without_partition_key_header() { await Task.Delay(500); //Let topic propagate in the broker @@ -90,7 +85,7 @@ public async Task When_recieving_a_message_without_partition_key_header() Value = value }; - _producer.Produce(_topic, kafkaMessage, report => _output.WriteLine(report.ToString()) ); + _producer.Produce(_topic, kafkaMessage, report => Console.WriteLine(report.ToString()) ); //ensure any messages are flushed _producer.Flush(); @@ -98,14 +93,14 @@ public async Task When_recieving_a_message_without_partition_key_header() //let this propogate to the Broker await Task.Delay(3000); - var receivedMessage = GetMessage(); + var receivedMessage = await GetMessage(); //Where we lack a partition key header, assume non-Brighter header and set to message key - Assert.Equal(command.Id, receivedMessage.Header.PartitionKey); - Assert.Equal(value, receivedMessage.Body.Bytes); + await Assert.That(receivedMessage.Header.PartitionKey).IsEqualTo(command.Id); + await Assert.That(receivedMessage.Body.Bytes).IsEqualTo(value); } - private Message GetMessage() + private async Task GetMessage() { Message[] messages = new Message[0]; int maxTries = 0; @@ -123,13 +118,13 @@ private Message GetMessage() } //wait before retry - allow consumer group join to complete - Task.Delay(1000).GetAwaiter().GetResult(); + await Task.Delay(1000); } catch (ChannelFailureException cfx) { //Lots of reasons to be here as Kafka propagates a topic, or the test cluster is still initializing - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); - Task.Delay(1000).GetAwaiter().GetResult(); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + await Task.Delay(1000); } } while (maxTries <= 10); @@ -145,3 +140,4 @@ public void Dispose() _consumer?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_should_include_metadata.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_should_include_metadata.cs index 6167c31dc2..cb63f96729 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_should_include_metadata.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_should_include_metadata.cs @@ -26,25 +26,20 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] +[Category("Kafka")] public class KafkaMessageConsumerMetadataTests : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly string _dlqTopic; private readonly KafkaMessageProducer _producer; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaMessageConsumerMetadataTests(ITestOutputHelper output) + public KafkaMessageConsumerMetadataTests() { - _output = output; _dlqTopic = $"{_topic}.dlq"; //Arrange - create producer for the data topic @@ -69,7 +64,7 @@ public KafkaMessageConsumerMetadataTests(ITestOutputHelper output) _producer.Init(); } - [Fact] + [Test] public async Task When_rejecting_message_should_include_metadata() { //Arrange - let topics propagate in the broker @@ -85,7 +80,7 @@ public async Task When_rejecting_message_should_include_metadata() new MessageHeader(messageId, routingKey, MessageType.MT_COMMAND) { PartitionKey = _partitionKey }, new MessageBody($"test content for metadata verification") ); - _producer.Send(sentMessage); + await _producer.SendAsync(sentMessage); _producer.Flush(); //Act - consume and reject the message with a description @@ -93,21 +88,21 @@ public async Task When_rejecting_message_should_include_metadata() Message? receivedMessage; using (var consumer = CreateConsumer(groupId, dlqRoutingKey)) { - receivedMessage = ConsumeMessage(consumer); - Assert.Equal(messageId, receivedMessage.Id); + receivedMessage = await ConsumeMessage(consumer); + await Assert.That(receivedMessage.Id).IsEqualTo(messageId); - _output.WriteLine($"About to reject message {messageId} with DeliveryError"); + Console.WriteLine($"About to reject message {messageId} with DeliveryError"); //reject with DeliveryError reason and description consumer.Reject(receivedMessage, new MessageRejectionReason(RejectionReason.DeliveryError, rejectionDescription)); - _output.WriteLine($"Message {messageId} rejected, waiting for DLQ propagation"); + Console.WriteLine($"Message {messageId} rejected, waiting for DLQ propagation"); //yield to allow DLQ message to be produced and topic to be created await Task.Delay(TimeSpan.FromMilliseconds(3000)); } - _output.WriteLine("Creating DLQ consumer to verify metadata"); + Console.WriteLine("Creating DLQ consumer to verify metadata"); //yield to allow DLQ topic to propagate await Task.Delay(TimeSpan.FromMilliseconds(1000)); @@ -115,41 +110,41 @@ public async Task When_rejecting_message_should_include_metadata() //Assert - verify message appears on DLQ with all required metadata using (var dlqConsumer = CreateDLQConsumer(groupId)) { - _output.WriteLine("Attempting to consume from DLQ"); - var dlqMessage = ConsumeMessage(dlqConsumer); + Console.WriteLine("Attempting to consume from DLQ"); + var dlqMessage = await ConsumeMessage(dlqConsumer); - Assert.NotNull(dlqMessage); - Assert.Equal(receivedMessage.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage).IsNotNull(); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(receivedMessage.Body.Value); //verify OriginalTopic metadata - Assert.True(dlqMessage.Header.Bag.ContainsKey(HeaderNames.ORIGINAL_TOPIC), "OriginalTopic metadata missing"); - Assert.Equal(_topic, dlqMessage.Header.Bag[HeaderNames.ORIGINAL_TOPIC]); - _output.WriteLine($"✓ OriginalTopic: {dlqMessage.Header.Bag[HeaderNames.ORIGINAL_TOPIC]}"); + await Assert.That(dlqMessage.Header.Bag.ContainsKey(HeaderNames.ORIGINAL_TOPIC)).IsTrue(); + await Assert.That(dlqMessage.Header.Bag[HeaderNames.ORIGINAL_TOPIC]).IsEqualTo(_topic); + Console.WriteLine($"✓ OriginalTopic: {dlqMessage.Header.Bag[HeaderNames.ORIGINAL_TOPIC]}"); //verify RejectionTimestamp metadata - Assert.True(dlqMessage.Header.Bag.ContainsKey(HeaderNames.REJECTION_TIMESTAMP), "RejectionTimestamp metadata missing"); + await Assert.That(dlqMessage.Header.Bag.ContainsKey(HeaderNames.REJECTION_TIMESTAMP)).IsTrue(); var rejectionTimestamp = dlqMessage.Header.Bag[HeaderNames.REJECTION_TIMESTAMP] as string; - Assert.NotNull(rejectionTimestamp); - Assert.True(DateTimeOffset.TryParse(rejectionTimestamp, out var parsedTimestamp), "RejectionTimestamp should be parseable ISO format"); - Assert.True(DateTimeOffset.UtcNow - parsedTimestamp < TimeSpan.FromMinutes(1), "RejectionTimestamp should be recent"); - _output.WriteLine($"✓ RejectionTimestamp: {rejectionTimestamp}"); + await Assert.That(rejectionTimestamp).IsNotNull(); + await Assert.That(DateTimeOffset.TryParse(rejectionTimestamp, out var parsedTimestamp)).IsTrue(); + await Assert.That(DateTimeOffset.UtcNow - parsedTimestamp < TimeSpan.FromMinutes(1), "RejectionTimestamp should be recent").IsTrue(); + Console.WriteLine($"✓ RejectionTimestamp: {rejectionTimestamp}"); //verify RejectionReason metadata - Assert.True(dlqMessage.Header.Bag.ContainsKey(HeaderNames.REJECTION_REASON), "RejectionReason metadata missing"); - Assert.Equal("DeliveryError", dlqMessage.Header.Bag[HeaderNames.REJECTION_REASON]); - _output.WriteLine($"✓ RejectionReason: {dlqMessage.Header.Bag[HeaderNames.REJECTION_REASON]}"); + await Assert.That(dlqMessage.Header.Bag.ContainsKey(HeaderNames.REJECTION_REASON)).IsTrue(); + await Assert.That(dlqMessage.Header.Bag[HeaderNames.REJECTION_REASON]).IsEqualTo("DeliveryError"); + Console.WriteLine($"✓ RejectionReason: {dlqMessage.Header.Bag[HeaderNames.REJECTION_REASON]}"); //verify RejectionMessage metadata (optional description) - Assert.True(dlqMessage.Header.Bag.ContainsKey(HeaderNames.REJECTION_MESSAGE), "RejectionMessage metadata missing"); - Assert.Equal(rejectionDescription, dlqMessage.Header.Bag[HeaderNames.REJECTION_MESSAGE]); - _output.WriteLine($"✓ RejectionMessage: {dlqMessage.Header.Bag[HeaderNames.REJECTION_MESSAGE]}"); + await Assert.That(dlqMessage.Header.Bag.ContainsKey(HeaderNames.REJECTION_MESSAGE)).IsTrue(); + await Assert.That(dlqMessage.Header.Bag[HeaderNames.REJECTION_MESSAGE]).IsEqualTo(rejectionDescription); + Console.WriteLine($"✓ RejectionMessage: {dlqMessage.Header.Bag[HeaderNames.REJECTION_MESSAGE]}"); //verify MessageType metadata - Assert.True(dlqMessage.Header.Bag.ContainsKey(HeaderNames.ORIGINAL_TYPE), "MessageType metadata missing"); - Assert.Equal("MT_COMMAND", dlqMessage.Header.Bag[HeaderNames.ORIGINAL_TYPE]); - _output.WriteLine($"✓ MessageType: {dlqMessage.Header.Bag[HeaderNames.ORIGINAL_TYPE]}"); + await Assert.That(dlqMessage.Header.Bag.ContainsKey(HeaderNames.ORIGINAL_TYPE)).IsTrue(); + await Assert.That(dlqMessage.Header.Bag[HeaderNames.ORIGINAL_TYPE]).IsEqualTo("MT_COMMAND"); + Console.WriteLine($"✓ MessageType: {dlqMessage.Header.Bag[HeaderNames.ORIGINAL_TYPE]}"); - _output.WriteLine("All metadata fields verified successfully"); + Console.WriteLine("All metadata fields verified successfully"); } } @@ -198,7 +193,7 @@ private IAmAMessageConsumerSync CreateDLQConsumer(string groupId) )); } - private Message ConsumeMessage(IAmAMessageConsumerSync consumer) + private async Task ConsumeMessage(IAmAMessageConsumerSync consumer) { int maxTries = 0; do @@ -215,8 +210,8 @@ private Message ConsumeMessage(IAmAMessageConsumerSync consumer) } catch (ChannelFailureException cfx) { - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); - Task.Delay(1000).GetAwaiter().GetResult(); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + await Task.Delay(1000); } } while (maxTries <= 10); @@ -228,3 +223,4 @@ public void Dispose() _producer?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs index ddfb0e6dc3..e57922bbd4 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs @@ -26,25 +26,20 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] +[Category("Kafka")] public class KafkaMessageConsumerDLQTests : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly string _dlqTopic; private readonly KafkaMessageProducer _producer; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaMessageConsumerDLQTests(ITestOutputHelper output) + public KafkaMessageConsumerDLQTests() { - _output = output; _dlqTopic = $"{_topic}.dlq"; // Create producer directly for the data topic @@ -69,7 +64,7 @@ public KafkaMessageConsumerDLQTests(ITestOutputHelper output) _producer.Init(); } - [Fact] + [Test] public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq() { //Arrange - let topics propagate in the broker @@ -85,28 +80,28 @@ public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq( new MessageHeader(messageId, routingKey, MessageType.MT_COMMAND) { PartitionKey = _partitionKey }, new MessageBody($"test content for DLQ") ); - _producer.Send(sentMessage); + await _producer.SendAsync(sentMessage); _producer.Flush(); //Act - consume and reject the message Message? receivedMessage; using (var consumer = CreateConsumer(groupId, dlqRoutingKey)) { - receivedMessage = ConsumeMessage(consumer); - Assert.Equal(messageId, receivedMessage.Id); + receivedMessage = await ConsumeMessage(consumer); + await Assert.That(receivedMessage.Id).IsEqualTo(messageId); - _output.WriteLine($"About to reject message {messageId} with DeliveryError"); + Console.WriteLine($"About to reject message {messageId} with DeliveryError"); //reject with DeliveryError reason consumer.Reject(receivedMessage, new MessageRejectionReason(RejectionReason.DeliveryError, "Test delivery error")); - _output.WriteLine($"Message {messageId} rejected, waiting for DLQ propagation"); + Console.WriteLine($"Message {messageId} rejected, waiting for DLQ propagation"); //yield to allow DLQ message to be produced and topic to be created await Task.Delay(TimeSpan.FromMilliseconds(3000)); } - _output.WriteLine("Creating DLQ consumer"); + Console.WriteLine("Creating DLQ consumer"); //yield to allow DLQ topic to propagate await Task.Delay(TimeSpan.FromMilliseconds(1000)); @@ -114,17 +109,17 @@ public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq( //Assert - verify message appears on DLQ using (var dlqConsumer = CreateDLQConsumer(groupId)) { - _output.WriteLine("Attempting to consume from DLQ"); - var dlqMessage = ConsumeMessage(dlqConsumer); + Console.WriteLine("Attempting to consume from DLQ"); + var dlqMessage = await ConsumeMessage(dlqConsumer); - Assert.NotNull(dlqMessage); - Assert.Equal(MessageType.MT_COMMAND, dlqMessage.Header.MessageType); - Assert.Equal(receivedMessage.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage).IsNotNull(); + await Assert.That(dlqMessage.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(receivedMessage.Body.Value); //verify rejection metadata was added - Assert.True(dlqMessage.Header.Bag.ContainsKey("OriginalTopic")); - Assert.Equal(_topic, dlqMessage.Header.Bag["OriginalTopic"]); - Assert.True(dlqMessage.Header.Bag.ContainsKey("RejectionReason")); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("OriginalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["OriginalTopic"]).IsEqualTo(_topic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("RejectionReason")).IsTrue(); } } @@ -173,7 +168,7 @@ private IAmAMessageConsumerSync CreateDLQConsumer(string groupId) )); } - private Message ConsumeMessage(IAmAMessageConsumerSync consumer) + private async Task ConsumeMessage(IAmAMessageConsumerSync consumer) { int maxTries = 0; do @@ -190,8 +185,8 @@ private Message ConsumeMessage(IAmAMessageConsumerSync consumer) } catch (ChannelFailureException cfx) { - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); - Task.Delay(1000).GetAwaiter().GetResult(); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + await Task.Delay(1000); } } while (maxTries <= 10); @@ -203,3 +198,4 @@ public void Dispose() _producer?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log.cs index 80e51614c6..4a3c83ea38 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log.cs @@ -26,24 +26,19 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] +[Category("Kafka")] public class KafkaMessageConsumerNoChannelsTests : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly KafkaMessageProducer _producer; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaMessageConsumerNoChannelsTests(ITestOutputHelper output) + public KafkaMessageConsumerNoChannelsTests() { - _output = output; // Create producer directly for the data topic var publication = new KafkaPublication @@ -67,7 +62,7 @@ public KafkaMessageConsumerNoChannelsTests(ITestOutputHelper output) _producer.Init(); } - [Fact] + [Test] public async Task When_rejecting_message_with_no_channels_configured_should_acknowledge_and_log() { //Arrange - let topics propagate in the broker @@ -82,37 +77,37 @@ public async Task When_rejecting_message_with_no_channels_configured_should_ackn new MessageHeader(messageId1, routingKey, MessageType.MT_COMMAND) { PartitionKey = _partitionKey }, new MessageBody($"test message 1 - should be rejected") ); - _producer.Send(sentMessage1); + await _producer.SendAsync(sentMessage1); var messageId2 = Guid.NewGuid().ToString(); var sentMessage2 = new Message( new MessageHeader(messageId2, routingKey, MessageType.MT_COMMAND) { PartitionKey = _partitionKey }, new MessageBody($"test message 2 - should be received after rejection") ); - _producer.Send(sentMessage2); + await _producer.SendAsync(sentMessage2); _producer.Flush(); //Act - consume and reject the first message, then consume the second using (var consumer = CreateConsumerWithNoChannels(groupId)) { - var receivedMessage1 = ConsumeMessage(consumer); - Assert.Equal(messageId1, receivedMessage1.Id); + var receivedMessage1 = await ConsumeMessage(consumer); + await Assert.That(receivedMessage1.Id).IsEqualTo(messageId1); - _output.WriteLine($"About to reject message {messageId1} with no channels configured"); + Console.WriteLine($"About to reject message {messageId1} with no channels configured"); //reject with no channels configured - should acknowledge and log warning var rejected = consumer.Reject(receivedMessage1, new MessageRejectionReason(RejectionReason.DeliveryError, "Test rejection with no channels")); - _output.WriteLine($"Message {messageId1} rejected, attempting to consume next message"); + Console.WriteLine($"Message {messageId1} rejected, attempting to consume next message"); //Assert - verify rejection returned true and we can consume the next message - Assert.True(rejected, "Reject should return true even with no channels"); + await Assert.That(rejected).IsTrue(); //verify we can consume the next message (proving first was acknowledged) - var receivedMessage2 = ConsumeMessage(consumer); - Assert.Equal(messageId2, receivedMessage2.Id); + var receivedMessage2 = await ConsumeMessage(consumer); + await Assert.That(receivedMessage2.Id).IsEqualTo(messageId2); - _output.WriteLine($"Successfully consumed message {messageId2} after rejection"); + Console.WriteLine($"Successfully consumed message {messageId2} after rejection"); } //Additional verification: ensure no messages were sent to non-existent DLQ @@ -143,7 +138,7 @@ private IAmAMessageConsumerSync CreateConsumerWithNoChannels(string groupId) )); } - private Message ConsumeMessage(IAmAMessageConsumerSync consumer) + private async Task ConsumeMessage(IAmAMessageConsumerSync consumer) { int maxTries = 0; do @@ -160,8 +155,8 @@ private Message ConsumeMessage(IAmAMessageConsumerSync consumer) } catch (ChannelFailureException cfx) { - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); - Task.Delay(1000).GetAwaiter().GetResult(); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + await Task.Delay(1000); } } while (maxTries <= 10); @@ -173,3 +168,4 @@ public void Dispose() _producer?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs index 6dadd2475a..6162f6df3b 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs @@ -26,25 +26,20 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] +[Category("Kafka")] public class KafkaMessageConsumerInvalidMessageFallbackTests : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly string _dlqTopic; private readonly KafkaMessageProducer _producer; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaMessageConsumerInvalidMessageFallbackTests(ITestOutputHelper output) + public KafkaMessageConsumerInvalidMessageFallbackTests() { - _output = output; _dlqTopic = $"{_topic}.dlq"; // Create producer directly for the data topic @@ -69,7 +64,7 @@ public KafkaMessageConsumerInvalidMessageFallbackTests(ITestOutputHelper output) _producer.Init(); } - [Fact] + [Test] public async Task When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq() { //Arrange - let topics propagate in the broker @@ -85,28 +80,28 @@ public async Task When_rejecting_message_with_unacceptable_and_no_invalid_channe new MessageHeader(messageId, routingKey, MessageType.MT_COMMAND) { PartitionKey = _partitionKey }, new MessageBody($"test content for invalid message fallback") ); - _producer.Send(sentMessage); + await _producer.SendAsync(sentMessage); _producer.Flush(); //Act - consume and reject the message with Unacceptable reason Message? receivedMessage; using (var consumer = CreateConsumerWithDlqOnly(groupId, dlqRoutingKey)) { - receivedMessage = ConsumeMessage(consumer); - Assert.Equal(messageId, receivedMessage.Id); + receivedMessage = await ConsumeMessage(consumer); + await Assert.That(receivedMessage.Id).IsEqualTo(messageId); - _output.WriteLine($"About to reject message {messageId} with Unacceptable reason (no invalid channel configured)"); + Console.WriteLine($"About to reject message {messageId} with Unacceptable reason (no invalid channel configured)"); //reject with Unacceptable reason - should fall back to DLQ since no invalid channel configured consumer.Reject(receivedMessage, new MessageRejectionReason(RejectionReason.Unacceptable, "Test unacceptable message fallback")); - _output.WriteLine($"Message {messageId} rejected, waiting for DLQ propagation"); + Console.WriteLine($"Message {messageId} rejected, waiting for DLQ propagation"); //yield to allow DLQ message to be produced and topic to be created await Task.Delay(TimeSpan.FromMilliseconds(3000)); } - _output.WriteLine("Creating DLQ consumer"); + Console.WriteLine("Creating DLQ consumer"); //yield to allow DLQ topic to propagate await Task.Delay(TimeSpan.FromMilliseconds(1000)); @@ -114,18 +109,18 @@ public async Task When_rejecting_message_with_unacceptable_and_no_invalid_channe //Assert - verify message appears on DLQ (not invalid message channel) using (var dlqConsumer = CreateDLQConsumer(groupId)) { - _output.WriteLine("Attempting to consume from DLQ"); - var dlqMessage = ConsumeMessage(dlqConsumer); + Console.WriteLine("Attempting to consume from DLQ"); + var dlqMessage = await ConsumeMessage(dlqConsumer); - Assert.NotNull(dlqMessage); - Assert.Equal(MessageType.MT_COMMAND, dlqMessage.Header.MessageType); - Assert.Equal(receivedMessage.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage).IsNotNull(); + await Assert.That(dlqMessage.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(receivedMessage.Body.Value); //verify rejection metadata was added - Assert.True(dlqMessage.Header.Bag.ContainsKey("OriginalTopic")); - Assert.Equal(_topic, dlqMessage.Header.Bag["OriginalTopic"]); - Assert.True(dlqMessage.Header.Bag.ContainsKey("RejectionReason")); - Assert.Equal("Unacceptable", dlqMessage.Header.Bag["RejectionReason"]); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("OriginalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["OriginalTopic"]).IsEqualTo(_topic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("RejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["RejectionReason"]).IsEqualTo("Unacceptable"); } } @@ -175,7 +170,7 @@ private IAmAMessageConsumerSync CreateDLQConsumer(string groupId) )); } - private Message ConsumeMessage(IAmAMessageConsumerSync consumer) + private async Task ConsumeMessage(IAmAMessageConsumerSync consumer) { int maxTries = 0; do @@ -192,8 +187,8 @@ private Message ConsumeMessage(IAmAMessageConsumerSync consumer) } catch (ChannelFailureException cfx) { - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); - Task.Delay(1000).GetAwaiter().GetResult(); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + await Task.Delay(1000); } } while (maxTries <= 10); @@ -205,3 +200,4 @@ public void Dispose() _producer?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs index d7a9ea7078..39f0a8c6c8 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs @@ -26,25 +26,20 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] +[Category("Kafka")] public class KafkaMessageConsumerInvalidMessageTests : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly string _invalidMessageTopic; private readonly KafkaMessageProducer _producer; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaMessageConsumerInvalidMessageTests(ITestOutputHelper output) + public KafkaMessageConsumerInvalidMessageTests() { - _output = output; _invalidMessageTopic = $"{_topic}.invalid"; // Create producer directly for the data topic @@ -69,7 +64,7 @@ public KafkaMessageConsumerInvalidMessageTests(ITestOutputHelper output) _producer.Init(); } - [Fact] + [Test] public async Task When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel() { //Arrange - let topics propagate in the broker @@ -85,28 +80,28 @@ public async Task When_rejecting_message_with_unacceptable_reason_should_send_to new MessageHeader(messageId, routingKey, MessageType.MT_COMMAND) { PartitionKey = _partitionKey }, new MessageBody($"test content for invalid message channel") ); - _producer.Send(sentMessage); + await _producer.SendAsync(sentMessage); _producer.Flush(); //Act - consume and reject the message Message? receivedMessage; using (var consumer = CreateConsumer(groupId, invalidMessageRoutingKey)) { - receivedMessage = ConsumeMessage(consumer); - Assert.Equal(messageId, receivedMessage.Id); + receivedMessage = await ConsumeMessage(consumer); + await Assert.That(receivedMessage.Id).IsEqualTo(messageId); - _output.WriteLine($"About to reject message {messageId} with Unacceptable reason"); + Console.WriteLine($"About to reject message {messageId} with Unacceptable reason"); //reject with Unacceptable reason consumer.Reject(receivedMessage, new MessageRejectionReason(RejectionReason.Unacceptable, "Test unacceptable message")); - _output.WriteLine($"Message {messageId} rejected, waiting for invalid message channel propagation"); + Console.WriteLine($"Message {messageId} rejected, waiting for invalid message channel propagation"); //yield to allow invalid message to be produced and topic to be created await Task.Delay(TimeSpan.FromMilliseconds(3000)); } - _output.WriteLine("Creating invalid message channel consumer"); + Console.WriteLine("Creating invalid message channel consumer"); //yield to allow invalid message topic to propagate await Task.Delay(TimeSpan.FromMilliseconds(1000)); @@ -114,18 +109,18 @@ public async Task When_rejecting_message_with_unacceptable_reason_should_send_to //Assert - verify message appears on invalid message channel using (var invalidMessageConsumer = CreateInvalidMessageConsumer(groupId)) { - _output.WriteLine("Attempting to consume from invalid message channel"); - var invalidMessage = ConsumeMessage(invalidMessageConsumer); + Console.WriteLine("Attempting to consume from invalid message channel"); + var invalidMessage = await ConsumeMessage(invalidMessageConsumer); - Assert.NotNull(invalidMessage); - Assert.Equal(MessageType.MT_COMMAND, invalidMessage.Header.MessageType); - Assert.Equal(receivedMessage.Body.Value, invalidMessage.Body.Value); + await Assert.That(invalidMessage).IsNotNull(); + await Assert.That(invalidMessage.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(invalidMessage.Body.Value).IsEqualTo(receivedMessage.Body.Value); //verify rejection metadata was added - Assert.True(invalidMessage.Header.Bag.ContainsKey("OriginalTopic")); - Assert.Equal(_topic, invalidMessage.Header.Bag["OriginalTopic"]); - Assert.True(invalidMessage.Header.Bag.ContainsKey("RejectionReason")); - Assert.Equal("Unacceptable", invalidMessage.Header.Bag["RejectionReason"]); + await Assert.That(invalidMessage.Header.Bag.ContainsKey("OriginalTopic")).IsTrue(); + await Assert.That(invalidMessage.Header.Bag["OriginalTopic"]).IsEqualTo(_topic); + await Assert.That(invalidMessage.Header.Bag.ContainsKey("RejectionReason")).IsTrue(); + await Assert.That(invalidMessage.Header.Bag["RejectionReason"]).IsEqualTo("Unacceptable"); } } @@ -174,7 +169,7 @@ private IAmAMessageConsumerSync CreateInvalidMessageConsumer(string groupId) )); } - private Message ConsumeMessage(IAmAMessageConsumerSync consumer) + private async Task ConsumeMessage(IAmAMessageConsumerSync consumer) { int maxTries = 0; do @@ -191,8 +186,8 @@ private Message ConsumeMessage(IAmAMessageConsumerSync consumer) } catch (ChannelFailureException cfx) { - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); - Task.Delay(1000).GetAwaiter().GetResult(); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + await Task.Delay(1000); } } while (maxTries <= 10); @@ -204,3 +199,4 @@ public void Dispose() _producer?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unknown_reason_should_send_to_dlq.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unknown_reason_should_send_to_dlq.cs index 0a89922330..a23b323bc2 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unknown_reason_should_send_to_dlq.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unknown_reason_should_send_to_dlq.cs @@ -26,25 +26,20 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] +[Category("Kafka")] public class KafkaMessageConsumerUnknownReasonTests : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly string _dlqTopic; private readonly KafkaMessageProducer _producer; private readonly string _partitionKey = Guid.NewGuid().ToString(); - public KafkaMessageConsumerUnknownReasonTests(ITestOutputHelper output) + public KafkaMessageConsumerUnknownReasonTests() { - _output = output; _dlqTopic = $"{_topic}.dlq"; // Create producer directly for the data topic @@ -69,7 +64,7 @@ public KafkaMessageConsumerUnknownReasonTests(ITestOutputHelper output) _producer.Init(); } - [Fact] + [Test] public async Task When_rejecting_message_with_unknown_reason_should_send_to_dlq() { //Arrange - let topics propagate in the broker @@ -85,28 +80,28 @@ public async Task When_rejecting_message_with_unknown_reason_should_send_to_dlq( new MessageHeader(messageId, routingKey, MessageType.MT_COMMAND) { PartitionKey = _partitionKey }, new MessageBody($"test content for unknown reason") ); - _producer.Send(sentMessage); + await _producer.SendAsync(sentMessage); _producer.Flush(); //Act - consume and reject the message with unknown reason (None) Message? receivedMessage; using (var consumer = CreateConsumer(groupId, dlqRoutingKey)) { - receivedMessage = ConsumeMessage(consumer); - Assert.Equal(messageId, receivedMessage.Id); + receivedMessage = await ConsumeMessage(consumer); + await Assert.That(receivedMessage.Id).IsEqualTo(messageId); - _output.WriteLine($"About to reject message {messageId} with unknown reason (None)"); + Console.WriteLine($"About to reject message {messageId} with unknown reason (None)"); //reject with None reason - should route to DLQ via default case consumer.Reject(receivedMessage, new MessageRejectionReason(RejectionReason.None, "Test unknown rejection reason")); - _output.WriteLine($"Message {messageId} rejected, waiting for DLQ propagation"); + Console.WriteLine($"Message {messageId} rejected, waiting for DLQ propagation"); //yield to allow DLQ message to be produced and topic to be created await Task.Delay(TimeSpan.FromMilliseconds(3000)); } - _output.WriteLine("Creating DLQ consumer"); + Console.WriteLine("Creating DLQ consumer"); //yield to allow DLQ topic to propagate await Task.Delay(TimeSpan.FromMilliseconds(1000)); @@ -114,18 +109,18 @@ public async Task When_rejecting_message_with_unknown_reason_should_send_to_dlq( //Assert - verify message appears on DLQ (default routing behavior) using (var dlqConsumer = CreateDLQConsumer(groupId)) { - _output.WriteLine("Attempting to consume from DLQ"); - var dlqMessage = ConsumeMessage(dlqConsumer); + Console.WriteLine("Attempting to consume from DLQ"); + var dlqMessage = await ConsumeMessage(dlqConsumer); - Assert.NotNull(dlqMessage); - Assert.Equal(MessageType.MT_COMMAND, dlqMessage.Header.MessageType); - Assert.Equal(receivedMessage.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage).IsNotNull(); + await Assert.That(dlqMessage.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(receivedMessage.Body.Value); //verify rejection metadata was added - Assert.True(dlqMessage.Header.Bag.ContainsKey("OriginalTopic")); - Assert.Equal(_topic, dlqMessage.Header.Bag["OriginalTopic"]); - Assert.True(dlqMessage.Header.Bag.ContainsKey("RejectionReason")); - Assert.Equal("None", dlqMessage.Header.Bag["RejectionReason"]); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("OriginalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["OriginalTopic"]).IsEqualTo(_topic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("RejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["RejectionReason"]).IsEqualTo("None"); } } @@ -174,7 +169,7 @@ private IAmAMessageConsumerSync CreateDLQConsumer(string groupId) )); } - private Message ConsumeMessage(IAmAMessageConsumerSync consumer) + private async Task ConsumeMessage(IAmAMessageConsumerSync consumer) { int maxTries = 0; do @@ -191,8 +186,8 @@ private Message ConsumeMessage(IAmAMessageConsumerSync consumer) } catch (ChannelFailureException cfx) { - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); - Task.Delay(1000).GetAwaiter().GetResult(); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + await Task.Delay(1000); } } while (maxTries <= 10); @@ -204,3 +199,4 @@ public void Dispose() _producer?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_revoked_partitions_offsets_are_committed.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_revoked_partitions_offsets_are_committed.cs index 6591aa748f..0c4d0e563b 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_revoked_partitions_offsets_are_committed.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_revoked_partitions_offsets_are_committed.cs @@ -5,25 +5,20 @@ using Confluent.Kafka; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Trait("Fragile", "CI")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition +[Category("Kafka")] +[Property("Fragile", "CI")] public class KafkaMessageConsumerCommitOnRevoke : IDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly IAmAProducerRegistry _producerRegistry; private readonly string _groupId = Guid.NewGuid().ToString(); - public KafkaMessageConsumerCommitOnRevoke(ITestOutputHelper output) + public KafkaMessageConsumerCommitOnRevoke() { - _output = output; _producerRegistry = new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration { @@ -57,9 +52,9 @@ public KafkaMessageConsumerCommitOnRevoke(ITestOutputHelper output) /// 3. The revoke handler on A should commit the outstanding offsets from the second batch /// 4. A new consumer C verifies it reads from the fully committed position (no replay) /// - [Theory] - [InlineData(PartitionAssignmentStrategy.RoundRobin)] - [InlineData(PartitionAssignmentStrategy.CooperativeSticky)] + [Test] + [Arguments(PartitionAssignmentStrategy.RoundRobin)] + [Arguments(PartitionAssignmentStrategy.CooperativeSticky)] public async Task When_a_partition_is_revoked_offsets_are_committed( PartitionAssignmentStrategy partitionAssignmentStrategy) { @@ -93,15 +88,15 @@ public async Task When_a_partition_is_revoked_offsets_are_committed( var firstBatchIds = new List(); for (int j = 0; j < 5; j++) { - var msg = ReadMessage(consumerA); + var msg = await ReadMessage(consumerA); if (msg.Header.MessageType != MessageType.MT_NONE) { - consumerA.Acknowledge(msg); + await consumerA.AcknowledgeAsync(msg); firstBatchIds.Add(msg.Id); } } - _output.WriteLine($"Consumer A first batch: {firstBatchIds.Count} messages acknowledged and batch-committed"); + Console.WriteLine($"Consumer A first batch: {firstBatchIds.Count} messages acknowledged and batch-committed"); //wait for the background batch commit to complete await Task.Delay(3000); @@ -110,36 +105,36 @@ public async Task When_a_partition_is_revoked_offsets_are_committed( var secondBatchIds = new List(); for (int j = 0; j < 5; j++) { - var msg = ReadMessage(consumerA); + var msg = await ReadMessage(consumerA); if (msg.Header.MessageType != MessageType.MT_NONE) { - consumerA.Acknowledge(msg); + await consumerA.AcknowledgeAsync(msg); secondBatchIds.Add(msg.Id); } } - _output.WriteLine($"Consumer A second batch: {secondBatchIds.Count} messages acknowledged but not batch-committed"); - _output.WriteLine($"Consumer A stored offsets: {consumerA.StoredOffsets()}"); + Console.WriteLine($"Consumer A second batch: {secondBatchIds.Count} messages acknowledged but not batch-committed"); + Console.WriteLine($"Consumer A stored offsets: {consumerA.StoredOffsets()}"); var allConsumedIds = firstBatchIds.Concat(secondBatchIds).ToHashSet(); - _output.WriteLine($"Total unique messages consumed by A: {allConsumedIds.Count}"); + Console.WriteLine($"Total unique messages consumed by A: {allConsumedIds.Count}"); //Phase 3: Consumer B joins the group — triggers rebalance and revoke on A //The revoke handler on A should commit the outstanding offsets from the second batch using var consumerB = CreateConsumer(commitBatchSize: 100, partitionAssignmentStrategy: partitionAssignmentStrategy); //consumer B polls to join the group - _ = consumerB.Receive(TimeSpan.FromMilliseconds(5000)); + _ = await consumerB.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); //consumer A polls to process the revoke callback - _ = consumerA.Receive(TimeSpan.FromMilliseconds(5000)); + _ = await consumerA.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); //allow rebalance to settle await Task.Delay(5000); //poll both once more to ensure rebalance completes - _ = consumerA.Receive(TimeSpan.FromMilliseconds(2000)); - _ = consumerB.Receive(TimeSpan.FromMilliseconds(2000)); + _ = await consumerA.ReceiveAsync(TimeSpan.FromMilliseconds(2000)); + _ = await consumerB.ReceiveAsync(TimeSpan.FromMilliseconds(2000)); //close both consumers to release group membership consumerA.Close(); @@ -155,7 +150,7 @@ public async Task When_a_partition_is_revoked_offsets_are_committed( //try to read messages — any we get that A already consumed are replays for (int j = 0; j < 5; j++) { - var messages = consumerC.Receive(TimeSpan.FromMilliseconds(2000)); + var messages = await consumerC.ReceiveAsync(TimeSpan.FromMilliseconds(2000)); foreach (var msg in messages) { if (msg.Header.MessageType != MessageType.MT_NONE) @@ -163,11 +158,11 @@ public async Task When_a_partition_is_revoked_offsets_are_committed( if (allConsumedIds.Contains(msg.Id)) { replayedIds.Add(msg.Id); - _output.WriteLine($"Consumer C replayed message: {msg.Id}"); + Console.WriteLine($"Consumer C replayed message: {msg.Id}"); } else { - _output.WriteLine($"Consumer C read new message: {msg.Id}"); + Console.WriteLine($"Consumer C read new message: {msg.Id}"); } } } @@ -175,9 +170,9 @@ public async Task When_a_partition_is_revoked_offsets_are_committed( //the second batch offsets should have been committed during revoke — no replays var secondBatchReplays = replayedIds.Where(id => secondBatchIds.Contains(id)).ToList(); - _output.WriteLine($"Second batch messages replayed: {secondBatchReplays.Count} of {secondBatchIds.Count}"); + Console.WriteLine($"Second batch messages replayed: {secondBatchReplays.Count} of {secondBatchIds.Count}"); - Assert.Empty(secondBatchReplays); + await Assert.That(secondBatchReplays).IsEmpty(); } private KafkaMessageConsumer CreateConsumer(int commitBatchSize, @@ -203,7 +198,7 @@ private KafkaMessageConsumer CreateConsumer(int commitBatchSize, )); } - private Message ReadMessage(KafkaMessageConsumer consumer) + private async Task ReadMessage(KafkaMessageConsumer consumer) { Message[] messages = [new Message()]; int maxTries = 0; @@ -212,7 +207,7 @@ private Message ReadMessage(KafkaMessageConsumer consumer) try { maxTries++; - messages = consumer.Receive(TimeSpan.FromMilliseconds(1000)); + messages = await consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); if (messages[0].Header.MessageType != MessageType.MT_NONE) { @@ -221,8 +216,8 @@ private Message ReadMessage(KafkaMessageConsumer consumer) } catch (ChannelFailureException cfx) { - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); - Task.Delay(1000).GetAwaiter().GetResult(); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + await Task.Delay(1000); } } while (maxTries <= 10); @@ -234,3 +229,4 @@ public void Dispose() _producerRegistry?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_sweeper_timeout_reached_should_commit_uncommitted_offsets_async.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_sweeper_timeout_reached_should_commit_uncommitted_offsets_async.cs index ef04eea8d2..be6e8aae95 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_sweeper_timeout_reached_should_commit_uncommitted_offsets_async.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_sweeper_timeout_reached_should_commit_uncommitted_offsets_async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2025 Rafael Andrade @@ -27,16 +27,12 @@ THE SOFTWARE. */ using Microsoft.Extensions.Time.Testing; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; -[Trait("Category", "Kafka")] -[Collection("Kafka")] //Kafka doesn't like multiple consumers of a partition -public class WhenSweeperTimeoutReachedShouldCommitUncommittedOffsets : IAsyncDisposable, IDisposable +[Category("Kafka")] +public class WhenSweeperTimeoutReachedShouldCommitUncommittedOffsets : IAsyncDisposable { - private readonly ITestOutputHelper _output; private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topic = Guid.NewGuid().ToString(); private readonly IAmAProducerRegistry _producerRegistry; @@ -44,10 +40,9 @@ public class WhenSweeperTimeoutReachedShouldCommitUncommittedOffsets : IAsyncDis private readonly string _partitionKey = Guid.NewGuid().ToString(); private readonly FakeTimeProvider _fakeTimeProvider; - public WhenSweeperTimeoutReachedShouldCommitUncommittedOffsets(ITestOutputHelper output) + public WhenSweeperTimeoutReachedShouldCommitUncommittedOffsets() { var groupId = Uuid.New().ToString("N"); - _output = output; _producerRegistry = new KafkaProducerRegistryFactory( new KafkaMessagingGatewayConfiguration @@ -93,12 +88,12 @@ public WhenSweeperTimeoutReachedShouldCommitUncommittedOffsets(ITestOutputHelper .Create(subscription); } - [Fact] - public void When_sweeper_timeout_reached_should_commit_uncommitted_offsets() + [Test] + public async Task When_sweeper_timeout_reached_should_commit_uncommitted_offsets() { //Arrange //allow time for topic to propagate - Task.Delay(1000).GetAwaiter().GetResult(); + await Task.Delay(1000); var routingKey = new RoutingKey(_topic); var producerAsync = _producerRegistry.LookupSyncBy(routingKey); @@ -119,31 +114,31 @@ public void When_sweeper_timeout_reached_should_commit_uncommitted_offsets() ((KafkaMessageProducer)producerAsync).Flush(); //allow messages to propagate on the broker - Task.Delay(3000).GetAwaiter().GetResult(); + await Task.Delay(3000); var consumedMessages = new List(); for (int j = 0; j < 5; j++) { - consumedMessages.Add(ReadMessage()); + consumedMessages.Add(await ReadMessage()); } //Assert - messages consumed and acknowledged but not yet committed - Assert.Equal(5, consumedMessages.Count); - Assert.Equal(5, _consumer.StoredOffsets()); + await Assert.That(consumedMessages.Count).IsEqualTo(5); + await Assert.That(_consumer.StoredOffsets()).IsEqualTo(5); //Act - Advance time beyond the sweeper interval (30 seconds) _fakeTimeProvider.Advance(TimeSpan.FromSeconds(31)); //Allow the timer callback to execute - Task.Delay(2000).GetAwaiter().GetResult(); + await Task.Delay(2000); //Assert - Sweeper should have committed the offsets - Assert.Equal(0, _consumer.StoredOffsets()); + await Assert.That(_consumer.StoredOffsets()).IsEqualTo(0); _consumer.Close(); } - private Message ReadMessage() + private async Task ReadMessage() { Message[] messages = [new Message()]; int maxTries = 0; @@ -152,33 +147,34 @@ private Message ReadMessage() try { maxTries++; - Task.Delay(500).GetAwaiter().GetResult(); //Let topic propagate in the broker - messages = _consumer.Receive(TimeSpan.FromMilliseconds(1000)); + await Task.Delay(500); //Let topic propagate in the broker + messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); if (messages[0].Header.MessageType != MessageType.MT_NONE) { - _consumer.Acknowledge(messages[0]); + await _consumer.AcknowledgeAsync(messages[0]); return messages[0]; } //wait before retry - Task.Delay(1000).GetAwaiter().GetResult(); + await Task.Delay(1000); } catch (ChannelFailureException cfx) { //Lots of reasons to be here as Kafka propagates a topic, or the test cluster is still initializing - _output.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); - Task.Delay(1000).GetAwaiter().GetResult(); + Console.WriteLine($" Failed to read from topic:{_topic} because {cfx.Message} attempt: {maxTries}"); + await Task.Delay(1000); } } while (maxTries <= 10); return messages[0]; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { _producerRegistry?.Dispose(); - _consumer.Dispose(); + await _consumer.DisposeAsync(); } public async ValueTask DisposeAsync() @@ -187,3 +183,4 @@ public async ValueTask DisposeAsync() await _consumer.DisposeAsync(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_using_a_consumer_config_hook.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_using_a_consumer_config_hook.cs index 4520815ea6..469a77cd01 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_using_a_consumer_config_hook.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/Reactor/When_using_a_consumer_config_hook.cs @@ -1,7 +1,6 @@ -using System; +using System; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway.Reactor; @@ -9,8 +8,8 @@ public class ConsumerConfigHookTests { private bool _callbackCalled = false; - [Fact] - public void When_using_a_consumer_config_hook() + [Test] + public async Task When_using_a_consumer_config_hook() { //arrange var subscription = new KafkaSubscription( @@ -38,7 +37,7 @@ public void When_using_a_consumer_config_hook() ); //assert - Assert.NotNull(consumer); - Assert.True(_callbackCalled, "The consumer config hook should have been called."); + await Assert.That(consumer).IsNotNull(); + await Assert.That(_callbackCalled).IsTrue(); } } diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_creating_channel_with_dlq_subscription_should_pass_routing_keys.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_creating_channel_with_dlq_subscription_should_pass_routing_keys.cs index 9927511040..eb0f7e345e 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_creating_channel_with_dlq_subscription_should_pass_routing_keys.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_creating_channel_with_dlq_subscription_should_pass_routing_keys.cs @@ -26,7 +26,6 @@ THE SOFTWARE. */ using System.Reflection; using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway; @@ -46,8 +45,8 @@ public KafkaMessageConsumerFactoryDLQTests() }); } - [Fact] - public void When_creating_channel_with_dlq_subscription_should_pass_routing_keys() + [Test] + public async Task When_creating_channel_with_dlq_subscription_should_pass_routing_keys() { //Arrange var topic = Guid.NewGuid().ToString(); @@ -70,7 +69,7 @@ public void When_creating_channel_with_dlq_subscription_should_pass_routing_keys _consumer = _factory.Create(subscription); //Assert - verify the factory passed routing keys to the consumer - Assert.NotNull(_consumer); + await Assert.That(_consumer).IsNotNull(); // Use reflection to verify the private fields were set correctly var consumerType = _consumer.GetType(); @@ -79,17 +78,17 @@ public void When_creating_channel_with_dlq_subscription_should_pass_routing_keys var invalidRoutingKeyField = consumerType.GetField("_invalidMessageRoutingKey", BindingFlags.NonPublic | BindingFlags.Instance); - Assert.NotNull(dlqRoutingKeyField); - Assert.NotNull(invalidRoutingKeyField); + await Assert.That(dlqRoutingKeyField).IsNotNull(); + await Assert.That(invalidRoutingKeyField).IsNotNull(); var actualDlqRoutingKey = dlqRoutingKeyField.GetValue(_consumer) as RoutingKey; var actualInvalidRoutingKey = invalidRoutingKeyField.GetValue(_consumer) as RoutingKey; - Assert.NotNull(actualDlqRoutingKey); - Assert.Equal(dlqTopic, actualDlqRoutingKey.Value); + await Assert.That(actualDlqRoutingKey).IsNotNull(); + await Assert.That(actualDlqRoutingKey.Value).IsEqualTo(dlqTopic); - Assert.NotNull(actualInvalidRoutingKey); - Assert.Equal(invalidTopic, actualInvalidRoutingKey.Value); + await Assert.That(actualInvalidRoutingKey).IsNotNull(); + await Assert.That(actualInvalidRoutingKey.Value).IsEqualTo(invalidTopic); } public void Dispose() diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_creating_kafka_subscription_with_dead_letter_routing_key_should_expose_property.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_creating_kafka_subscription_with_dead_letter_routing_key_should_expose_property.cs index de530ebe77..cc4d331bde 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_creating_kafka_subscription_with_dead_letter_routing_key_should_expose_property.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_creating_kafka_subscription_with_dead_letter_routing_key_should_expose_property.cs @@ -24,14 +24,13 @@ THE SOFTWARE. */ using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway; public class KafkaSubscriptionDeadLetterSupportTests { - [Fact] - public void When_creating_kafka_subscription_with_dead_letter_routing_key_should_expose_property() + [Test] + public async Task When_creating_kafka_subscription_with_dead_letter_routing_key_should_expose_property() { //Arrange var deadLetterRoutingKey = new RoutingKey("orders.dlq"); @@ -46,8 +45,8 @@ public void When_creating_kafka_subscription_with_dead_letter_routing_key_should ); //Assert - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var dlqSupport = (IUseBrighterDeadLetterSupport)subscription; - Assert.Equal(deadLetterRoutingKey, dlqSupport.DeadLetterRoutingKey); + await Assert.That(dlqSupport.DeadLetterRoutingKey).IsEqualTo(deadLetterRoutingKey); } } diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_creating_kafka_subscription_with_invalid_message_routing_key_should_expose_property.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_creating_kafka_subscription_with_invalid_message_routing_key_should_expose_property.cs index 5f6f7db589..3132cb2d1b 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_creating_kafka_subscription_with_invalid_message_routing_key_should_expose_property.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_creating_kafka_subscription_with_invalid_message_routing_key_should_expose_property.cs @@ -24,14 +24,13 @@ THE SOFTWARE. */ using Paramore.Brighter.Kafka.Tests.TestDoubles; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway; public class KafkaSubscriptionInvalidMessageSupportTests { - [Fact] - public void When_creating_kafka_subscription_with_invalid_message_routing_key_should_expose_property() + [Test] + public async Task When_creating_kafka_subscription_with_invalid_message_routing_key_should_expose_property() { //Arrange var invalidMessageRoutingKey = new RoutingKey("orders.invalid"); @@ -46,8 +45,8 @@ public void When_creating_kafka_subscription_with_invalid_message_routing_key_sh ); //Assert - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var invalidSupport = (IUseBrighterInvalidMessageSupport)subscription; - Assert.Equal(invalidMessageRoutingKey, invalidSupport.InvalidMessageRoutingKey); + await Assert.That(invalidSupport.InvalidMessageRoutingKey).IsEqualTo(invalidMessageRoutingKey); } } diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_kafka_channel_factory_forwards_scheduler_to_consumers.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_kafka_channel_factory_forwards_scheduler_to_consumers.cs index 3e8da1b7d5..8c6ff15875 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_kafka_channel_factory_forwards_scheduler_to_consumers.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_kafka_channel_factory_forwards_scheduler_to_consumers.cs @@ -21,7 +21,6 @@ THE SOFTWARE. */ #endregion using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway; @@ -33,8 +32,8 @@ public class When_kafka_channel_factory_forwards_scheduler_to_consumers BootStrapServers = ["localhost:9092"] }; - [Fact] - public void Should_forward_scheduler_to_consumer_factory() + [Test] + public async Task Should_forward_scheduler_to_consumer_factory() { // Arrange — channel factory wrapping a consumer factory, no scheduler initially var consumerFactory = new KafkaMessageConsumerFactory(_configuration); @@ -45,11 +44,11 @@ public void Should_forward_scheduler_to_consumer_factory() ((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler = scheduler; // Assert — the consumer factory received the scheduler - Assert.Same(scheduler, consumerFactory.Scheduler); + await Assert.That(consumerFactory.Scheduler).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_read_scheduler_from_consumer_factory() + [Test] + public async Task Should_read_scheduler_from_consumer_factory() { // Arrange — consumer factory has a scheduler from construction var scheduler = new StubMessageScheduler(); @@ -57,7 +56,7 @@ public void Should_read_scheduler_from_consumer_factory() var channelFactory = new ChannelFactory(consumerFactory); // Assert — channel factory reads from the consumer factory - Assert.Same(scheduler, ((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler); + await Assert.That(((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler).IsSameReferenceAs(scheduler); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_kafka_channel_factory_has_scheduler_should_pass_to_consumers.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_kafka_channel_factory_has_scheduler_should_pass_to_consumers.cs index 8eb853f168..87b534a724 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_kafka_channel_factory_has_scheduler_should_pass_to_consumers.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_kafka_channel_factory_has_scheduler_should_pass_to_consumers.cs @@ -1,5 +1,4 @@ using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway; @@ -21,19 +20,19 @@ public class When_kafka_channel_factory_has_scheduler_should_pass_to_consumers makeChannels: OnMissingChannel.Assume ); - [Fact] - public void Should_implement_channel_factory_with_scheduler() + [Test] + public async Task Should_implement_channel_factory_with_scheduler() { // Arrange var consumerFactory = new KafkaMessageConsumerFactory(_configuration); var channelFactory = new ChannelFactory(consumerFactory); // Assert - Assert.IsAssignableFrom(channelFactory); + await Assert.That(channelFactory).IsAssignableTo(); } - [Fact] - public void Should_create_sync_channel_when_scheduler_set() + [Test] + public async Task Should_create_sync_channel_when_scheduler_set() { // Arrange var scheduler = new StubMessageScheduler(); @@ -45,12 +44,12 @@ public void Should_create_sync_channel_when_scheduler_set() var channel = channelFactory.CreateSyncChannel(_subscription); // Assert - Assert.NotNull(channel); - Assert.IsType(channel); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsTypeOf(); } - [Fact] - public void Should_create_async_channel_when_scheduler_set() + [Test] + public async Task Should_create_async_channel_when_scheduler_set() { // Arrange var scheduler = new StubMessageScheduler(); @@ -59,15 +58,15 @@ public void Should_create_async_channel_when_scheduler_set() ((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler = scheduler; // Act - var channel = channelFactory.CreateAsyncChannel(_subscription); + var channel = await channelFactory.CreateAsyncChannelAsync(_subscription); // Assert - Assert.NotNull(channel); - Assert.IsType(channel); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsTypeOf(); } - [Fact] - public void Should_create_channel_without_scheduler_for_backward_compat() + [Test] + public async Task Should_create_channel_without_scheduler_for_backward_compat() { // Arrange — no scheduler set var consumerFactory = new KafkaMessageConsumerFactory(_configuration); @@ -77,8 +76,8 @@ public void Should_create_channel_without_scheduler_for_backward_compat() var channel = channelFactory.CreateSyncChannel(_subscription); // Assert - Assert.NotNull(channel); - Assert.IsType(channel); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsTypeOf(); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_kafka_consumer_factory_creates_consumer_should_pass_scheduler.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_kafka_consumer_factory_creates_consumer_should_pass_scheduler.cs index 82fed7d829..46e1ee49bb 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_kafka_consumer_factory_creates_consumer_should_pass_scheduler.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_kafka_consumer_factory_creates_consumer_should_pass_scheduler.cs @@ -21,7 +21,6 @@ THE SOFTWARE. */ #endregion using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway; @@ -43,8 +42,8 @@ public class When_kafka_consumer_factory_creates_consumer_should_pass_scheduler makeChannels: OnMissingChannel.Assume ); - [Fact] - public void Should_create_consumer_when_scheduler_provided() + [Test] + public async Task Should_create_consumer_when_scheduler_provided() { // Arrange — factory constructed with a scheduler var scheduler = new StubMessageScheduler(); @@ -54,12 +53,12 @@ public void Should_create_consumer_when_scheduler_provided() var consumer = factory.Create(_subscription); // Assert — consumer is created successfully - Assert.NotNull(consumer); - Assert.IsType(consumer); + await Assert.That(consumer).IsNotNull(); + await Assert.That(consumer).IsTypeOf(); } - [Fact] - public void Should_create_async_consumer_when_scheduler_provided() + [Test] + public async Task Should_create_async_consumer_when_scheduler_provided() { // Arrange — factory constructed with a scheduler var scheduler = new StubMessageScheduler(); @@ -69,12 +68,12 @@ public void Should_create_async_consumer_when_scheduler_provided() var consumer = factory.CreateAsync(_subscription); // Assert — consumer is created successfully - Assert.NotNull(consumer); - Assert.IsType(consumer); + await Assert.That(consumer).IsNotNull(); + await Assert.That(consumer).IsTypeOf(); } - [Fact] - public void Should_create_consumer_without_scheduler_for_backward_compat() + [Test] + public async Task Should_create_consumer_without_scheduler_for_backward_compat() { // Arrange — factory constructed without a scheduler (backward compat) var factory = new KafkaMessageConsumerFactory(_configuration); @@ -83,8 +82,8 @@ public void Should_create_consumer_without_scheduler_for_backward_compat() var consumer = factory.Create(_subscription); // Assert — consumer is created successfully without scheduler - Assert.NotNull(consumer); - Assert.IsType(consumer); + await Assert.That(consumer).IsNotNull(); + await Assert.That(consumer).IsTypeOf(); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_kafka_consumer_factory_scheduler_set_after_construction.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_kafka_consumer_factory_scheduler_set_after_construction.cs index 3b8590c5ba..b9825c0f92 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_kafka_consumer_factory_scheduler_set_after_construction.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_kafka_consumer_factory_scheduler_set_after_construction.cs @@ -21,7 +21,6 @@ THE SOFTWARE. */ #endregion using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway; @@ -33,8 +32,8 @@ public class When_kafka_consumer_factory_scheduler_set_after_construction BootStrapServers = ["localhost:9092"] }; - [Fact] - public void Should_expose_scheduler_set_after_construction() + [Test] + public async Task Should_expose_scheduler_set_after_construction() { // Arrange — factory constructed without a scheduler var factory = new KafkaMessageConsumerFactory(_configuration); @@ -44,22 +43,22 @@ public void Should_expose_scheduler_set_after_construction() factory.Scheduler = scheduler; // Assert — scheduler property reflects the updated value - Assert.Same(scheduler, factory.Scheduler); + await Assert.That(factory.Scheduler).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_use_constructor_scheduler_when_property_not_set() + [Test] + public async Task Should_use_constructor_scheduler_when_property_not_set() { // Arrange — factory constructed with a scheduler via constructor var scheduler = new StubMessageScheduler(); var factory = new KafkaMessageConsumerFactory(_configuration, scheduler); // Assert — scheduler property reflects the constructor value - Assert.Same(scheduler, factory.Scheduler); + await Assert.That(factory.Scheduler).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_override_constructor_scheduler_with_property() + [Test] + public async Task Should_override_constructor_scheduler_with_property() { // Arrange — factory constructed with one scheduler var originalScheduler = new StubMessageScheduler(); @@ -70,8 +69,8 @@ public void Should_override_constructor_scheduler_with_property() factory.Scheduler = overrideScheduler; // Assert — property reflects the override, not the original - Assert.Same(overrideScheduler, factory.Scheduler); - Assert.NotSame(originalScheduler, factory.Scheduler); + await Assert.That(factory.Scheduler).IsSameReferenceAs(overrideScheduler); + await Assert.That(factory.Scheduler).IsNotSameReferenceAs(originalScheduler); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_nacking_a_message_without_offset_should_not_throw.cs b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_nacking_a_message_without_offset_should_not_throw.cs index dd6daa5f79..1fe6646e25 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_nacking_a_message_without_offset_should_not_throw.cs +++ b/tests/Paramore.Brighter.Kafka.Tests/MessagingGateway/When_nacking_a_message_without_offset_should_not_throw.cs @@ -1,25 +1,26 @@ using System; using Confluent.Kafka; using Paramore.Brighter.MessagingGateway.Kafka; -using Xunit; namespace Paramore.Brighter.Kafka.Tests.MessagingGateway; -[Trait("Category", "Kafka")] -[Collection("Kafka")] +[Category("Kafka")] public class When_nacking_a_message_without_offset_should_not_throw : IDisposable { private readonly KafkaMessageConsumer _consumer; + private readonly RoutingKey _topic = new(Guid.NewGuid().ToString("N")); public When_nacking_a_message_without_offset_should_not_throw() { + var groupId = Guid.NewGuid().ToString("N"); + _consumer = new KafkaMessageConsumer( new KafkaMessagingGatewayConfiguration { Name = "test", BootStrapServers = ["localhost:9092"] }, - routingKey: new RoutingKey("test.topic"), - groupId: "test-group", + routingKey: _topic, + groupId: groupId, offsetDefault: AutoOffsetReset.Earliest, numPartitions: 1, replicationFactor: 1, @@ -27,33 +28,31 @@ public When_nacking_a_message_without_offset_should_not_throw() ); } - [Fact] - public void When_message_has_no_partition_offset_in_bag_should_not_throw() + [Test] + public async Task When_message_has_no_partition_offset_in_bag_should_not_throw() { //Arrange - a message with no PARTITION_OFFSET in the header bag var message = new Message( - new MessageHeader("test-id", new RoutingKey("test.topic"), MessageType.MT_COMMAND), + new MessageHeader("test-id", _topic, MessageType.MT_COMMAND), new MessageBody("test body") ); //Act & Assert - should return without throwing - var exception = Record.Exception(() => _consumer.Nack(message)); - Assert.Null(exception); + await Assert.That(() => _consumer.Nack(message)).ThrowsNothing(); } - [Fact] - public void When_message_has_wrong_type_for_partition_offset_should_not_throw() + [Test] + public async Task When_message_has_wrong_type_for_partition_offset_should_not_throw() { //Arrange - a message with PARTITION_OFFSET set to the wrong type var message = new Message( - new MessageHeader("test-id", new RoutingKey("test.topic"), MessageType.MT_COMMAND), + new MessageHeader("test-id", _topic, MessageType.MT_COMMAND), new MessageBody("test body") ); message.Header.Bag[HeaderNames.PARTITION_OFFSET] = "not-a-TopicPartitionOffset"; //Act & Assert - should return without throwing - var exception = Record.Exception(() => _consumer.Nack(message)); - Assert.Null(exception); + await Assert.That(() => _consumer.Nack(message)).ThrowsNothing(); } public void Dispose() @@ -61,3 +60,4 @@ public void Dispose() _consumer?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Kafka.Tests/Paramore.Brighter.Kafka.Tests.csproj b/tests/Paramore.Brighter.Kafka.Tests/Paramore.Brighter.Kafka.Tests.csproj index 95e7cf07fb..da7953e25d 100644 --- a/tests/Paramore.Brighter.Kafka.Tests/Paramore.Brighter.Kafka.Tests.csproj +++ b/tests/Paramore.Brighter.Kafka.Tests/Paramore.Brighter.Kafka.Tests.csproj @@ -1,32 +1,16 @@ - - - $(BrighterTestTargetFrameworks) - false - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - + + $(BrighterTestTargetFrameworks) + false + Exe + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Helpers/Base/MqttTestClassBase.cs b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Helpers/Base/MqttTestClassBase.cs index 08c80a4668..79541604f7 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Helpers/Base/MqttTestClassBase.cs +++ b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Helpers/Base/MqttTestClassBase.cs @@ -1,4 +1,4 @@ -using System.Net; +using System.Net; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Logging; @@ -8,7 +8,6 @@ using Paramore.Brighter.MQTT.Tests.MessagingGateway.Helpers.Server; using Paramore.Test.Helpers.Base; using Paramore.Test.Helpers.Loggers; -using Xunit.Abstractions; namespace Paramore.Brighter.MQTT.Tests.MessagingGateway.Helpers.Base { @@ -29,7 +28,10 @@ public abstract class MqttTestClassBase : TestClassBase protected static readonly MqttFactory s_mqttFactory = new(); protected readonly Message _noopMessage = new(); - protected readonly MqttTestServer? MqttTestServer; + protected MqttTestServer? MqttTestServer; + + private readonly IPAddress _serverIPAddress; + private readonly int _serverPort; /// /// Initializes a new instance of the class with the specified client ID, topic prefix, and test output helper. @@ -41,9 +43,13 @@ public abstract class MqttTestClassBase : TestClassBase /// This constructor sets up the necessary MQTT test server and configurations for messaging gateway tests. /// It also configures logging to integrate with the test output helper. /// - protected MqttTestClassBase(string clientID, string topicPrefix, ITestOutputHelper testOutputHelper) - : base(testOutputHelper) + protected MqttTestClassBase(string clientID, string topicPrefix) + : base() { + var uniqueSuffix = Guid.NewGuid().ToString("N"); + var uniqueClientId = $"{clientID}-{uniqueSuffix}"; + var uniqueTopicPrefix = $"{topicPrefix}/{uniqueSuffix}"; + ApplicationLogging.LoggerFactory = LoggerFactory.Create(configure => { configure.Services.AddSingleton(TestOutputHelper); @@ -53,16 +59,14 @@ protected MqttTestClassBase(string clientID, string topicPrefix, ITestOutputHelp configure.Services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(TestOutputLogger<>))); }); - IPAddress serverIPAddress = IPAddress.Any; - int serverPort = MqttTestServer.GetRandomServerPort(); - - MqttTestServer = MqttTestServer.CreateTestMqttServer(s_mqttFactory, true, ApplicationLogging.CreateLogger(), serverIPAddress, serverPort, null, TestDisplayName); + _serverIPAddress = IPAddress.Any; + _serverPort = Helpers.Server.MqttTestServer.GetRandomServerPort(); var mqttProducerConfig = new MqttMessagingGatewayProducerConfiguration { Hostname = IPAddress.Loopback.ToString(), - Port = serverPort, - TopicPrefix = topicPrefix + Port = _serverPort, + TopicPrefix = uniqueTopicPrefix }; MqttMessagePublisher mqttMessagePublisher = new(mqttProducerConfig); @@ -71,14 +75,20 @@ protected MqttTestClassBase(string clientID, string topicPrefix, ITestOutputHelp MqttMessagingGatewayConsumerConfiguration mqttConsumerConfig = new() { Hostname = IPAddress.Loopback.ToString(), - Port = serverPort, - TopicPrefix = topicPrefix, - ClientID = clientID + Port = _serverPort, + TopicPrefix = uniqueTopicPrefix, + ClientID = uniqueClientId }; MessageConsumerAsync = new MqttMessageConsumer(mqttConsumerConfig); } + [Before(HookType.Test)] + public virtual async Task SetupMqttServer() + { + MqttTestServer = await Helpers.Server.MqttTestServer.CreateTestMqttServer(s_mqttFactory, true, ApplicationLogging.CreateLogger(), _serverIPAddress, _serverPort, null, TestDisplayName); + } + /// /// Gets the asynchronous message producer used for sending messages to the MQTT messaging gateway during tests. /// diff --git a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Helpers/Server/MqttTestServer.cs b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Helpers/Server/MqttTestServer.cs index e580d2a088..b3269b576a 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Helpers/Server/MqttTestServer.cs +++ b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Helpers/Server/MqttTestServer.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Net; using System.Runtime.CompilerServices; using Microsoft.Extensions.Logging; @@ -7,7 +7,6 @@ using MQTTnet.Server; using Paramore.Brighter.MQTT.Tests.MessagingGateway.Helpers.Loggers; using Paramore.Brighter.MQTT.Tests.MessagingGateway.Proactor; -using Shouldly; namespace Paramore.Brighter.MQTT.Tests.MessagingGateway.Helpers.Server { @@ -36,7 +35,7 @@ protected MqttTestServer(MqttFactory mqttFactory, int serverPort, ILogger logger public string HostName => MqttServerOptions.DefaultEndpointOptions.BoundInterNetworkAddress.ToString(); - public static MqttTestServer? CreateTestMqttServer(MqttFactory mqttFactory, bool startService = true, ILogger? logger = null, IPAddress? serverIPAddress = null, int? serverPort = null, MqttServerOptions? mqttServerOptions = null, [CallerMemberName] string? testMethodName = null) + public static async Task CreateTestMqttServer(MqttFactory mqttFactory, bool startService = true, ILogger? logger = null, IPAddress? serverIPAddress = null, int? serverPort = null, MqttServerOptions? mqttServerOptions = null, [CallerMemberName] string? testMethodName = null) { ArgumentNullException.ThrowIfNull(mqttFactory); @@ -68,17 +67,14 @@ protected MqttTestServer(MqttFactory mqttFactory, int serverPort, ILogger logger return null; } - testMqttServer.ShouldNotBeNull(); - testMqttServer.ShouldBeOfType(); - - testMqttServer.MqttServer.IsStarted.ShouldBeFalse(); + if (testMqttServer?.MqttServer is null) + return null; try { if (startService) { - testMqttServer.MqttServer.StartAsync().GetAwaiter().GetResult(); - testMqttServer.MqttServer.IsStarted.ShouldBeTrue(); + await testMqttServer.MqttServer.StartAsync(); } } catch (Exception ex) diff --git a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Proactor/When_mqtt_consumer_requeues_async_with_delay_should_use_producer.cs b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Proactor/When_mqtt_consumer_requeues_async_with_delay_should_use_producer.cs index 2099dd3645..2543b348e1 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Proactor/When_mqtt_consumer_requeues_async_with_delay_should_use_producer.cs +++ b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Proactor/When_mqtt_consumer_requeues_async_with_delay_should_use_producer.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -26,8 +26,6 @@ THE SOFTWARE. */ using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.MQTT.Tests.MessagingGateway.Helpers.Base; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.MQTT.Tests.MessagingGateway.Proactor; @@ -36,15 +34,14 @@ namespace Paramore.Brighter.MQTT.Tests.MessagingGateway.Proactor; /// via a lazily-created producer. Previously RequeueAsync returned false (not implemented); now it delegates /// to the producer so that requeued messages are actually redelivered. /// -[Trait("Category", "MQTT")] -[Collection("MQTT")] -public class MqttConsumerRequeueAsyncTests(ITestOutputHelper testOutputHelper) - : MqttTestClassBase(ClientId, TopicPrefix, testOutputHelper) +[Category("MQTT")] +public class MqttConsumerRequeueAsyncTests() + : MqttTestClassBase(ClientId, TopicPrefix) { private const string ClientId = "BrighterIntegrationTests-RequeueAsync"; private const string TopicPrefix = "BrighterIntegrationTests/RequeueAsyncTests"; - [Fact] + [Test] public async Task When_requeuing_async_should_publish_message_via_producer() { // Arrange - send a message and receive it @@ -60,13 +57,13 @@ public async Task When_requeuing_async_should_publish_message_via_producer() var result = await MessageConsumerAsync.RequeueAsync(received); // Assert - requeue should return true (was returning false) - Assert.True(result, "RequeueAsync should succeed by publishing via producer"); + await Assert.That(result).IsTrue(); // Note: HandledCount is incremented by the message pump, not by the consumer requeue // Assert - message should be available again on the topic (published via producer) var requeued = await ReceiveMessageAsync(); - Assert.Equal(message.Body.Value, requeued.Body.Value); + await Assert.That(requeued.Body.Value).IsEqualTo(message.Body.Value); } private async Task ReceiveMessageAsync() @@ -86,3 +83,4 @@ private async Task ReceiveMessageAsync() throw new Exception($"Failed to receive message after {maxTries} attempts"); } } + diff --git a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Proactor/When_posting_multiples_message_via_the_messaging_gateway_async.cs b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Proactor/When_posting_multiples_message_via_the_messaging_gateway_async.cs index 94fc8594aa..64f1e5799e 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Proactor/When_posting_multiples_message_via_the_messaging_gateway_async.cs +++ b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Proactor/When_posting_multiples_message_via_the_messaging_gateway_async.cs @@ -1,15 +1,12 @@ -using System; +using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.MQTT.Tests.MessagingGateway.Helpers.Base; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.MQTT.Tests.MessagingGateway.Proactor { - [Trait("Category", "MQTT")] - [Collection("MQTT")] + [Category("MQTT")] public class MqttMessageProducerSendMessageTestsAsync : MqttTestClassBase { private const string ClientId = "BrighterIntegrationTests-Produce"; @@ -24,12 +21,12 @@ public class MqttMessageProducerSendMessageTestsAsync : MqttTestClassBase to initialize the necessary /// MQTT configurations and logging mechanisms. /// - public MqttMessageProducerSendMessageTestsAsync(ITestOutputHelper testOutputHelper) - : base(ClientId, TopicPrefix, testOutputHelper) + public MqttMessageProducerSendMessageTestsAsync() + : base(ClientId, TopicPrefix) { } - [Fact] + [Test] public async Task When_posting_multiples_message_via_the_messaging_gateway_async() { const int messageCount = 1000; @@ -65,9 +62,10 @@ public async Task When_posting_multiples_message_via_the_messaging_gateway_async retries++; } - Assert.NotEmpty(receivedMessages); - Assert.Equal(messageCount, receivedMessages.Count); - Assert.Equal(sentMessages, receivedMessages); + await Assert.That(receivedMessages).IsNotEmpty(); + await Assert.That(receivedMessages.Count).IsEqualTo(messageCount); + await Assert.That(receivedMessages).IsEqualTo(sentMessages); } } } + diff --git a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Proactor/When_queue_is_purged_async.cs b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Proactor/When_queue_is_purged_async.cs index 739d78c659..502c502b4d 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Proactor/When_queue_is_purged_async.cs +++ b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Proactor/When_queue_is_purged_async.cs @@ -1,24 +1,21 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.MQTT.Tests.MessagingGateway.Helpers.Base; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.MQTT.Tests.MessagingGateway.Proactor { - [Trait("Category", "MQTT")] - [Collection("MQTT")] + [Category("MQTT")] public class WhenQueueIsPurgedAsync : MqttTestClassBase { private const string ClientId = "BrighterIntegrationTests-Purge"; private const string TopicPrefix = "BrighterIntegrationTests/PurgeTests"; - public WhenQueueIsPurgedAsync(ITestOutputHelper testOutputHelper) - : base(ClientId, TopicPrefix, testOutputHelper) + public WhenQueueIsPurgedAsync() + : base(ClientId, TopicPrefix) { } - [Fact] + [Test] public async Task WhenPurgingTheQueueOnTheMessagingGatewayAsync() { for (int i = 0; i < 5; i++) @@ -37,9 +34,10 @@ public async Task WhenPurgingTheQueueOnTheMessagingGatewayAsync() Message[] receivedMessages = await MessageConsumerAsync.ReceiveAsync(TimeSpan.FromMilliseconds(100)); - Assert.NotEmpty(receivedMessages); - Assert.Single(receivedMessages); - Assert.Contains(_noopMessage, receivedMessages); + await Assert.That(receivedMessages).IsNotEmpty(); + await Assert.That(receivedMessages).HasSingleItem(); + await Assert.That(receivedMessages).Contains(_noopMessage); } } } + diff --git a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs index 3ea1e18e9f..4a9fa19545 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs +++ b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs @@ -29,29 +29,29 @@ THE SOFTWARE. */ using MQTTnet; using Paramore.Brighter.MessagingGateway.MQTT; using Paramore.Brighter.MQTT.Tests.MessagingGateway.Helpers.Server; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.MQTT.Tests.MessagingGateway.Proactor; -[Trait("Category", "MQTT")] -[Collection("MQTT")] +[Category("MQTT")] public class MqttMessageConsumerRejectDeliveryErrorDlqAsyncTests : IDisposable { private const string SOURCE_TOPIC_PREFIX = "BrighterTests/DlqAsyncSource"; private const string DLQ_TOPIC_PREFIX = "BrighterTests/DlqAsyncTarget"; - private readonly MqttTestServer? _mqttTestServer; + private MqttTestServer? _mqttTestServer; private readonly MqttMessageProducer _sourceProducer; private readonly MqttMessageConsumer _sourceConsumer; private readonly MqttMessageConsumer _dlqConsumer; + private readonly MqttFactory _mqttFactory; + private readonly int _serverPort; - public MqttMessageConsumerRejectDeliveryErrorDlqAsyncTests(ITestOutputHelper outputHelper) + public MqttMessageConsumerRejectDeliveryErrorDlqAsyncTests() { var mqttFactory = new MqttFactory(); int serverPort = MqttTestServer.GetRandomServerPort(); - _mqttTestServer = MqttTestServer.CreateTestMqttServer(mqttFactory, true, serverPort: serverPort); + _mqttFactory = mqttFactory; + _serverPort = serverPort; //Arrange — source producer var producerConfig = new MqttMessagingGatewayProducerConfiguration @@ -88,7 +88,13 @@ public MqttMessageConsumerRejectDeliveryErrorDlqAsyncTests(ITestOutputHelper out _dlqConsumer = new MqttMessageConsumer(dlqConsumerConfig); } - [Fact] + [Before(HookType.Test)] + public async Task Setup() + { + _mqttTestServer = await MqttTestServer.CreateTestMqttServer(_mqttFactory, true, serverPort: _serverPort); + } + + [Test] public async Task When_rejecting_message_async_with_delivery_error_should_send_to_dlq() { //Arrange @@ -103,7 +109,7 @@ public async Task When_rejecting_message_async_with_delivery_error_should_send_t await Task.Delay(500); var received = await _sourceConsumer.ReceiveAsync(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(received); + await Assert.That(received).IsNotEmpty(); var sourceMessage = received.First(m => m.Header.MessageType != MessageType.MT_NONE); //Act — reject async with DeliveryError @@ -113,22 +119,22 @@ public async Task When_rejecting_message_async_with_delivery_error_should_send_t ); //Assert — reject returns true - Assert.True(result); + await Assert.That(result).IsTrue(); //Assert — DLQ consumer receives the rejected message await Task.Delay(500); var dlqMessages = await _dlqConsumer.ReceiveAsync(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(dlqMessages); + await Assert.That(dlqMessages).IsNotEmpty(); var dlqMessage = dlqMessages.First(m => m.Header.MessageType != MessageType.MT_NONE); //Assert — message body preserved - Assert.Equal(message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(message.Body.Value); //Assert — rejection metadata present - Assert.Equal(routingKey.Value, dlqMessage.Header.Bag["originalTopic"]!.ToString()); - Assert.Equal("DeliveryError", dlqMessage.Header.Bag["rejectionReason"]!.ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.Equal("MT_COMMAND", dlqMessage.Header.Bag["originalMessageType"]!.ToString()); + await Assert.That(dlqMessage.Header.Bag["originalTopic"]!.ToString()).IsEqualTo(routingKey.Value); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"]!.ToString()).IsEqualTo("DeliveryError"); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalMessageType"]!.ToString()).IsEqualTo("MT_COMMAND"); } public void Dispose() @@ -139,3 +145,4 @@ public void Dispose() _mqttTestServer?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_mqtt_consumer_creates_producer_should_configure_and_dispose_correctly.cs b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_mqtt_consumer_creates_producer_should_configure_and_dispose_correctly.cs index 64bb684a9f..cf88964911 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_mqtt_consumer_creates_producer_should_configure_and_dispose_correctly.cs +++ b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_mqtt_consumer_creates_producer_should_configure_and_dispose_correctly.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -28,8 +28,6 @@ THE SOFTWARE. */ using MQTTnet; using Paramore.Brighter.MessagingGateway.MQTT; using Paramore.Brighter.MQTT.Tests.MessagingGateway.Helpers.Server; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.MQTT.Tests.MessagingGateway.Reactor; @@ -37,25 +35,22 @@ namespace Paramore.Brighter.MQTT.Tests.MessagingGateway.Reactor; /// When the MQTT consumer creates a lazy requeue producer, it should be configured with the scheduler /// passed to the consumer. When the consumer is disposed, the producer should also be disposed. /// -[Trait("Category", "MQTT")] -[Collection("MQTT")] +[Category("MQTT")] public class MqttConsumerProducerConfigAndDisposeTests : IDisposable { - private readonly MqttTestServer? _mqttTestServer; + private MqttTestServer? _mqttTestServer; private readonly MqttMessageProducer _producer; private readonly MqttMessageConsumer _consumer; private readonly SpySchedulerSync _scheduler; + private readonly int _serverPort; - public MqttConsumerProducerConfigAndDisposeTests(ITestOutputHelper testOutputHelper) + public MqttConsumerProducerConfigAndDisposeTests() { int serverPort = MqttTestServer.GetRandomServerPort(); + _serverPort = serverPort; string topicPrefix = "BrighterIntegrationTests/SchedulerDisposeTests"; - _mqttTestServer = MqttTestServer.CreateTestMqttServer( - new MqttFactory(), true, null, - IPAddress.Any, serverPort, null, "MqttConsumerProducerConfigAndDisposeTests"); - var producerConfig = new MqttMessagingGatewayProducerConfiguration { Hostname = IPAddress.Loopback.ToString(), @@ -79,8 +74,16 @@ public MqttConsumerProducerConfigAndDisposeTests(ITestOutputHelper testOutputHel _consumer = new MqttMessageConsumer(consumerConfig, _scheduler); } - [Fact] - public void When_requeuing_with_delay_should_use_scheduler() + [Before(HookType.Test)] + public async Task Setup() + { + _mqttTestServer = await MqttTestServer.CreateTestMqttServer( + new MqttFactory(), true, null, + IPAddress.Any, _serverPort, null, "MqttConsumerProducerConfigAndDisposeTests"); + } + + [Test] + public async Task When_requeuing_with_delay_should_use_scheduler() { // Arrange - send a message and receive it var message = new Message( @@ -91,16 +94,15 @@ public void When_requeuing_with_delay_should_use_scheduler() var received = ReceiveMessage(); // Act - requeue with delay (triggers lazy producer creation with scheduler) - _consumer.Requeue(received, TimeSpan.FromSeconds(5)); + await _consumer.RequeueAsync(received, TimeSpan.FromSeconds(5)); // Assert - scheduler should have been called (proves producer has scheduler configured) - Assert.True(_scheduler.ScheduleCalled, - "Scheduler.Schedule should have been called via the lazily created producer"); - Assert.Equal(message.Body.Value, _scheduler.ScheduledMessage?.Body.Value); + await Assert.That(_scheduler.ScheduleCalled).IsTrue(); + await Assert.That(_scheduler.ScheduledMessage?.Body.Value).IsEqualTo(message.Body.Value); } - [Fact] - public void When_consumer_disposes_after_requeue_should_dispose_producer() + [Test] + public async Task When_consumer_disposes_after_requeue_should_dispose_producer() { // Arrange - trigger lazy producer creation via requeue var message = new Message( @@ -109,19 +111,17 @@ public void When_consumer_disposes_after_requeue_should_dispose_producer() ((IAmAMessageProducerSync)_producer).Send(message); var received = ReceiveMessage(); - _consumer.Requeue(received, TimeSpan.FromSeconds(5)); + await _consumer.RequeueAsync(received, TimeSpan.FromSeconds(5)); // Act + Assert - disposing should not throw (producer cleanup succeeds) - var exception = Record.Exception(() => _consumer.Dispose()); - Assert.Null(exception); + await Assert.That(() => _consumer.Dispose()).ThrowsNothing(); } - [Fact] - public void When_consumer_disposes_without_requeue_should_not_throw() + [Test] + public async Task When_consumer_disposes_without_requeue_should_not_throw() { // Act + Assert - disposing without ever requeuing should succeed (no producer created) - var exception = Record.Exception(() => _consumer.Dispose()); - Assert.Null(exception); + await Assert.That(() => _consumer.Dispose()).ThrowsNothing(); } private Message ReceiveMessage() @@ -179,3 +179,4 @@ public string Schedule(Message message, TimeSpan delay) public void Cancel(string id) { } } } + diff --git a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_mqtt_consumer_requeues_with_delay_should_use_producer.cs b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_mqtt_consumer_requeues_with_delay_should_use_producer.cs index e905111b9a..3688965124 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_mqtt_consumer_requeues_with_delay_should_use_producer.cs +++ b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_mqtt_consumer_requeues_with_delay_should_use_producer.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -25,8 +25,6 @@ THE SOFTWARE. */ using System; using System.Threading; using Paramore.Brighter.MQTT.Tests.MessagingGateway.Helpers.Base; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.MQTT.Tests.MessagingGateway.Reactor; @@ -35,23 +33,22 @@ namespace Paramore.Brighter.MQTT.Tests.MessagingGateway.Reactor; /// via a lazily-created producer. Previously Requeue returned false (not implemented); now it /// delegates to the producer so that requeued messages are actually redelivered. /// -[Trait("Category", "MQTT")] -[Collection("MQTT")] +[Category("MQTT")] public class MqttConsumerRequeueTests : MqttTestClassBase { private const string ClientId = "BrighterIntegrationTests-Requeue"; private const string TopicPrefix = "BrighterIntegrationTests/RequeueTests"; - public MqttConsumerRequeueTests(ITestOutputHelper testOutputHelper) - : base(ClientId, TopicPrefix, testOutputHelper) + public MqttConsumerRequeueTests() + : base(ClientId, TopicPrefix) { } private IAmAMessageProducerSync MessageProducerSync => (MessageProducerAsync as IAmAMessageProducerSync)!; private IAmAMessageConsumerSync MessageConsumerSync => (MessageConsumerAsync as IAmAMessageConsumerSync)!; - [Fact] - public void When_requeuing_should_publish_message_via_producer() + [Test] + public async Task When_requeuing_should_publish_message_via_producer() { // Arrange - send a message and receive it var message = new Message( @@ -66,13 +63,13 @@ public void When_requeuing_should_publish_message_via_producer() var result = MessageConsumerSync.Requeue(received); // Assert - requeue should return true (was returning false) - Assert.True(result, "Requeue should succeed by publishing via producer"); + await Assert.That(result).IsTrue(); // Note: HandledCount is incremented by the message pump, not by the consumer requeue // Assert - message should be available again on the topic (published via producer) var requeued = ReceiveMessage(); - Assert.Equal(message.Body.Value, requeued.Body.Value); + await Assert.That(requeued.Body.Value).IsEqualTo(message.Body.Value); } private Message ReceiveMessage() @@ -92,3 +89,4 @@ private Message ReceiveMessage() throw new Exception($"Failed to receive message after {maxTries} attempts"); } } + diff --git a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_posting_multiples_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_posting_multiples_message_via_the_messaging_gateway.cs index a632447c38..650cfd62fa 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_posting_multiples_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_posting_multiples_message_via_the_messaging_gateway.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,20 +27,17 @@ THE SOFTWARE. */ using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.MQTT.Tests.MessagingGateway.Helpers.Base; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.MQTT.Tests.MessagingGateway.Reactor { - [Trait("Category", "MQTT")] - [Collection("MQTT")] + [Category("MQTT")] public class MqttMessageProducerSendMessageTests : MqttTestClassBase { private const string ClientId = "BrighterIntegrationTests-Produce"; private const string TopicPrefix = "BrighterIntegrationTests/ProducerTests"; - public MqttMessageProducerSendMessageTests(ITestOutputHelper testOutputHelper) - : base(ClientId, TopicPrefix, testOutputHelper) + public MqttMessageProducerSendMessageTests() + : base(ClientId, TopicPrefix) { } @@ -72,8 +69,8 @@ public MqttMessageProducerSendMessageTests(ITestOutputHelper testOutputHelper) /// protected IAmAMessageConsumerSync MessageConsumerSync => (MessageConsumerAsync as IAmAMessageConsumerSync)!; - [Fact] - public void When_posting_multiples_message_via_the_messaging_gateway_sync() + [Test] + public async Task When_posting_multiples_message_via_the_messaging_gateway_sync() { const int messageCount = 1000; List sentMessages = []; @@ -109,9 +106,10 @@ public void When_posting_multiples_message_via_the_messaging_gateway_sync() retries++; } - Assert.NotEmpty(receivedMessages); - Assert.Equal(messageCount, receivedMessages.Count); - Assert.Equal(sentMessages, receivedMessages); + await Assert.That(receivedMessages).IsNotEmpty(); + await Assert.That(receivedMessages.Count).IsEqualTo(messageCount); + await Assert.That(receivedMessages).IsEqualTo(sentMessages); } } } + diff --git a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_queue_is_purged.cs b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_queue_is_purged.cs index 12dc35435e..966093aad1 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_queue_is_purged.cs +++ b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_queue_is_purged.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -26,20 +26,17 @@ THE SOFTWARE. */ using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.MQTT.Tests.MessagingGateway.Helpers.Base; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.MQTT.Tests.MessagingGateway.Reactor { - [Trait("Category", "MQTT")] - [Collection("MQTT")] + [Category("MQTT")] public class When_queue_is_Purged : MqttTestClassBase { private const string ClientId = "BrighterIntegrationTests-Purge"; private const string TopicPrefix = "BrighterIntegrationTests/PurgeTests"; - public When_queue_is_Purged(ITestOutputHelper testOutputHelper) - : base(ClientId, TopicPrefix, testOutputHelper) + public When_queue_is_Purged() + : base(ClientId, TopicPrefix) { } @@ -71,8 +68,8 @@ public When_queue_is_Purged(ITestOutputHelper testOutputHelper) /// protected IAmAMessageConsumerSync MessageConsumerSync => (MessageConsumerAsync as IAmAMessageConsumerSync)!; - [Fact] - public void When_purging_the_queue_on_the_messaging_gateway() + [Test] + public async Task When_purging_the_queue_on_the_messaging_gateway() { for (int i = 0; i < 5; i++) { @@ -90,10 +87,11 @@ public void When_purging_the_queue_on_the_messaging_gateway() Message[] receivedMessages = MessageConsumerSync.Receive(TimeSpan.FromMilliseconds(100)); - Assert.NotEmpty(receivedMessages); - Assert.Single(receivedMessages); - Assert.Contains(_noopMessage, receivedMessages); - Assert.IsType(receivedMessages[0]); + await Assert.That(receivedMessages).IsNotEmpty(); + await Assert.That(receivedMessages).HasSingleItem(); + await Assert.That(receivedMessages).Contains(_noopMessage); + await Assert.That(receivedMessages[0]).IsTypeOf(); } } } + diff --git a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs index 0306c73588..de0a3cd76f 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs +++ b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs @@ -29,29 +29,29 @@ THE SOFTWARE. */ using MQTTnet; using Paramore.Brighter.MessagingGateway.MQTT; using Paramore.Brighter.MQTT.Tests.MessagingGateway.Helpers.Server; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.MQTT.Tests.MessagingGateway.Reactor; -[Trait("Category", "MQTT")] -[Collection("MQTT")] +[Category("MQTT")] public class MqttMessageConsumerRejectDeliveryErrorDlqTests : IDisposable { private const string SOURCE_TOPIC_PREFIX = "BrighterTests/DlqSource"; private const string DLQ_TOPIC_PREFIX = "BrighterTests/DlqTarget"; - private readonly MqttTestServer? _mqttTestServer; + private MqttTestServer? _mqttTestServer; private readonly MqttMessageProducer _sourceProducer; private readonly MqttMessageConsumer _sourceConsumer; private readonly MqttMessageConsumer _dlqConsumer; + private readonly MqttFactory _mqttFactory; + private readonly int _serverPort; - public MqttMessageConsumerRejectDeliveryErrorDlqTests(ITestOutputHelper outputHelper) + public MqttMessageConsumerRejectDeliveryErrorDlqTests() { var mqttFactory = new MqttFactory(); int serverPort = MqttTestServer.GetRandomServerPort(); - _mqttTestServer = MqttTestServer.CreateTestMqttServer(mqttFactory, true, serverPort: serverPort); + _mqttFactory = mqttFactory; + _serverPort = serverPort; //Arrange — source producer var producerConfig = new MqttMessagingGatewayProducerConfiguration @@ -88,7 +88,13 @@ public MqttMessageConsumerRejectDeliveryErrorDlqTests(ITestOutputHelper outputHe _dlqConsumer = new MqttMessageConsumer(dlqConsumerConfig); } - [Fact] + [Before(HookType.Test)] + public async Task Setup() + { + _mqttTestServer = await MqttTestServer.CreateTestMqttServer(_mqttFactory, true, serverPort: _serverPort); + } + + [Test] public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq() { //Arrange @@ -103,7 +109,7 @@ public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq( await Task.Delay(500); var received = ((IAmAMessageConsumerSync)_sourceConsumer).Receive(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(received); + await Assert.That(received).IsNotEmpty(); var sourceMessage = received.First(m => m.Header.MessageType != MessageType.MT_NONE); //Act — reject with DeliveryError @@ -113,28 +119,28 @@ public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq( ); //Assert — reject returns true - Assert.True(result); + await Assert.That(result).IsTrue(); //Assert — DLQ consumer receives the rejected message await Task.Delay(500); var dlqMessages = ((IAmAMessageConsumerSync)_dlqConsumer).Receive(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(dlqMessages); + await Assert.That(dlqMessages).IsNotEmpty(); var dlqMessage = dlqMessages.First(m => m.Header.MessageType != MessageType.MT_NONE); //Assert — message body preserved - Assert.Equal(message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(message.Body.Value); //Assert — rejection metadata present - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(routingKey.Value, dlqMessage.Header.Bag["originalTopic"]!.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalTopic"]!.ToString()).IsEqualTo(routingKey.Value); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal("DeliveryError", dlqMessage.Header.Bag["rejectionReason"]!.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"]!.ToString()).IsEqualTo("DeliveryError"); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal("MT_COMMAND", dlqMessage.Header.Bag["originalMessageType"]!.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalMessageType"]!.ToString()).IsEqualTo("MT_COMMAND"); } public void Dispose() @@ -145,3 +151,4 @@ public void Dispose() _mqttTestServer?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_rejecting_message_with_no_channels_configured_should_return_true.cs b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_rejecting_message_with_no_channels_configured_should_return_true.cs index b7608b33bd..bdedbd6c77 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_rejecting_message_with_no_channels_configured_should_return_true.cs +++ b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_rejecting_message_with_no_channels_configured_should_return_true.cs @@ -29,27 +29,27 @@ THE SOFTWARE. */ using MQTTnet; using Paramore.Brighter.MessagingGateway.MQTT; using Paramore.Brighter.MQTT.Tests.MessagingGateway.Helpers.Server; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.MQTT.Tests.MessagingGateway.Reactor; -[Trait("Category", "MQTT")] -[Collection("MQTT")] +[Category("MQTT")] public class MqttMessageConsumerRejectNoChannelsTests : IDisposable { private const string SOURCE_TOPIC_PREFIX = "BrighterTests/NoChannels"; - private readonly MqttTestServer? _mqttTestServer; + private MqttTestServer? _mqttTestServer; private readonly MqttMessageProducer _sourceProducer; private readonly MqttMessageConsumer _sourceConsumer; + private readonly MqttFactory _mqttFactory; + private readonly int _serverPort; - public MqttMessageConsumerRejectNoChannelsTests(ITestOutputHelper outputHelper) + public MqttMessageConsumerRejectNoChannelsTests() { var mqttFactory = new MqttFactory(); int serverPort = MqttTestServer.GetRandomServerPort(); - _mqttTestServer = MqttTestServer.CreateTestMqttServer(mqttFactory, true, serverPort: serverPort); + _mqttFactory = mqttFactory; + _serverPort = serverPort; //Arrange — source producer var producerConfig = new MqttMessagingGatewayProducerConfiguration @@ -73,7 +73,13 @@ public MqttMessageConsumerRejectNoChannelsTests(ITestOutputHelper outputHelper) _sourceConsumer = new MqttMessageConsumer(consumerConfig); } - [Fact] + [Before(HookType.Test)] + public async Task Setup() + { + _mqttTestServer = await MqttTestServer.CreateTestMqttServer(_mqttFactory, true, serverPort: _serverPort); + } + + [Test] public async Task When_rejecting_message_with_no_channels_configured_should_return_true() { //Arrange @@ -88,7 +94,7 @@ public async Task When_rejecting_message_with_no_channels_configured_should_retu await Task.Delay(500); var received = ((IAmAMessageConsumerSync)_sourceConsumer).Receive(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(received); + await Assert.That(received).IsNotEmpty(); var sourceMessage = received.First(m => m.Header.MessageType != MessageType.MT_NONE); //Act — reject with DeliveryError (no channels configured) @@ -98,7 +104,7 @@ public async Task When_rejecting_message_with_no_channels_configured_should_retu ); //Assert — reject returns true (not false as before the DLQ work) - Assert.True(result); + await Assert.That(result).IsTrue(); } public void Dispose() @@ -108,3 +114,4 @@ public void Dispose() _mqttTestServer?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs index 99c01d2aa8..0c2627b143 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs +++ b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs @@ -29,29 +29,29 @@ THE SOFTWARE. */ using MQTTnet; using Paramore.Brighter.MessagingGateway.MQTT; using Paramore.Brighter.MQTT.Tests.MessagingGateway.Helpers.Server; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.MQTT.Tests.MessagingGateway.Reactor; -[Trait("Category", "MQTT")] -[Collection("MQTT")] +[Category("MQTT")] public class MqttMessageConsumerRejectUnacceptableFallbackToDlqTests : IDisposable { private const string SOURCE_TOPIC_PREFIX = "BrighterTests/FallbackSource"; private const string DLQ_TOPIC_PREFIX = "BrighterTests/FallbackDlq"; - private readonly MqttTestServer? _mqttTestServer; + private MqttTestServer? _mqttTestServer; private readonly MqttMessageProducer _sourceProducer; private readonly MqttMessageConsumer _sourceConsumer; private readonly MqttMessageConsumer _dlqConsumer; + private readonly MqttFactory _mqttFactory; + private readonly int _serverPort; - public MqttMessageConsumerRejectUnacceptableFallbackToDlqTests(ITestOutputHelper outputHelper) + public MqttMessageConsumerRejectUnacceptableFallbackToDlqTests() { var mqttFactory = new MqttFactory(); int serverPort = MqttTestServer.GetRandomServerPort(); - _mqttTestServer = MqttTestServer.CreateTestMqttServer(mqttFactory, true, serverPort: serverPort); + _mqttFactory = mqttFactory; + _serverPort = serverPort; //Arrange — source producer var producerConfig = new MqttMessagingGatewayProducerConfiguration @@ -88,7 +88,13 @@ public MqttMessageConsumerRejectUnacceptableFallbackToDlqTests(ITestOutputHelper _dlqConsumer = new MqttMessageConsumer(dlqConsumerConfig); } - [Fact] + [Before(HookType.Test)] + public async Task Setup() + { + _mqttTestServer = await MqttTestServer.CreateTestMqttServer(_mqttFactory, true, serverPort: _serverPort); + } + + [Test] public async Task When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq() { //Arrange @@ -103,7 +109,7 @@ public async Task When_rejecting_message_with_unacceptable_and_no_invalid_channe await Task.Delay(500); var received = ((IAmAMessageConsumerSync)_sourceConsumer).Receive(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(received); + await Assert.That(received).IsNotEmpty(); var sourceMessage = received.First(m => m.Header.MessageType != MessageType.MT_NONE); //Act — reject with Unacceptable (no invalid channel configured, should fallback to DLQ) @@ -113,16 +119,16 @@ public async Task When_rejecting_message_with_unacceptable_and_no_invalid_channe ); //Assert — reject returns true - Assert.True(result); + await Assert.That(result).IsTrue(); //Assert — DLQ consumer receives the message (fallback) await Task.Delay(500); var dlqMessages = ((IAmAMessageConsumerSync)_dlqConsumer).Receive(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(dlqMessages); + await Assert.That(dlqMessages).IsNotEmpty(); var dlqMessage = dlqMessages.First(m => m.Header.MessageType != MessageType.MT_NONE); - Assert.Equal(message.Body.Value, dlqMessage.Body.Value); - Assert.Equal("Unacceptable", dlqMessage.Header.Bag["rejectionReason"]!.ToString()); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(message.Body.Value); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"]!.ToString()).IsEqualTo("Unacceptable"); } public void Dispose() @@ -133,3 +139,4 @@ public void Dispose() _mqttTestServer?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs index c9805c6503..eb87932b0d 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs +++ b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs @@ -29,31 +29,31 @@ THE SOFTWARE. */ using MQTTnet; using Paramore.Brighter.MessagingGateway.MQTT; using Paramore.Brighter.MQTT.Tests.MessagingGateway.Helpers.Server; -using Xunit; -using Xunit.Abstractions; namespace Paramore.Brighter.MQTT.Tests.MessagingGateway.Reactor; -[Trait("Category", "MQTT")] -[Collection("MQTT")] +[Category("MQTT")] public class MqttMessageConsumerRejectUnacceptableInvalidChannelTests : IDisposable { private const string SOURCE_TOPIC_PREFIX = "BrighterTests/InvalidSource"; private const string DLQ_TOPIC_PREFIX = "BrighterTests/InvalidDlq"; private const string INVALID_TOPIC_PREFIX = "BrighterTests/InvalidTarget"; - private readonly MqttTestServer? _mqttTestServer; + private MqttTestServer? _mqttTestServer; private readonly MqttMessageProducer _sourceProducer; private readonly MqttMessageConsumer _sourceConsumer; private readonly MqttMessageConsumer _invalidConsumer; private readonly MqttMessageConsumer _dlqConsumer; + private readonly MqttFactory _mqttFactory; + private readonly int _serverPort; - public MqttMessageConsumerRejectUnacceptableInvalidChannelTests(ITestOutputHelper outputHelper) + public MqttMessageConsumerRejectUnacceptableInvalidChannelTests() { var mqttFactory = new MqttFactory(); int serverPort = MqttTestServer.GetRandomServerPort(); - _mqttTestServer = MqttTestServer.CreateTestMqttServer(mqttFactory, true, serverPort: serverPort); + _mqttFactory = mqttFactory; + _serverPort = serverPort; //Arrange — source producer var producerConfig = new MqttMessagingGatewayProducerConfiguration @@ -101,7 +101,13 @@ public MqttMessageConsumerRejectUnacceptableInvalidChannelTests(ITestOutputHelpe _dlqConsumer = new MqttMessageConsumer(dlqConsumerConfig); } - [Fact] + [Before(HookType.Test)] + public async Task Setup() + { + _mqttTestServer = await MqttTestServer.CreateTestMqttServer(_mqttFactory, true, serverPort: _serverPort); + } + + [Test] public async Task When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel() { //Arrange @@ -116,7 +122,7 @@ public async Task When_rejecting_message_with_unacceptable_reason_should_send_to await Task.Delay(500); var received = ((IAmAMessageConsumerSync)_sourceConsumer).Receive(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(received); + await Assert.That(received).IsNotEmpty(); var sourceMessage = received.First(m => m.Header.MessageType != MessageType.MT_NONE); //Act — reject with Unacceptable @@ -126,20 +132,20 @@ public async Task When_rejecting_message_with_unacceptable_reason_should_send_to ); //Assert — reject returns true - Assert.True(result); + await Assert.That(result).IsTrue(); //Assert — invalid message consumer receives the rejected message await Task.Delay(500); var invalidMessages = ((IAmAMessageConsumerSync)_invalidConsumer).Receive(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(invalidMessages); + await Assert.That(invalidMessages).IsNotEmpty(); var invalidMessage = invalidMessages.First(m => m.Header.MessageType != MessageType.MT_NONE); - Assert.Equal(message.Body.Value, invalidMessage.Body.Value); - Assert.Equal("Unacceptable", invalidMessage.Header.Bag["rejectionReason"]!.ToString()); + await Assert.That(invalidMessage.Body.Value).IsEqualTo(message.Body.Value); + await Assert.That(invalidMessage.Header.Bag["rejectionReason"]!.ToString()).IsEqualTo("Unacceptable"); //Assert — DLQ consumer does NOT receive the message var dlqMessages = ((IAmAMessageConsumerSync)_dlqConsumer).Receive(TimeSpan.FromMilliseconds(500)); - Assert.All(dlqMessages, m => Assert.Equal(MessageType.MT_NONE, m.Header.MessageType)); + await Assert.That(dlqMessages).All((Message m) => m.Header.MessageType == MessageType.MT_NONE); } public void Dispose() @@ -151,3 +157,4 @@ public void Dispose() _mqttTestServer?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/When_mqtt_channel_factory_creates_channel_should_use_consumer_factory.cs b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/When_mqtt_channel_factory_creates_channel_should_use_consumer_factory.cs index d263baa018..69f760800c 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/When_mqtt_channel_factory_creates_channel_should_use_consumer_factory.cs +++ b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/When_mqtt_channel_factory_creates_channel_should_use_consumer_factory.cs @@ -1,6 +1,5 @@ using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.MQTT; -using Xunit; namespace Paramore.Brighter.MQTT.Tests.MessagingGateway; @@ -31,48 +30,48 @@ public When_mqtt_channel_factory_creates_channel_should_use_consumer_factory() _channelFactory = new ChannelFactory(_consumerFactory); } - [Fact] - public void Should_create_sync_channel() + [Test] + public async Task Should_create_sync_channel() { // Act var channel = _channelFactory.CreateSyncChannel(_subscription); // Assert - Assert.NotNull(channel); - Assert.IsType(channel); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsTypeOf(); } - [Fact] - public void Should_create_async_channel() + [Test] + public async Task Should_create_async_channel() { // Act - var channel = _channelFactory.CreateAsyncChannel(_subscription); + var channel = await _channelFactory.CreateAsyncChannelAsync(_subscription); // Assert - Assert.NotNull(channel); - Assert.IsType(channel); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsTypeOf(); } - [Fact] + [Test] public async Task Should_create_async_channel_async() { // Act var channel = await _channelFactory.CreateAsyncChannelAsync(_subscription); // Assert - Assert.NotNull(channel); - Assert.IsType(channel); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsTypeOf(); } - [Fact] - public void Should_implement_channel_factory_with_scheduler() + [Test] + public async Task Should_implement_channel_factory_with_scheduler() { // Assert - Assert.IsAssignableFrom(_channelFactory); + await Assert.That(_channelFactory).IsAssignableTo(); } - [Fact] - public void Should_accept_scheduler_property() + [Test] + public async Task Should_accept_scheduler_property() { // Arrange var scheduler = new StubMessageScheduler(); @@ -81,7 +80,7 @@ public void Should_accept_scheduler_property() ((IAmAChannelFactoryWithScheduler)_channelFactory).Scheduler = scheduler; // Assert - Assert.Equal(scheduler, ((IAmAChannelFactoryWithScheduler)_channelFactory).Scheduler); + await Assert.That(((IAmAChannelFactoryWithScheduler)_channelFactory).Scheduler).IsEqualTo(scheduler); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/When_mqtt_channel_factory_forwards_scheduler_to_consumers.cs b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/When_mqtt_channel_factory_forwards_scheduler_to_consumers.cs index e528877fcd..9b9d19bb92 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/When_mqtt_channel_factory_forwards_scheduler_to_consumers.cs +++ b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/When_mqtt_channel_factory_forwards_scheduler_to_consumers.cs @@ -21,7 +21,6 @@ THE SOFTWARE. */ #endregion using Paramore.Brighter.MessagingGateway.MQTT; -using Xunit; namespace Paramore.Brighter.MQTT.Tests.MessagingGateway; @@ -35,8 +34,8 @@ public class When_mqtt_channel_factory_forwards_scheduler_to_consumers ClientID = "test-client" }; - [Fact] - public void Should_forward_scheduler_to_consumer_factory() + [Test] + public async Task Should_forward_scheduler_to_consumer_factory() { // Arrange var consumerFactory = new MqttMessageConsumerFactory(_configuration); @@ -47,11 +46,11 @@ public void Should_forward_scheduler_to_consumer_factory() ((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler = scheduler; // Assert — the consumer factory received the scheduler - Assert.Same(scheduler, consumerFactory.Scheduler); + await Assert.That(consumerFactory.Scheduler).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_read_scheduler_from_consumer_factory() + [Test] + public async Task Should_read_scheduler_from_consumer_factory() { // Arrange — consumer factory has a scheduler from construction var scheduler = new StubMessageScheduler(); @@ -59,7 +58,7 @@ public void Should_read_scheduler_from_consumer_factory() var channelFactory = new ChannelFactory(consumerFactory); // Assert — channel factory reads from the consumer factory - Assert.Same(scheduler, ((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler); + await Assert.That(((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler).IsSameReferenceAs(scheduler); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/When_mqtt_consumer_factory_creates_consumer_should_pass_scheduler.cs b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/When_mqtt_consumer_factory_creates_consumer_should_pass_scheduler.cs index 67cc1b86c3..3bd701743e 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/When_mqtt_consumer_factory_creates_consumer_should_pass_scheduler.cs +++ b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/When_mqtt_consumer_factory_creates_consumer_should_pass_scheduler.cs @@ -1,5 +1,4 @@ using Paramore.Brighter.MessagingGateway.MQTT; -using Xunit; namespace Paramore.Brighter.MQTT.Tests.MessagingGateway; @@ -13,8 +12,8 @@ public class When_mqtt_consumer_factory_creates_consumer_should_pass_scheduler ClientID = "test-client" }; - [Fact] - public void Should_create_sync_consumer_when_scheduler_provided() + [Test] + public async Task Should_create_sync_consumer_when_scheduler_provided() { // Arrange var scheduler = new StubMessageScheduler(); @@ -30,12 +29,12 @@ public void Should_create_sync_consumer_when_scheduler_provided() )); // Assert - Assert.NotNull(consumer); - Assert.IsType(consumer); + await Assert.That(consumer).IsNotNull(); + await Assert.That(consumer).IsTypeOf(); } - [Fact] - public void Should_create_async_consumer_when_scheduler_provided() + [Test] + public async Task Should_create_async_consumer_when_scheduler_provided() { // Arrange var scheduler = new StubMessageScheduler(); @@ -51,12 +50,12 @@ public void Should_create_async_consumer_when_scheduler_provided() )); // Assert - Assert.NotNull(consumer); - Assert.IsType(consumer); + await Assert.That(consumer).IsNotNull(); + await Assert.That(consumer).IsTypeOf(); } - [Fact] - public void Should_create_consumer_without_scheduler_for_backward_compat() + [Test] + public async Task Should_create_consumer_without_scheduler_for_backward_compat() { // Arrange var factory = new MqttMessageConsumerFactory(_configuration); @@ -71,8 +70,8 @@ public void Should_create_consumer_without_scheduler_for_backward_compat() )); // Assert - Assert.NotNull(consumer); - Assert.IsType(consumer); + await Assert.That(consumer).IsNotNull(); + await Assert.That(consumer).IsTypeOf(); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/When_mqtt_consumer_factory_scheduler_set_after_construction.cs b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/When_mqtt_consumer_factory_scheduler_set_after_construction.cs index b0daacaad0..917df1c8ba 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/When_mqtt_consumer_factory_scheduler_set_after_construction.cs +++ b/tests/Paramore.Brighter.MQTT.Tests/MessagingGateway/When_mqtt_consumer_factory_scheduler_set_after_construction.cs @@ -21,7 +21,6 @@ THE SOFTWARE. */ #endregion using Paramore.Brighter.MessagingGateway.MQTT; -using Xunit; namespace Paramore.Brighter.MQTT.Tests.MessagingGateway; @@ -35,8 +34,8 @@ public class When_mqtt_consumer_factory_scheduler_set_after_construction ClientID = "test-client" }; - [Fact] - public void Should_expose_scheduler_set_after_construction() + [Test] + public async Task Should_expose_scheduler_set_after_construction() { // Arrange — factory constructed without a scheduler var factory = new MqttMessageConsumerFactory(_configuration); @@ -46,22 +45,22 @@ public void Should_expose_scheduler_set_after_construction() factory.Scheduler = scheduler; // Assert — scheduler property reflects the updated value - Assert.Same(scheduler, factory.Scheduler); + await Assert.That(factory.Scheduler).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_use_constructor_scheduler_when_property_not_set() + [Test] + public async Task Should_use_constructor_scheduler_when_property_not_set() { // Arrange — factory constructed with a scheduler via constructor var scheduler = new StubMessageScheduler(); var factory = new MqttMessageConsumerFactory(_configuration, scheduler); // Assert — scheduler property reflects the constructor value - Assert.Same(scheduler, factory.Scheduler); + await Assert.That(factory.Scheduler).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_override_constructor_scheduler_with_property() + [Test] + public async Task Should_override_constructor_scheduler_with_property() { // Arrange — factory constructed with one scheduler var originalScheduler = new StubMessageScheduler(); @@ -72,8 +71,8 @@ public void Should_override_constructor_scheduler_with_property() factory.Scheduler = overrideScheduler; // Assert — property reflects the override, not the original - Assert.Same(overrideScheduler, factory.Scheduler); - Assert.NotSame(originalScheduler, factory.Scheduler); + await Assert.That(factory.Scheduler).IsSameReferenceAs(overrideScheduler); + await Assert.That(factory.Scheduler).IsNotSameReferenceAs(originalScheduler); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.MQTT.Tests/Paramore.Brighter.MQTT.Tests.csproj b/tests/Paramore.Brighter.MQTT.Tests/Paramore.Brighter.MQTT.Tests.csproj index 95a01c2674..1add7316f8 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/Paramore.Brighter.MQTT.Tests.csproj +++ b/tests/Paramore.Brighter.MQTT.Tests/Paramore.Brighter.MQTT.Tests.csproj @@ -1,34 +1,16 @@ - $(BrighterTestTargetFrameworks) false - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - + Exe + - - + + + + \ No newline at end of file diff --git a/tests/Paramore.Brighter.MQTT.Tests/When_creating_mqtt_consumer_with_dlq_subscription_should_pass_routing_keys.cs b/tests/Paramore.Brighter.MQTT.Tests/When_creating_mqtt_consumer_with_dlq_subscription_should_pass_routing_keys.cs index d41e4f0332..f45d52a628 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/When_creating_mqtt_consumer_with_dlq_subscription_should_pass_routing_keys.cs +++ b/tests/Paramore.Brighter.MQTT.Tests/When_creating_mqtt_consumer_with_dlq_subscription_should_pass_routing_keys.cs @@ -29,39 +29,47 @@ THE SOFTWARE. */ using Paramore.Brighter.MessagingGateway.MQTT; using Paramore.Brighter.MQTT.Tests.MessagingGateway.Helpers.Server; using Paramore.Brighter.MQTT.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.MQTT.Tests; -[Trait("Category", "MQTT")] -[Collection("MQTT")] +[Category("MQTT")] public class MqttMessageConsumerFactoryDlqTests : IDisposable { - private readonly MqttTestServer? _mqttTestServer; + private MqttTestServer? _mqttTestServer; private readonly MqttMessageConsumerFactory _factory; private IAmAMessageConsumerSync? _consumer; + private readonly MqttFactory _mqttFactory; + private readonly int _serverPort; public MqttMessageConsumerFactoryDlqTests() { //Arrange var mqttFactory = new MqttFactory(); int serverPort = MqttTestServer.GetRandomServerPort(); + var uniqueSuffix = Guid.NewGuid().ToString("N"); - _mqttTestServer = MqttTestServer.CreateTestMqttServer(mqttFactory, true, serverPort: serverPort); + _mqttFactory = mqttFactory; + _serverPort = serverPort; var configuration = new MqttMessagingGatewayConsumerConfiguration { Hostname = IPAddress.Loopback.ToString(), Port = serverPort, - TopicPrefix = "BrighterTests/FactoryDlq", - ClientID = "BrighterTests-FactoryDlq" + TopicPrefix = $"BrighterTests/FactoryDlq/{uniqueSuffix}", + ClientID = $"BrighterTests-FactoryDlq-{uniqueSuffix}" }; _factory = new MqttMessageConsumerFactory(configuration); } - [Fact] - public void When_creating_mqtt_consumer_with_dlq_subscription_should_pass_routing_keys() + [Before(HookType.Test)] + public async Task Setup() + { + _mqttTestServer = await MqttTestServer.CreateTestMqttServer(_mqttFactory, true, serverPort: _serverPort); + } + + [Test] + public async Task When_creating_mqtt_consumer_with_dlq_subscription_should_pass_routing_keys() { //Arrange var dlqRoutingKey = new RoutingKey("orders-dlq"); @@ -79,7 +87,7 @@ public void When_creating_mqtt_consumer_with_dlq_subscription_should_pass_routin _consumer = _factory.Create(subscription); //Assert - verify the factory passed routing keys to the consumer - Assert.NotNull(_consumer); + await Assert.That(_consumer).IsNotNull(); var consumerType = _consumer.GetType(); var dlqField = consumerType.GetField("_deadLetterRoutingKey", @@ -87,17 +95,17 @@ public void When_creating_mqtt_consumer_with_dlq_subscription_should_pass_routin var invalidField = consumerType.GetField("_invalidMessageRoutingKey", BindingFlags.NonPublic | BindingFlags.Instance); - Assert.NotNull(dlqField); - Assert.NotNull(invalidField); + await Assert.That(dlqField).IsNotNull(); + await Assert.That(invalidField).IsNotNull(); var actualDlq = dlqField.GetValue(_consumer) as RoutingKey; var actualInvalid = invalidField.GetValue(_consumer) as RoutingKey; - Assert.NotNull(actualDlq); - Assert.Equal("orders-dlq", actualDlq.Value); + await Assert.That(actualDlq).IsNotNull(); + await Assert.That(actualDlq.Value).IsEqualTo("orders-dlq"); - Assert.NotNull(actualInvalid); - Assert.Equal("orders-invalid", actualInvalid.Value); + await Assert.That(actualInvalid).IsNotNull(); + await Assert.That(actualInvalid.Value).IsEqualTo("orders-invalid"); } public void Dispose() @@ -106,3 +114,4 @@ public void Dispose() _mqttTestServer?.Dispose(); } } + diff --git a/tests/Paramore.Brighter.MQTT.Tests/When_creating_mqtt_subscription_with_dlq_routing_keys_should_expose_properties.cs b/tests/Paramore.Brighter.MQTT.Tests/When_creating_mqtt_subscription_with_dlq_routing_keys_should_expose_properties.cs index 7f61b542b1..000b8b5272 100644 --- a/tests/Paramore.Brighter.MQTT.Tests/When_creating_mqtt_subscription_with_dlq_routing_keys_should_expose_properties.cs +++ b/tests/Paramore.Brighter.MQTT.Tests/When_creating_mqtt_subscription_with_dlq_routing_keys_should_expose_properties.cs @@ -24,14 +24,13 @@ THE SOFTWARE. */ using Paramore.Brighter.MessagingGateway.MQTT; using Paramore.Brighter.MQTT.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.MQTT.Tests; public class MqttSubscriptionDlqRoutingKeyTests { - [Fact] - public void When_creating_mqtt_subscription_with_dlq_routing_keys_should_expose_properties() + [Test] + public async Task When_creating_mqtt_subscription_with_dlq_routing_keys_should_expose_properties() { //Arrange var deadLetterRoutingKey = new RoutingKey("orders-dlq"); @@ -47,17 +46,17 @@ public void When_creating_mqtt_subscription_with_dlq_routing_keys_should_expose_ ); //Assert - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var dlqSupport = (IUseBrighterDeadLetterSupport)subscription; - Assert.Equal(deadLetterRoutingKey, dlqSupport.DeadLetterRoutingKey); + await Assert.That(dlqSupport.DeadLetterRoutingKey).IsEqualTo(deadLetterRoutingKey); - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var invalidSupport = (IUseBrighterInvalidMessageSupport)subscription; - Assert.Equal(invalidMessageRoutingKey, invalidSupport.InvalidMessageRoutingKey); + await Assert.That(invalidSupport.InvalidMessageRoutingKey).IsEqualTo(invalidMessageRoutingKey); } - [Fact] - public void When_creating_mqtt_subscription_without_dlq_routing_keys_should_default_to_null() + [Test] + public async Task When_creating_mqtt_subscription_without_dlq_routing_keys_should_default_to_null() { //Arrange & Act var subscription = new MqttSubscription( @@ -67,12 +66,12 @@ public void When_creating_mqtt_subscription_without_dlq_routing_keys_should_defa ); //Assert - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var dlqSupport = (IUseBrighterDeadLetterSupport)subscription; - Assert.Null(dlqSupport.DeadLetterRoutingKey); + await Assert.That(dlqSupport.DeadLetterRoutingKey).IsNull(); - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var invalidSupport = (IUseBrighterInvalidMessageSupport)subscription; - Assert.Null(invalidSupport.InvalidMessageRoutingKey); + await Assert.That(invalidSupport.InvalidMessageRoutingKey).IsNull(); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Configuration.cs b/tests/Paramore.Brighter.MSSQL.Tests/Configuration.cs index b21bd10811..29361ed7fa 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Configuration.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Configuration.cs @@ -10,6 +10,7 @@ public static class Configuration public const string TablePrefix = "Table"; private static bool s_databaseCreated; + private static readonly object s_databaseLock = new(); private static readonly SemaphoreSlim s_semaphoreSlim = new(1, 1); public static void EnsureDatabaseExists(string connectionString) @@ -19,8 +20,7 @@ public static void EnsureDatabaseExists(string connectionString) return; } - s_semaphoreSlim.Wait(); - try + lock (s_databaseLock) { if (s_databaseCreated) { @@ -43,11 +43,7 @@ IF DB_ID('{databaseName}') IS NULL END; """; command.ExecuteNonQuery(); - } - finally - { s_databaseCreated = true; - s_semaphoreSlim.Release(); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_a_message_is_sent.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_a_message_is_sent.cs index 9ce00b5208..ab6aed8776 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_a_message_is_sent.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_a_message_is_sent.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Net.Mime; @@ -6,11 +6,10 @@ using Paramore.Brighter.MessagingGateway.MsSql; using Paramore.Brighter.MSSQL.Tests.TestDoubles; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway { - [Trait("Category", "MSSQL")] + [Category("MSSQL")] public class PostMessageTest : IAsyncDisposable, IDisposable { private readonly string _queueName = Guid.NewGuid().ToString(); @@ -37,8 +36,8 @@ public PostMessageTest() _consumer = new MsSqlMessageConsumerFactory(testHelper.QueueConfiguration).Create(sub); } - [Fact] - public void When_a_message_is_sent_keep_order() + [Test] + public async Task When_a_message_is_sent_keep_order() { IAmAMessageConsumerSync consumer = _consumer; @@ -86,8 +85,8 @@ public void When_a_message_is_sent_keep_order() var firstMessage = ConsumeMessages(consumer); var message = firstMessage.First(); - Assert.False(message.IsEmpty); - Assert.Equal(messageId, message.Id); + await Assert.That(message.IsEmpty).IsFalse(); + await Assert.That(message.Id).IsEqualTo(messageId); } private IEnumerable ConsumeMessages(IAmAMessageConsumerSync consumer) diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_a_message_is_sent_async.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_a_message_is_sent_async.cs index d34eb2e660..28a2747f46 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_a_message_is_sent_async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_a_message_is_sent_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Net.Mime; @@ -6,19 +6,19 @@ using Paramore.Brighter.MessagingGateway.MsSql; using Paramore.Brighter.MSSQL.Tests.TestDoubles; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway { - [Trait("Category", "MSSQL")] - public class PostMessageTestAsync : IAsyncDisposable, IDisposable + [Category("MSSQL")] + public class PostMessageTestAsync : IAsyncDisposable { private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topicName = Guid.NewGuid().ToString(); - private readonly IAmAProducerRegistry _producerRegistry; - private readonly IAmAMessageConsumerAsync _consumer; + private IAmAProducerRegistry _producerRegistry; + private IAmAMessageConsumerAsync _consumer; - public PostMessageTestAsync() + [Before(Test)] + public async Task Setup() { var testHelper = new MsSqlTestHelper(); testHelper.SetupQueueDb(); @@ -30,14 +30,14 @@ public PostMessageTestAsync() new ChannelName(_topicName), routingKey, messagePumpType: MessagePumpType.Proactor); - _producerRegistry = new MsSqlProducerRegistryFactory( + _producerRegistry = await new MsSqlProducerRegistryFactory( testHelper.QueueConfiguration, [new() { Topic = routingKey }] - ).CreateAsync().Result; + ).CreateAsync(); _consumer = new MsSqlMessageConsumerFactory(testHelper.QueueConfiguration).CreateAsync(sub); } - [Fact] + [Test] public async Task When_a_message_is_sent_keep_order() { IAmAMessageConsumerAsync consumer = _consumer; @@ -88,8 +88,8 @@ public async Task When_a_message_is_sent_keep_order() var firstMessage = await ConsumeMessagesAsync(consumer); var message = firstMessage.First(); - Assert.False(message.IsEmpty); - Assert.Equal(msgId, message.Id); + await Assert.That(message.IsEmpty).IsFalse(); + await Assert.That(message.Id).IsEqualTo(msgId); } private async Task> ConsumeMessagesAsync(IAmAMessageConsumerAsync consumer) @@ -114,7 +114,8 @@ private async Task> ConsumeMessagesAsync(IAmAMessageConsume return messages; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { _producerRegistry.Dispose(); ((IAmAMessageConsumerSync)_consumer).Dispose(); diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_a_message_is_sent_keep_order.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_a_message_is_sent_keep_order.cs index a67a58ae78..83cf70e6c7 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_a_message_is_sent_keep_order.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_a_message_is_sent_keep_order.cs @@ -1,14 +1,13 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.MsSql; using Paramore.Brighter.MSSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway { - [Trait("Category", "MSSQL")] + [Category("MSSQL")] public class OrderTest : IAsyncDisposable, IDisposable { private readonly string _queueName = Guid.NewGuid().ToString(); @@ -35,8 +34,8 @@ public OrderTest() _consumer = new MsSqlMessageConsumerFactory(testHelper.QueueConfiguration).Create(sub); } - [Fact] - public void When_a_message_is_sent_keep_order() + [Test] + public async Task When_a_message_is_sent_keep_order() { IAmAMessageConsumerSync consumer = _consumer; var msgId = SendMessage(); @@ -48,23 +47,23 @@ public void When_a_message_is_sent_keep_order() var firstMessage = ConsumeMessages(consumer); var message = firstMessage.First(); - Assert.False(message.IsEmpty); - Assert.Equal(msgId, message.Id); + await Assert.That(message.IsEmpty).IsFalse(); + await Assert.That(message.Id).IsEqualTo(msgId); var secondMessage = ConsumeMessages(consumer); message = secondMessage.First(); - Assert.False(message.IsEmpty); - Assert.Equal(msgId2, message.Id); + await Assert.That(message.IsEmpty).IsFalse(); + await Assert.That(message.Id).IsEqualTo(msgId2); var thirdMessages = ConsumeMessages(consumer); message = thirdMessages.First(); - Assert.False(message.IsEmpty); - Assert.Equal(msgId3, message.Id); + await Assert.That(message.IsEmpty).IsFalse(); + await Assert.That(message.Id).IsEqualTo(msgId3); var fourthMessage = ConsumeMessages(consumer); message = fourthMessage.First(); - Assert.False(message.IsEmpty); - Assert.Equal(msgId4, message.Id); + await Assert.That(message.IsEmpty).IsFalse(); + await Assert.That(message.Id).IsEqualTo(msgId4); } private string SendMessage() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_a_message_is_sent_keep_order_async.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_a_message_is_sent_keep_order_async.cs index c721c383e9..02a93049be 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_a_message_is_sent_keep_order_async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_a_message_is_sent_keep_order_async.cs @@ -1,22 +1,22 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.MsSql; using Paramore.Brighter.MSSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway { - [Trait("Category", "MSSQL")] - public class OrderTestAsync : IAsyncDisposable, IDisposable + [Category("MSSQL")] + public class OrderTestAsync : IAsyncDisposable { private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topicName = Guid.NewGuid().ToString(); - private readonly IAmAProducerRegistry _producerRegistry; - private readonly IAmAMessageConsumerAsync _consumer; + private IAmAProducerRegistry _producerRegistry; + private IAmAMessageConsumerAsync _consumer; - public OrderTestAsync() + [Before(Test)] + public async Task Setup() { var testHelper = new MsSqlTestHelper(); testHelper.SetupQueueDb(); @@ -28,14 +28,14 @@ public OrderTestAsync() new ChannelName(_topicName), routingKey, messagePumpType: MessagePumpType.Proactor); - _producerRegistry = new MsSqlProducerRegistryFactory( + _producerRegistry = await new MsSqlProducerRegistryFactory( testHelper.QueueConfiguration, [new() { Topic = routingKey }] - ).CreateAsync().Result; + ).CreateAsync(); _consumer = new MsSqlMessageConsumerFactory(testHelper.QueueConfiguration).CreateAsync(sub); } - [Fact] + [Test] public async Task When_a_message_is_sent_keep_order() { IAmAMessageConsumerAsync consumer = _consumer; @@ -48,23 +48,23 @@ public async Task When_a_message_is_sent_keep_order() var firstMessage = await ConsumeMessagesAsync(consumer); var message = firstMessage.First(); - Assert.False(message.IsEmpty); - Assert.Equal(msgId, message.Id); + await Assert.That(message.IsEmpty).IsFalse(); + await Assert.That(message.Id).IsEqualTo(msgId); var secondMessage = await ConsumeMessagesAsync(consumer); message = secondMessage.First(); - Assert.False(message.IsEmpty); - Assert.Equal(msgId2, message.Id); + await Assert.That(message.IsEmpty).IsFalse(); + await Assert.That(message.Id).IsEqualTo(msgId2); var thirdMessages = await ConsumeMessagesAsync(consumer); message = thirdMessages.First(); - Assert.False(message.IsEmpty); - Assert.Equal(msgId3, message.Id); + await Assert.That(message.IsEmpty).IsFalse(); + await Assert.That(message.Id).IsEqualTo(msgId3); var fourthMessage = await ConsumeMessagesAsync(consumer); message = fourthMessage.First(); - Assert.False(message.IsEmpty); - Assert.Equal(msgId4, message.Id); + await Assert.That(message.IsEmpty).IsFalse(); + await Assert.That(message.Id).IsEqualTo(msgId4); } private async Task SendMessageAsync() @@ -101,7 +101,8 @@ private async Task> ConsumeMessagesAsync(IAmAMessageConsume return messages; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { _producerRegistry.Dispose(); ((IAmAMessageConsumerSync)_consumer).Dispose(); diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_creating_mssql_consumer_with_dlq_subscription_should_pass_routing_keys.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_creating_mssql_consumer_with_dlq_subscription_should_pass_routing_keys.cs index 3929052e85..4b6f839c0a 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_creating_mssql_consumer_with_dlq_subscription_should_pass_routing_keys.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_creating_mssql_consumer_with_dlq_subscription_should_pass_routing_keys.cs @@ -27,7 +27,6 @@ THE SOFTWARE. */ using Paramore.Brighter.MessagingGateway.MsSql; using Paramore.Brighter.MsSql; using Paramore.Brighter.MSSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway; @@ -43,8 +42,8 @@ public MsSqlMessageConsumerFactoryDlqTests() _factory = new MsSqlMessageConsumerFactory(configuration); } - [Fact] - public void When_creating_mssql_consumer_with_dlq_subscription_should_pass_routing_keys() + [Test] + public async Task When_creating_mssql_consumer_with_dlq_subscription_should_pass_routing_keys() { //Arrange var dlqRoutingKey = new RoutingKey("orders-dlq"); @@ -62,7 +61,7 @@ public void When_creating_mssql_consumer_with_dlq_subscription_should_pass_routi _consumer = _factory.Create(subscription); //Assert - verify the factory passed routing keys to the consumer - Assert.NotNull(_consumer); + await Assert.That(_consumer).IsNotNull(); var consumerType = _consumer.GetType(); var dlqField = consumerType.GetField("_deadLetterRoutingKey", @@ -70,17 +69,17 @@ public void When_creating_mssql_consumer_with_dlq_subscription_should_pass_routi var invalidField = consumerType.GetField("_invalidMessageRoutingKey", BindingFlags.NonPublic | BindingFlags.Instance); - Assert.NotNull(dlqField); - Assert.NotNull(invalidField); + await Assert.That(dlqField).IsNotNull(); + await Assert.That(invalidField).IsNotNull(); var actualDlq = dlqField.GetValue(_consumer) as RoutingKey; var actualInvalid = invalidField.GetValue(_consumer) as RoutingKey; - Assert.NotNull(actualDlq); - Assert.Equal("orders-dlq", actualDlq.Value); + await Assert.That(actualDlq).IsNotNull(); + await Assert.That(actualDlq.Value).IsEqualTo("orders-dlq"); - Assert.NotNull(actualInvalid); - Assert.Equal("orders-invalid", actualInvalid.Value); + await Assert.That(actualInvalid).IsNotNull(); + await Assert.That(actualInvalid.Value).IsEqualTo("orders-invalid"); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_creating_mssql_subscription_with_dlq_routing_keys_should_expose_properties.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_creating_mssql_subscription_with_dlq_routing_keys_should_expose_properties.cs index d095277dbd..3691eaee79 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_creating_mssql_subscription_with_dlq_routing_keys_should_expose_properties.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_creating_mssql_subscription_with_dlq_routing_keys_should_expose_properties.cs @@ -24,14 +24,13 @@ THE SOFTWARE. */ using Paramore.Brighter.MessagingGateway.MsSql; using Paramore.Brighter.MSSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway; public class MsSqlSubscriptionDlqRoutingKeyTests { - [Fact] - public void When_creating_mssql_subscription_with_dlq_routing_keys_should_expose_properties() + [Test] + public async Task When_creating_mssql_subscription_with_dlq_routing_keys_should_expose_properties() { //Arrange var deadLetterRoutingKey = new RoutingKey("orders-dlq"); @@ -47,17 +46,17 @@ public void When_creating_mssql_subscription_with_dlq_routing_keys_should_expose ); //Assert - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var dlqSupport = (IUseBrighterDeadLetterSupport)subscription; - Assert.Equal(deadLetterRoutingKey, dlqSupport.DeadLetterRoutingKey); + await Assert.That(dlqSupport.DeadLetterRoutingKey).IsEqualTo(deadLetterRoutingKey); - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var invalidSupport = (IUseBrighterInvalidMessageSupport)subscription; - Assert.Equal(invalidMessageRoutingKey, invalidSupport.InvalidMessageRoutingKey); + await Assert.That(invalidSupport.InvalidMessageRoutingKey).IsEqualTo(invalidMessageRoutingKey); } - [Fact] - public void When_creating_mssql_subscription_without_dlq_routing_keys_should_default_to_null() + [Test] + public async Task When_creating_mssql_subscription_without_dlq_routing_keys_should_default_to_null() { //Arrange & Act var subscription = new MsSqlSubscription( @@ -67,12 +66,12 @@ public void When_creating_mssql_subscription_without_dlq_routing_keys_should_def ); //Assert - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var dlqSupport = (IUseBrighterDeadLetterSupport)subscription; - Assert.Null(dlqSupport.DeadLetterRoutingKey); + await Assert.That(dlqSupport.DeadLetterRoutingKey).IsNull(); - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var invalidSupport = (IUseBrighterInvalidMessageSupport)subscription; - Assert.Null(invalidSupport.InvalidMessageRoutingKey); + await Assert.That(invalidSupport.InvalidMessageRoutingKey).IsNull(); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_channel_factory_forwards_scheduler_to_consumers.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_channel_factory_forwards_scheduler_to_consumers.cs index 8479186667..9cffb77803 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_channel_factory_forwards_scheduler_to_consumers.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_channel_factory_forwards_scheduler_to_consumers.cs @@ -21,7 +21,6 @@ THE SOFTWARE. */ #endregion using Paramore.Brighter.MessagingGateway.MsSql; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway; @@ -29,8 +28,8 @@ public class When_mssql_channel_factory_forwards_scheduler_to_consumers { private readonly RelationalDatabaseConfiguration _configuration = new("Server=localhost;Database=test;Trusted_Connection=True;"); - [Fact] - public void Should_forward_scheduler_to_consumer_factory() + [Test] + public async Task Should_forward_scheduler_to_consumer_factory() { // Arrange var consumerFactory = new MsSqlMessageConsumerFactory(_configuration); @@ -41,11 +40,11 @@ public void Should_forward_scheduler_to_consumer_factory() ((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler = scheduler; // Assert — the consumer factory received the scheduler - Assert.Same(scheduler, consumerFactory.Scheduler); + await Assert.That(consumerFactory.Scheduler).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_read_scheduler_from_consumer_factory() + [Test] + public async Task Should_read_scheduler_from_consumer_factory() { // Arrange — consumer factory has a scheduler from construction var scheduler = new StubMessageScheduler(); @@ -53,7 +52,7 @@ public void Should_read_scheduler_from_consumer_factory() var channelFactory = new ChannelFactory(consumerFactory); // Assert — channel factory reads from the consumer factory - Assert.Same(scheduler, ((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler); + await Assert.That(((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler).IsSameReferenceAs(scheduler); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_channel_factory_has_scheduler_should_pass_to_consumers.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_channel_factory_has_scheduler_should_pass_to_consumers.cs index 3b20f296ba..8370a82932 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_channel_factory_has_scheduler_should_pass_to_consumers.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_channel_factory_has_scheduler_should_pass_to_consumers.cs @@ -1,6 +1,5 @@ using Paramore.Brighter.MessagingGateway.MsSql; using Paramore.Brighter.MsSql; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway; @@ -20,19 +19,19 @@ public class When_mssql_channel_factory_has_scheduler_should_pass_to_consumers makeChannels: OnMissingChannel.Assume ); - [Fact] - public void Should_implement_channel_factory_with_scheduler() + [Test] + public async Task Should_implement_channel_factory_with_scheduler() { // Arrange var consumerFactory = new MsSqlMessageConsumerFactory(_configuration); var channelFactory = new ChannelFactory(consumerFactory); // Assert - Assert.IsAssignableFrom(channelFactory); + await Assert.That(channelFactory).IsAssignableTo(); } - [Fact] - public void Should_create_sync_channel_when_scheduler_set() + [Test] + public async Task Should_create_sync_channel_when_scheduler_set() { // Arrange var scheduler = new StubMessageScheduler(); @@ -44,12 +43,12 @@ public void Should_create_sync_channel_when_scheduler_set() var channel = channelFactory.CreateSyncChannel(_subscription); // Assert - Assert.NotNull(channel); - Assert.IsType(channel); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsTypeOf(); } - [Fact] - public void Should_create_async_channel_when_scheduler_set() + [Test] + public async Task Should_create_async_channel_when_scheduler_set() { // Arrange var scheduler = new StubMessageScheduler(); @@ -58,15 +57,15 @@ public void Should_create_async_channel_when_scheduler_set() ((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler = scheduler; // Act - var channel = channelFactory.CreateAsyncChannel(_subscription); + var channel = await channelFactory.CreateAsyncChannelAsync(_subscription); // Assert - Assert.NotNull(channel); - Assert.IsType(channel); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsTypeOf(); } - [Fact] - public void Should_create_channel_without_scheduler_for_backward_compat() + [Test] + public async Task Should_create_channel_without_scheduler_for_backward_compat() { // Arrange — no scheduler set var consumerFactory = new MsSqlMessageConsumerFactory(_configuration); @@ -76,8 +75,8 @@ public void Should_create_channel_without_scheduler_for_backward_compat() var channel = channelFactory.CreateSyncChannel(_subscription); // Assert - Assert.NotNull(channel); - Assert.IsType(channel); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsTypeOf(); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_creates_producer_should_configure_and_dispose_correctly.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_creates_producer_should_configure_and_dispose_correctly.cs index dbbe67064f..e65c5b7774 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_creates_producer_should_configure_and_dispose_correctly.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_creates_producer_should_configure_and_dispose_correctly.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2024 Ian Cooper @@ -24,7 +24,6 @@ THE SOFTWARE. */ using System; using Paramore.Brighter.MessagingGateway.MsSql; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway; @@ -33,7 +32,7 @@ namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway; /// lazily-created requeue producer, and that disposal works in all cases. /// Uses a non-zero delay to exercise the full scheduler path (lesson from Kafka/MQTT). /// -[Trait("Category", "MSSQL")] +[Category("MSSQL")] public class When_mssql_consumer_creates_producer_should_configure_and_dispose_correctly { private readonly MsSqlTestHelper _testHelper; @@ -46,8 +45,8 @@ public When_mssql_consumer_creates_producer_should_configure_and_dispose_correct _topicName = $"Producer-Config-Tests-{Guid.NewGuid()}"; } - [Fact] - public void When_requeuing_with_delay_should_wire_scheduler_to_producer() + [Test] + public async Task When_requeuing_with_delay_should_wire_scheduler_to_producer() { // Arrange var scheduler = new SpySchedulerSync(); @@ -62,19 +61,19 @@ public void When_requeuing_with_delay_should_wire_scheduler_to_producer() new MessageBody("test scheduler wiring")); // Act - requeue with non-zero delay to exercise the scheduler path - consumer.Requeue(message, TimeSpan.FromSeconds(5)); + await consumer.RequeueAsync(message, TimeSpan.FromSeconds(5)); // Assert - scheduler was called, proving it was wired through to the producer - Assert.True(scheduler.ScheduleCalled); - Assert.Equal(message.Body.Value, scheduler.ScheduledMessage?.Body.Value); - Assert.Equal(TimeSpan.FromSeconds(5), scheduler.ScheduledDelay); + await Assert.That(scheduler.ScheduleCalled).IsTrue(); + await Assert.That(scheduler.ScheduledMessage?.Body.Value).IsEqualTo(message.Body.Value); + await Assert.That(scheduler.ScheduledDelay).IsEqualTo(TimeSpan.FromSeconds(5)); // Cleanup - consumer.Dispose(); + await consumer.DisposeAsync(); } - [Fact] - public void When_disposing_after_requeue_should_not_throw() + [Test] + public async Task When_disposing_after_requeue_should_not_throw() { // Arrange var scheduler = new SpySchedulerSync(); @@ -88,15 +87,14 @@ public void When_disposing_after_requeue_should_not_throw() new MessageHeader(Guid.NewGuid().ToString(), topic, MessageType.MT_COMMAND), new MessageBody("test dispose after requeue")); - consumer.Requeue(message, TimeSpan.FromSeconds(5)); + await consumer.RequeueAsync(message, TimeSpan.FromSeconds(5)); // Act & Assert - dispose after producer was created should not throw - var exception = Record.Exception(() => consumer.Dispose()); - Assert.Null(exception); + await Assert.That(() => consumer.Dispose()).ThrowsNothing(); } - [Fact] - public void When_disposing_without_requeue_should_not_throw() + [Test] + public async Task When_disposing_without_requeue_should_not_throw() { // Arrange - create consumer but never requeue (producer never created) var scheduler = new SpySchedulerSync(); @@ -106,8 +104,7 @@ public void When_disposing_without_requeue_should_not_throw() scheduler); // Act & Assert - dispose without producer creation should not throw - var exception = Record.Exception(() => consumer.Dispose()); - Assert.Null(exception); + await Assert.That(() => consumer.Dispose()).ThrowsNothing(); } private sealed class SpySchedulerSync : IAmAMessageSchedulerSync diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_factory_creates_consumer_should_pass_scheduler.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_factory_creates_consumer_should_pass_scheduler.cs index 3bc7b464e2..7f5d9136d0 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_factory_creates_consumer_should_pass_scheduler.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_factory_creates_consumer_should_pass_scheduler.cs @@ -22,7 +22,6 @@ THE SOFTWARE. */ using Paramore.Brighter.MessagingGateway.MsSql; using Paramore.Brighter.MsSql; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway; @@ -41,8 +40,8 @@ public class When_mssql_consumer_factory_creates_consumer_should_pass_scheduler messagePumpType: MessagePumpType.Reactor ); - [Fact] - public void Should_create_sync_consumer_when_scheduler_provided() + [Test] + public async Task Should_create_sync_consumer_when_scheduler_provided() { // Arrange — factory constructed with a scheduler var scheduler = new StubMessageScheduler(); @@ -52,12 +51,12 @@ public void Should_create_sync_consumer_when_scheduler_provided() var consumer = factory.Create(_subscription); // Assert — consumer is created successfully - Assert.NotNull(consumer); - Assert.IsType(consumer); + await Assert.That(consumer).IsNotNull(); + await Assert.That(consumer).IsTypeOf(); } - [Fact] - public void Should_create_async_consumer_when_scheduler_provided() + [Test] + public async Task Should_create_async_consumer_when_scheduler_provided() { // Arrange — factory constructed with a scheduler var scheduler = new StubMessageScheduler(); @@ -67,12 +66,12 @@ public void Should_create_async_consumer_when_scheduler_provided() var consumer = factory.CreateAsync(_subscription); // Assert — consumer is created successfully - Assert.NotNull(consumer); - Assert.IsType(consumer); + await Assert.That(consumer).IsNotNull(); + await Assert.That(consumer).IsTypeOf(); } - [Fact] - public void Should_create_consumer_without_scheduler_for_backward_compat() + [Test] + public async Task Should_create_consumer_without_scheduler_for_backward_compat() { // Arrange — factory constructed without a scheduler (backward compat) var factory = new MsSqlMessageConsumerFactory(_configuration); @@ -81,8 +80,8 @@ public void Should_create_consumer_without_scheduler_for_backward_compat() var consumer = factory.Create(_subscription); // Assert — consumer is created successfully without scheduler - Assert.NotNull(consumer); - Assert.IsType(consumer); + await Assert.That(consumer).IsNotNull(); + await Assert.That(consumer).IsTypeOf(); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_factory_scheduler_set_after_construction.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_factory_scheduler_set_after_construction.cs index 6bc7ec6335..0a7ec3c2f1 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_factory_scheduler_set_after_construction.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_factory_scheduler_set_after_construction.cs @@ -21,7 +21,6 @@ THE SOFTWARE. */ #endregion using Paramore.Brighter.MessagingGateway.MsSql; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway; @@ -29,8 +28,8 @@ public class When_mssql_consumer_factory_scheduler_set_after_construction { private readonly RelationalDatabaseConfiguration _configuration = new("Server=localhost;Database=test;Trusted_Connection=True;"); - [Fact] - public void Should_expose_scheduler_set_after_construction() + [Test] + public async Task Should_expose_scheduler_set_after_construction() { // Arrange — factory constructed without a scheduler var factory = new MsSqlMessageConsumerFactory(_configuration); @@ -40,22 +39,22 @@ public void Should_expose_scheduler_set_after_construction() factory.Scheduler = scheduler; // Assert — scheduler property reflects the updated value - Assert.Same(scheduler, factory.Scheduler); + await Assert.That(factory.Scheduler).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_use_constructor_scheduler_when_property_not_set() + [Test] + public async Task Should_use_constructor_scheduler_when_property_not_set() { // Arrange — factory constructed with a scheduler via constructor var scheduler = new StubMessageScheduler(); var factory = new MsSqlMessageConsumerFactory(_configuration, scheduler); // Assert — scheduler property reflects the constructor value - Assert.Same(scheduler, factory.Scheduler); + await Assert.That(factory.Scheduler).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_override_constructor_scheduler_with_property() + [Test] + public async Task Should_override_constructor_scheduler_with_property() { // Arrange — factory constructed with one scheduler var originalScheduler = new StubMessageScheduler(); @@ -66,8 +65,8 @@ public void Should_override_constructor_scheduler_with_property() factory.Scheduler = overrideScheduler; // Assert — property reflects the override, not the original - Assert.Same(overrideScheduler, factory.Scheduler); - Assert.NotSame(originalScheduler, factory.Scheduler); + await Assert.That(factory.Scheduler).IsSameReferenceAs(overrideScheduler); + await Assert.That(factory.Scheduler).IsNotSameReferenceAs(originalScheduler); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_requeues_async_with_delay_should_use_producer.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_requeues_async_with_delay_should_use_producer.cs index 99ca636c76..76bf1cf758 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_requeues_async_with_delay_should_use_producer.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_requeues_async_with_delay_should_use_producer.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2024 Ian Cooper @@ -26,7 +26,6 @@ THE SOFTWARE. */ using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.MsSql; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway; @@ -35,7 +34,7 @@ namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway; /// it should delegate to the lazily-created producer's SendWithDelayAsync rather than /// sending directly to the SQL queue. /// -[Trait("Category", "MSSQL")] +[Category("MSSQL")] public class MssqlConsumerRequeueTestsAsync : IAsyncDisposable { private readonly MsSqlMessageConsumer _consumer; @@ -62,19 +61,19 @@ public MssqlConsumerRequeueTestsAsync() new MessageBody("test content for async delayed requeue")); } - [Fact] + [Test] public async Task When_requeuing_async_with_delay_should_use_producer() { // Act - requeue with non-zero delay var result = await _consumer.RequeueAsync(_message, TimeSpan.FromSeconds(5)); // Assert - should return true - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - async scheduler should have been called via the producer path - Assert.True(_scheduler.ScheduleAsyncCalled); - Assert.Equal(_message.Body.Value, _scheduler.ScheduledMessage?.Body.Value); - Assert.Equal(TimeSpan.FromSeconds(5), _scheduler.ScheduledDelay); + await Assert.That(_scheduler.ScheduleAsyncCalled).IsTrue(); + await Assert.That(_scheduler.ScheduledMessage?.Body.Value).IsEqualTo(_message.Body.Value); + await Assert.That(_scheduler.ScheduledDelay).IsEqualTo(TimeSpan.FromSeconds(5)); } public ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_requeues_with_delay_should_use_producer.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_requeues_with_delay_should_use_producer.cs index 85e5a9e0da..130b010123 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_requeues_with_delay_should_use_producer.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_requeues_with_delay_should_use_producer.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2024 Ian Cooper @@ -24,7 +24,6 @@ THE SOFTWARE. */ using System; using Paramore.Brighter.MessagingGateway.MsSql; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway; @@ -33,7 +32,7 @@ namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway; /// to a lazily-created producer's SendWithDelay rather than sending directly to the SQL queue. /// This ensures the delay is respected via the scheduler instead of being ignored. /// -[Trait("Category", "MSSQL")] +[Category("MSSQL")] public class When_mssql_consumer_requeues_with_delay_should_use_producer : IDisposable { private readonly MsSqlMessageConsumer _consumer; @@ -60,19 +59,19 @@ public When_mssql_consumer_requeues_with_delay_should_use_producer() new MessageBody("test content for delayed requeue")); } - [Fact] - public void When_requeuing_with_delay_should_use_producer() + [Test] + public async Task When_requeuing_with_delay_should_use_producer() { // Act - requeue with non-zero delay - var result = _consumer.Requeue(_message, TimeSpan.FromSeconds(5)); + var result = await _consumer.RequeueAsync(_message, TimeSpan.FromSeconds(5)); // Assert - should return true - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - scheduler should have been called via the producer path - Assert.True(_scheduler.ScheduleCalled); - Assert.Equal(_message.Body.Value, _scheduler.ScheduledMessage?.Body.Value); - Assert.Equal(TimeSpan.FromSeconds(5), _scheduler.ScheduledDelay); + await Assert.That(_scheduler.ScheduleCalled).IsTrue(); + await Assert.That(_scheduler.ScheduledMessage?.Body.Value).IsEqualTo(_message.Body.Value); + await Assert.That(_scheduler.ScheduledDelay).IsEqualTo(TimeSpan.FromSeconds(5)); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_requeues_with_zero_delay_should_use_direct_queue.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_requeues_with_zero_delay_should_use_direct_queue.cs index 82a65a60c4..0f98b78ce6 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_requeues_with_zero_delay_should_use_direct_queue.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_mssql_consumer_requeues_with_zero_delay_should_use_direct_queue.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2024 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.MsSql; using Paramore.Brighter.MSSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway; @@ -36,7 +35,7 @@ namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway; /// direct SQL queue send rather than creating a producer. This preserves existing behavior /// and ensures immediate requeue without scheduler overhead. /// -[Trait("Category", "MSSQL")] +[Category("MSSQL")] public class When_mssql_consumer_requeues_with_zero_delay_should_use_direct_queue : IDisposable { private readonly MsSqlMessageConsumer _consumer; @@ -63,46 +62,46 @@ public When_mssql_consumer_requeues_with_zero_delay_should_use_direct_queue() _consumer = new MsSqlMessageConsumer(testHelper.QueueConfiguration, _topicName); } - [Fact] - public void When_requeuing_with_zero_delay_should_send_directly_to_queue() + [Test] + public async Task When_requeuing_with_zero_delay_should_send_directly_to_queue() { // Arrange - send and receive a message so it's in the queue - _producer.Send(_message); - var received = _consumer.Receive(TimeSpan.FromMilliseconds(2000)); - Assert.NotEmpty(received); - Assert.Equal(MessageType.MT_COMMAND, received[0].Header.MessageType); + await _producer.SendAsync(_message); + var received = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(2000)); + await Assert.That(received).IsNotEmpty(); + await Assert.That(received[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); // Act - requeue with zero delay (should use direct queue send) - var result = _consumer.Requeue(received[0], TimeSpan.Zero); + var result = await _consumer.RequeueAsync(received[0], TimeSpan.Zero); // Assert - returns true - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - message is immediately available in queue (direct send, not scheduled) - var requeued = _consumer.Receive(TimeSpan.FromMilliseconds(2000)); - Assert.NotEmpty(requeued); - Assert.Equal(_message.Body.Value, requeued[0].Body.Value); + var requeued = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(2000)); + await Assert.That(requeued).IsNotEmpty(); + await Assert.That(requeued[0].Body.Value).IsEqualTo(_message.Body.Value); } - [Fact] - public void When_requeuing_with_null_delay_should_send_directly_to_queue() + [Test] + public async Task When_requeuing_with_null_delay_should_send_directly_to_queue() { // Arrange - send and receive a message - _producer.Send(_message); - var received = _consumer.Receive(TimeSpan.FromMilliseconds(2000)); - Assert.NotEmpty(received); - Assert.Equal(MessageType.MT_COMMAND, received[0].Header.MessageType); + await _producer.SendAsync(_message); + var received = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(2000)); + await Assert.That(received).IsNotEmpty(); + await Assert.That(received[0].Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); // Act - requeue with null delay (should default to zero and use direct queue) - var result = _consumer.Requeue(received[0]); + var result = await _consumer.RequeueAsync(received[0]); // Assert - returns true - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - message is immediately available - var requeued = _consumer.Receive(TimeSpan.FromMilliseconds(2000)); - Assert.NotEmpty(requeued); - Assert.Equal(_message.Body.Value, requeued[0].Body.Value); + var requeued = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(2000)); + await Assert.That(requeued).IsNotEmpty(); + await Assert.That(requeued[0].Body.Value).IsEqualTo(_message.Body.Value); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_queue_is_purged.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_queue_is_purged.cs index 3997909354..0f63c34026 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_queue_is_purged.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_queue_is_purged.cs @@ -1,14 +1,13 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.MsSql; using Paramore.Brighter.MSSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway { - [Trait("Category", "MSSQL")] + [Category("MSSQL")] public class PurgeTest : IAsyncDisposable, IDisposable { private readonly string _queueName = Guid.NewGuid().ToString(); @@ -35,8 +34,8 @@ public PurgeTest() _consumer = new MsSqlMessageConsumerFactory(testHelper.QueueConfiguration).Create(sub); } - [Fact] - public void When_queue_is_Purged() + [Test] + public async Task When_queue_is_Purged() { IAmAMessageConsumerSync consumer = _consumer; //Send a sequence of messages to Kafka @@ -46,7 +45,7 @@ public void When_queue_is_Purged() var firstMessage = ConsumeMessages(consumer); var message = firstMessage.First(); - Assert.Equal(msgId, message.Id); + await Assert.That(message.Id).IsEqualTo(msgId); _consumer.Purge(); @@ -55,7 +54,7 @@ public void When_queue_is_Purged() var nextMessage = ConsumeMessages(consumer); message = nextMessage.First(); - Assert.Equal(new Message(), message); + await Assert.That(message).IsEqualTo(new Message()); } private string SendMessage() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_queue_is_purged_async.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_queue_is_purged_async.cs index 2fc78cf8cf..65aea444f2 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_queue_is_purged_async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_queue_is_purged_async.cs @@ -1,22 +1,22 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.MsSql; using Paramore.Brighter.MSSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway { - [Trait("Category", "MSSQL")] - public class PurgeTestAsync : IAsyncDisposable, IDisposable + [Category("MSSQL")] + public class PurgeTestAsync : IAsyncDisposable { private readonly string _queueName = Guid.NewGuid().ToString(); - private readonly IAmAProducerRegistry _producerRegistry; - private readonly IAmAMessageConsumerAsync _consumer; - private readonly RoutingKey _routingKey; + private IAmAProducerRegistry _producerRegistry; + private IAmAMessageConsumerAsync _consumer; + private RoutingKey _routingKey; - public PurgeTestAsync() + [Before(Test)] + public async Task Setup() { var testHelper = new MsSqlTestHelper(); testHelper.SetupQueueDb(); @@ -27,16 +27,16 @@ public PurgeTestAsync() new SubscriptionName(_queueName), new ChannelName(_routingKey.Value), _routingKey, messagePumpType: MessagePumpType.Proactor); - - _producerRegistry = new MsSqlProducerRegistryFactory( + + _producerRegistry = await new MsSqlProducerRegistryFactory( testHelper.QueueConfiguration, [new() { Topic = _routingKey }] - ).CreateAsync().Result; - + ).CreateAsync(); + _consumer = new MsSqlMessageConsumerFactory(testHelper.QueueConfiguration).CreateAsync(sub); } - [Fact] + [Test] public async Task When_queue_is_Purged() { IAmAMessageConsumerAsync consumer = _consumer; @@ -46,7 +46,7 @@ public async Task When_queue_is_Purged() // Now read those messages in order var firstMessage = await ConsumeMessagesAsync(consumer); var message = firstMessage.First(); - Assert.Equal(msgId, message.Id); + await Assert.That(message.Id).IsEqualTo(msgId); await _consumer.PurgeAsync(); @@ -54,7 +54,7 @@ public async Task When_queue_is_Purged() var nextMessage = await ConsumeMessagesAsync(consumer); message = nextMessage.First(); - Assert.Equal(new Message(), message); + await Assert.That(message).IsEqualTo(new Message()); } private async Task SendMessageAsync() @@ -92,7 +92,8 @@ private async Task> ConsumeMessagesAsync(IAmAMessageConsume return messages; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { ((IAmAMessageConsumerSync)_consumer).Dispose(); _producerRegistry.Dispose(); diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs index e59ce0e6bc..8d815a8add 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs @@ -26,11 +26,10 @@ THE SOFTWARE. */ using System.Linq; using Paramore.Brighter.MessagingGateway.MsSql; using Paramore.Brighter.MSSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway; -[Trait("Category", "MSSQL")] +[Category("MSSQL")] public class MsSqlMessageConsumerDeliveryErrorDlqTests : IDisposable { private readonly MsSqlMessageProducer _producer; @@ -64,36 +63,34 @@ public MsSqlMessageConsumerDeliveryErrorDlqTests() new MessageBody("test content")); } - [Fact] - public void When_rejecting_message_with_delivery_error_should_send_to_dlq() + [Test] + public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq() { // Arrange - send a message and consume it from the source topic - _producer.Send(_message); + await _producer.SendAsync(_message); var receivedMessage = ConsumeMessage(_consumer); var originalTopic = receivedMessage.Header.Topic.Value; // Act - reject with DeliveryError - var result = _consumer.Reject(receivedMessage, + var result = await _consumer.RejectAsync(receivedMessage, new MessageRejectionReason(RejectionReason.DeliveryError, "Test delivery error")); // Assert - reject returns true - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - message should appear on DLQ var dlqMessage = ConsumeMessage(_dlqConsumer); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); // Assert - rejection metadata present in header bag - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(originalTopic, dlqMessage.Header.Bag["originalTopic"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.DeliveryError.ToString(), - dlqMessage.Header.Bag["rejectionReason"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal(MessageType.MT_COMMAND.ToString(), - dlqMessage.Header.Bag["originalMessageType"].ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalTopic"].ToString()).IsEqualTo(originalTopic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.DeliveryError.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalMessageType"].ToString()).IsEqualTo(MessageType.MT_COMMAND.ToString()); } private static Message ConsumeMessage(IAmAMessageConsumerSync consumer) diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs index f7e2899eb3..025e6313a3 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs @@ -27,11 +27,10 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.MsSql; using Paramore.Brighter.MSSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway; -[Trait("Category", "MSSQL")] +[Category("MSSQL")] public class MsSqlMessageConsumerDeliveryErrorDlqAsyncTests : IAsyncDisposable { private readonly MsSqlMessageProducer _producer; @@ -65,7 +64,7 @@ public MsSqlMessageConsumerDeliveryErrorDlqAsyncTests() new MessageBody("test content")); } - [Fact] + [Test] public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq_async() { // Arrange - send a message and consume it from the source topic via async path @@ -78,23 +77,21 @@ public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq_ new MessageRejectionReason(RejectionReason.DeliveryError, "Test delivery error")); // Assert - reject returns true - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - message should appear on DLQ var dlqMessage = await ConsumeMessageAsync(_dlqConsumer); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); // Assert - rejection metadata present in header bag - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(originalTopic, dlqMessage.Header.Bag["originalTopic"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.DeliveryError.ToString(), - dlqMessage.Header.Bag["rejectionReason"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal(MessageType.MT_COMMAND.ToString(), - dlqMessage.Header.Bag["originalMessageType"].ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalTopic"].ToString()).IsEqualTo(originalTopic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.DeliveryError.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalMessageType"].ToString()).IsEqualTo(MessageType.MT_COMMAND.ToString()); } private static async Task ConsumeMessageAsync(IAmAMessageConsumerAsync consumer) @@ -115,10 +112,10 @@ private static async Task ConsumeMessageAsync(IAmAMessageConsumerAsync public async ValueTask DisposeAsync() { await _consumer.PurgeAsync(); - _consumer.Dispose(); + await _consumer.DisposeAsync(); await _dlqConsumer.PurgeAsync(); - _dlqConsumer.Dispose(); - _producer.Dispose(); + await _dlqConsumer.DisposeAsync(); + await _producer.DisposeAsync(); GC.SuppressFinalize(this); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_rejecting_message_with_no_channels_configured_should_log_warning.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_rejecting_message_with_no_channels_configured_should_log_warning.cs index 68f398b08c..82d35d8d43 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_rejecting_message_with_no_channels_configured_should_log_warning.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_rejecting_message_with_no_channels_configured_should_log_warning.cs @@ -26,11 +26,10 @@ THE SOFTWARE. */ using System.Linq; using Paramore.Brighter.MessagingGateway.MsSql; using Paramore.Brighter.MSSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway; -[Trait("Category", "MSSQL")] +[Category("MSSQL")] public class MsSqlMessageConsumerNoChannelsConfiguredTests : IDisposable { private readonly MsSqlMessageProducer _producer; @@ -56,30 +55,30 @@ public MsSqlMessageConsumerNoChannelsConfiguredTests() _consumer = (MsSqlMessageConsumer)new MsSqlMessageConsumerFactory(testHelper.QueueConfiguration).Create(sub); } - [Fact] - public void When_rejecting_message_with_no_channels_configured_should_return_true() + [Test] + public async Task When_rejecting_message_with_no_channels_configured_should_return_true() { // Arrange - send a message and consume it var message = new Message( new MessageHeader(Guid.NewGuid().ToString(), _topic, MessageType.MT_COMMAND), new MessageBody("test content")); - _producer.Send(message); + await _producer.SendAsync(message); var receivedMessage = ConsumeMessage(_consumer); // Act - reject with DeliveryError but no channels configured - var result = _consumer.Reject(receivedMessage, + var result = await _consumer.RejectAsync(receivedMessage, new MessageRejectionReason(RejectionReason.DeliveryError, "Test delivery error")); // Assert - reject returns true (message is silently dropped) - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - consumer can continue to receive subsequent messages var nextMessage = new Message( new MessageHeader(Guid.NewGuid().ToString(), _topic, MessageType.MT_COMMAND), new MessageBody("second message")); - _producer.Send(nextMessage); + await _producer.SendAsync(nextMessage); var received = ConsumeMessage(_consumer); - Assert.Equal(nextMessage.Id, received.Id); + await Assert.That(received.Id).IsEqualTo(nextMessage.Id); } private static Message ConsumeMessage(IAmAMessageConsumerSync consumer) diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs index 9ee6fff434..eadb73271c 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs @@ -26,11 +26,10 @@ THE SOFTWARE. */ using System.Linq; using Paramore.Brighter.MessagingGateway.MsSql; using Paramore.Brighter.MSSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway; -[Trait("Category", "MSSQL")] +[Category("MSSQL")] public class MsSqlMessageConsumerUnacceptableFallbackToDlqTests : IDisposable { private readonly MsSqlMessageProducer _producer; @@ -65,26 +64,25 @@ public MsSqlMessageConsumerUnacceptableFallbackToDlqTests() new MessageBody("test content")); } - [Fact] - public void When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq() + [Test] + public async Task When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq() { // Arrange - send a message and consume it from the source topic - _producer.Send(_message); + await _producer.SendAsync(_message); var receivedMessage = ConsumeMessage(_consumer); // Act - reject with Unacceptable reason (no invalid channel configured) - var result = _consumer.Reject(receivedMessage, + var result = await _consumer.RejectAsync(receivedMessage, new MessageRejectionReason(RejectionReason.Unacceptable, "Bad message format")); // Assert - reject returns true - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - message should fall back to DLQ var dlqMessage = ConsumeMessage(_dlqConsumer); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); - Assert.Equal(RejectionReason.Unacceptable.ToString(), - dlqMessage.Header.Bag["rejectionReason"].ToString()); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.Unacceptable.ToString()); } private static Message ConsumeMessage(IAmAMessageConsumerSync consumer) diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs index cea32294d7..9c483e4fb3 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs @@ -26,11 +26,10 @@ THE SOFTWARE. */ using System.Linq; using Paramore.Brighter.MessagingGateway.MsSql; using Paramore.Brighter.MSSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway; -[Trait("Category", "MSSQL")] +[Category("MSSQL")] public class MsSqlMessageConsumerUnacceptableInvalidChannelTests : IDisposable { private readonly MsSqlMessageProducer _producer; @@ -68,30 +67,29 @@ public MsSqlMessageConsumerUnacceptableInvalidChannelTests() new MessageBody("test content")); } - [Fact] - public void When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel() + [Test] + public async Task When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel() { // Arrange - send a message and consume it from the source topic - _producer.Send(_message); + await _producer.SendAsync(_message); var receivedMessage = ConsumeMessage(_consumer); // Act - reject with Unacceptable reason - var result = _consumer.Reject(receivedMessage, + var result = await _consumer.RejectAsync(receivedMessage, new MessageRejectionReason(RejectionReason.Unacceptable, "Bad message format")); // Assert - reject returns true - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - message should appear on invalid message channel var invalidMessage = ConsumeMessage(_invalidConsumer); - Assert.NotEqual(MessageType.MT_NONE, invalidMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, invalidMessage.Body.Value); - Assert.Equal(RejectionReason.Unacceptable.ToString(), - invalidMessage.Header.Bag["rejectionReason"].ToString()); + await Assert.That(invalidMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(invalidMessage.Body.Value).IsEqualTo(_message.Body.Value); + await Assert.That(invalidMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.Unacceptable.ToString()); // Assert - DLQ should be empty - var dlqMessage = _dlqConsumer.Receive(TimeSpan.FromMilliseconds(1000)).First(); - Assert.Equal(MessageType.MT_NONE, dlqMessage.Header.MessageType); + var dlqMessage = (await _dlqConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))).First(); + await Assert.That(dlqMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } private static Message ConsumeMessage(IAmAMessageConsumerSync consumer) diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_requeueing_a_message.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_requeueing_a_message.cs index 30be88361a..1f5dc75979 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_requeueing_a_message.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_requeueing_a_message.cs @@ -1,14 +1,13 @@ -using System; +using System; using System.Net.Mime; using System.Text.Json; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.MsSql; using Paramore.Brighter.MSSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway { - [Trait("Category", "MSSQL")] + [Category("MSSQL")] public class MsSqlMessageConsumerRequeueTests { private readonly Message _message; @@ -47,8 +46,8 @@ public MsSqlMessageConsumerRequeueTests() _channelFactory = new ChannelFactory(new MsSqlMessageConsumerFactory(testHelper.QueueConfiguration)); } - [Fact] - public void When_requeueing_a_message() + [Test] + public async Task When_requeueing_a_message() { ((IAmAMessageProducerSync)_producerRegistry.LookupBy(_topic)).Send(_message); var channel = _channelFactory.CreateSyncChannel(_subscription); @@ -60,7 +59,7 @@ public void When_requeueing_a_message() //clear the queue channel.Acknowledge(requeuedMessage); - Assert.Equal(message.Body.Value, requeuedMessage.Body.Value); + await Assert.That(requeuedMessage.Body.Value).IsEqualTo(message.Body.Value); } } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_requeueing_a_message_aync.cs b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_requeueing_a_message_aync.cs index 2adcb6ab48..6782961821 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_requeueing_a_message_aync.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/MessagingGateway/When_requeueing_a_message_aync.cs @@ -1,19 +1,18 @@ -using System; +using System; using System.Net.Mime; using System.Text.Json; using System.Threading.Tasks; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.MsSql; using Paramore.Brighter.MSSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.MSSQL.Tests.MessagingGateway { - [Trait("Category", "MSSQL")] + [Category("MSSQL")] public class MsSqlMessageConsumerRequeueTestsAsync : IDisposable { private readonly Message _message; - private readonly IAmAProducerRegistry _producerRegistry; + private IAmAProducerRegistry _producerRegistry; private readonly IAmAChannelFactory _channelFactory; private readonly MsSqlSubscription _subscription; private readonly RoutingKey _topic; @@ -38,14 +37,21 @@ public MsSqlMessageConsumerRequeueTestsAsync() _subscription = new MsSqlSubscription(new SubscriptionName(channelName), new ChannelName(_topic), new RoutingKey(_topic)); - _producerRegistry = new MsSqlProducerRegistryFactory( + _channelFactory = new ChannelFactory(new MsSqlMessageConsumerFactory(testHelper.QueueConfiguration)); + } + + [Before(Test)] + public async Task Setup() + { + var testHelper = new MsSqlTestHelper(); + testHelper.SetupQueueDb(); + _producerRegistry = await new MsSqlProducerRegistryFactory( testHelper.QueueConfiguration, [new Publication {Topic = new RoutingKey(_topic)}] - ).CreateAsync().Result; - _channelFactory = new ChannelFactory(new MsSqlMessageConsumerFactory(testHelper.QueueConfiguration)); + ).CreateAsync(); } - [Fact] + [Test] public async Task When_requeueing_a_message_async() { await ((IAmAMessageProducerAsync)_producerRegistry.LookupAsyncBy(_topic)).SendAsync(_message); @@ -58,7 +64,7 @@ public async Task When_requeueing_a_message_async() //clear the queue await channel.AcknowledgeAsync(requeuedMessage); - Assert.Equal(message.Body.Value, requeuedMessage.Body.Value); + await Assert.That(requeuedMessage.Body.Value).IsEqualTo(message.Body.Value); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs index 2768c1299e..a4da5a2249 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Binary.Async; -public class WhenAddingADuplicateMessageItShouldNotThrowAsync : IAsyncLifetime +public class WhenAddingADuplicateMessageItShouldNotThrowAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenAddingADuplicateMessageItShouldNotThrowAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() { // Arrange @@ -47,6 +49,6 @@ public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs index 01d552031c..2c6461c9ed 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Binary.Async; -public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync : IAsyncLifetime +public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async() { // Arrange @@ -49,37 +51,37 @@ public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_ var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs index fb16fa445e..8e80350a5e 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Binary.Async; -public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async() { // Arrange @@ -54,6 +56,6 @@ public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Shoul var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs index 717c181853..ee96238849 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Binary.Async; -public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async() { // Arrange @@ -54,37 +56,37 @@ public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_A var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs index e845c5abf5..13350e97e1 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Binary.Async; -public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -58,8 +60,8 @@ public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Ou .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs index 9d016ba8b7..adf8941723 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Binary.Async; -public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -47,17 +46,20 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -84,8 +86,8 @@ public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Asy .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs index 2abb7dac74..d4c9d59fbf 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Binary.Async; -public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync : IAsyncLifetime +public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async() { // Arrange @@ -80,38 +82,38 @@ public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_M var message = await outbox.GetAsync(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs index d38e4f3a87..9fc5e173ce 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Binary.Async; -public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync : IAsyncLifetime +public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async() { // Arrange @@ -45,6 +47,6 @@ public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_ var message = await outbox.GetAsync(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs index 77fc94e4ef..8146e07e56 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Binary.Async; -public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync : IAsyncLifetime +public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync( _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async() { // Arrange @@ -80,9 +82,9 @@ public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_An var messages = (await _outboxProvider.GetAllMessagesAsync()).ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs index e7077ce72c..1c77fadda4 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Binary.Async; -public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_As var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs index 4f88d8adf4..1ab1972ec2 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Binary.Async; -public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync : IAsyncLifetime +public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async() { // Arrange @@ -82,9 +84,9 @@ public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requeste .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs index 666f98dcdb..30964699cf 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Binary.Async; -public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_A var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs index 7e80b7cd04..c88953d2f7 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenAddingADuplicateMessageItShouldNotThrow() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() + [Test] + public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw() { // Arrange var context = new RequestContext(); @@ -63,7 +62,7 @@ public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs index b928ef1bc0..552dc65557 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenAddingAMessageItShouldBeStoredWithAllProperties() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() + [Test] + public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() { // Arrange var context = new RequestContext(); @@ -64,38 +63,38 @@ public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs index 41b1f22ea4..8e28ae95dd 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,14 +47,14 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,12 +63,12 @@ public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_ // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Rollback(); + await transaction.RollbackAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs index 6e9060a475..af8c9e1b1e 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,14 +47,14 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,43 +63,43 @@ public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_C // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Commit(); + await transaction.CommitAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs index 23c5ab2fcb..97d5443070 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,9 +73,9 @@ public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs index 0abdb7b2ad..ef593ece2a 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,9 +73,9 @@ public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs index c33c5c758a..e69ebd1ec4 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() + [Test] + public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() { // Arrange var context = new RequestContext(); @@ -70,39 +69,39 @@ public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message var message = outbox.Get(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs index 2d78b34ebe..3fa4d13aaa 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() + [Test] + public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() { // Arrange var context = new RequestContext(); @@ -60,7 +59,7 @@ public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Messag var message = outbox.Get(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs index 53b8dbff72..a875abb697 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() + [Test] + public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() { // Arrange var context = new RequestContext(); @@ -70,10 +69,10 @@ public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undi var messages = _outboxProvider.GetAllMessages().ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs index 3fc8bcb297..a69a77f622 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,19 +71,19 @@ public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs index ea1e9a5d54..d3a913c6ce 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() + [Test] + public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() { // Arrange var context = new RequestContext(); @@ -72,10 +71,10 @@ public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Mess .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs index d4c0e3b53d..1093317785 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,19 +71,19 @@ public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs index 0eb83dc641..75a0eb9aec 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Text.Async; -public class WhenAddingADuplicateMessageItShouldNotThrowAsync : IAsyncLifetime +public class WhenAddingADuplicateMessageItShouldNotThrowAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenAddingADuplicateMessageItShouldNotThrowAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() { // Arrange @@ -47,6 +49,6 @@ public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs index a2a97511e6..3dc57093ce 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Text.Async; -public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync : IAsyncLifetime +public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async() { // Arrange @@ -49,37 +51,37 @@ public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_ var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs index 750167844f..4b9d237963 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Text.Async; -public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async() { // Arrange @@ -54,6 +56,6 @@ public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Shoul var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs index e278543c23..dac87f3c65 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Text.Async; -public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async() { // Arrange @@ -54,37 +56,37 @@ public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_A var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs index f609db4a22..398e0189b8 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Text.Async; -public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -58,8 +60,8 @@ public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Ou .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs index 569ab7c24a..4561f5bd88 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Text.Async; -public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -47,17 +46,20 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -84,8 +86,8 @@ public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Asy .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs index 6faad70a43..3bdbb60a71 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Text.Async; -public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync : IAsyncLifetime +public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async() { // Arrange @@ -80,38 +82,38 @@ public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_M var message = await outbox.GetAsync(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs index 1a7382c4fc..7a83638ec0 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Text.Async; -public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync : IAsyncLifetime +public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async() { // Arrange @@ -45,6 +47,6 @@ public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_ var message = await outbox.GetAsync(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs index efaacbd3e8..80cdcf2158 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Text.Async; -public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync : IAsyncLifetime +public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync( _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async() { // Arrange @@ -80,9 +82,9 @@ public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_An var messages = (await _outboxProvider.GetAllMessagesAsync()).ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs index 3439e4f2e3..d7be855700 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Text.Async; -public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_As var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs index f97ac9194e..9db03af4a3 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Text.Async; -public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync : IAsyncLifetime +public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async() { // Arrange @@ -82,9 +84,9 @@ public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requeste .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs index 794e2dd10a..add1ca9e16 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MSSQL.Tests.Outbox.Text.Async; -public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_A var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs index ad7e8248d7..c2298cf714 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenAddingADuplicateMessageItShouldNotThrow() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() + [Test] + public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw() { // Arrange var context = new RequestContext(); @@ -63,7 +62,7 @@ public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs index f0df593943..09c28a5235 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenAddingAMessageItShouldBeStoredWithAllProperties() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() + [Test] + public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() { // Arrange var context = new RequestContext(); @@ -64,38 +63,38 @@ public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs index 969a002209..565fe3c133 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,14 +47,14 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,12 +63,12 @@ public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_ // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Rollback(); + await transaction.RollbackAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs index f8c1799eb8..b608c373f9 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,14 +47,14 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,43 +63,43 @@ public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_C // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Commit(); + await transaction.CommitAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs index f2b80d9bf5..ac667a2c82 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,9 +73,9 @@ public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs index 6e39339fc5..b8304e197e 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,9 +73,9 @@ public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs index e2c55d2c88..eaa4437a58 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() + [Test] + public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() { // Arrange var context = new RequestContext(); @@ -70,39 +69,39 @@ public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message var message = outbox.Get(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs index 83e9fb24a0..55fb0fee5a 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() + [Test] + public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() { // Arrange var context = new RequestContext(); @@ -60,7 +59,7 @@ public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Messag var message = outbox.Get(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs index 7c63a231a9..488b248189 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() + [Test] + public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() { // Arrange var context = new RequestContext(); @@ -70,10 +69,10 @@ public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undi var messages = _outboxProvider.GetAllMessages().ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs index 4baaedf62f..1510462dec 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,19 +71,19 @@ public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs index fdf6402024..4cbd6e31f9 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() + [Test] + public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() { // Arrange var context = new RequestContext(); @@ -72,10 +71,10 @@ public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Mess .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs index 2dc4939184..13c98268d6 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.MSSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,19 +71,19 @@ public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MSSQL.Tests/Paramore.Brighter.MSSQL.Tests.csproj b/tests/Paramore.Brighter.MSSQL.Tests/Paramore.Brighter.MSSQL.Tests.csproj index 9522e0b23a..b47289cae8 100644 --- a/tests/Paramore.Brighter.MSSQL.Tests/Paramore.Brighter.MSSQL.Tests.csproj +++ b/tests/Paramore.Brighter.MSSQL.Tests/Paramore.Brighter.MSSQL.Tests.csproj @@ -1,36 +1,19 @@ - - - $(BrighterTestTargetFrameworks) - - false - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - + + $(BrighterTestTargetFrameworks) + false + Exe + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Paramore.Brighter.MongoDb.Tests/EntityFramework/MongoDbEntityFrameworkTransactionProviderAsyncTest.cs b/tests/Paramore.Brighter.MongoDb.Tests/EntityFramework/MongoDbEntityFrameworkTransactionProviderAsyncTest.cs index 5e537553dd..f94c751bc9 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/EntityFramework/MongoDbEntityFrameworkTransactionProviderAsyncTest.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/EntityFramework/MongoDbEntityFrameworkTransactionProviderAsyncTest.cs @@ -6,15 +6,14 @@ using Microsoft.EntityFrameworkCore.Storage; using MongoDB.Driver; using Paramore.Brighter.MongoDb.EntityFramework; -using Xunit; namespace Paramore.Brighter.MongoDb.Tests.EntityFramework; -[Trait("Category", "MongoDb")] -[Trait("Feature", "EntityFramework.TransactionProvider")] +[Category("MongoDb")] +[Property("Feature", "EntityFramework.TransactionProvider")] public class MongoDbEntityFrameworkTransactionProviderAsyncTest { - [Fact] + [Test] public async Task When_Committing_Async_Active_Transaction_Should_Call_CommitAsync() { // Arrange @@ -34,7 +33,7 @@ public async Task When_Committing_Async_Active_Transaction_Should_Call_CommitAsy .MustHaveHappenedOnceExactly(); } - [Fact] + [Test] public async Task When_Committing_Async_Null_Transaction_Does_Not_Throw() { // Arrange @@ -47,7 +46,7 @@ public async Task When_Committing_Async_Null_Transaction_Does_Not_Throw() await provider.CommitAsync(CancellationToken.None); } - [Fact] + [Test] public async Task When_Rolling_Back_Async_Active_Transaction_Should_Call_RollbackAsync() { // Arrange @@ -67,7 +66,7 @@ public async Task When_Rolling_Back_Async_Active_Transaction_Should_Call_Rollbac .MustHaveHappenedOnceExactly(); } - [Fact] + [Test] public async Task When_Rolling_Back_Async_Null_Transaction_Does_Not_Throw() { // Arrange @@ -80,7 +79,7 @@ public async Task When_Rolling_Back_Async_Null_Transaction_Does_Not_Throw() await provider.RollbackAsync(CancellationToken.None); } - [Fact] + [Test] public async Task When_Rolling_Back_Async_With_Default_CancellationToken() { // Arrange @@ -100,7 +99,7 @@ public async Task When_Rolling_Back_Async_With_Default_CancellationToken() .MustHaveHappenedOnceExactly(); } - [Fact] + [Test] public async Task When_Committing_Async_With_Specific_CancellationToken() { // Arrange @@ -122,7 +121,7 @@ public async Task When_Committing_Async_With_Specific_CancellationToken() .MustHaveHappenedOnceExactly(); } - [Fact] + [Test] public async Task When_Rolling_Back_Async_With_Specific_CancellationToken() { // Arrange @@ -144,14 +143,14 @@ public async Task When_Rolling_Back_Async_With_Specific_CancellationToken() .MustHaveHappenedOnceExactly(); } - [Fact] + [Test] public async Task When_Committing_Async_With_Cancelled_Token_Should_Propagate() { // Arrange var context = A.Fake(); var mockTransaction = A.Fake(); var cts = new CancellationTokenSource(); - cts.Cancel(); + await cts.CancelAsync(); A.CallTo(() => context.Database.CurrentTransaction).Returns(mockTransaction); A.CallTo(() => mockTransaction.CommitAsync(cts.Token)) @@ -164,14 +163,14 @@ await Assert.ThrowsAsync( () => provider.CommitAsync(cts.Token)); } - [Fact] + [Test] public async Task When_Rolling_Back_Async_With_Cancelled_Token_Should_Propagate() { // Arrange var context = A.Fake(); var mockTransaction = A.Fake(); var cts = new CancellationTokenSource(); - cts.Cancel(); + await cts.CancelAsync(); A.CallTo(() => context.Database.CurrentTransaction).Returns(mockTransaction); A.CallTo(() => mockTransaction.RollbackAsync(cts.Token)) @@ -184,7 +183,7 @@ await Assert.ThrowsAsync( () => provider.RollbackAsync(cts.Token)); } - [Fact] + [Test] public async Task When_Multiple_Operations_In_Sequence_Should_Maintain_State() { // Arrange @@ -207,11 +206,11 @@ public async Task When_Multiple_Operations_In_Sequence_Should_Maintain_State() var hasTransactionAfter = provider.HasOpenTransaction; // Assert - Assert.True(hasTransactionBefore); - Assert.False(hasTransactionAfter); + await Assert.That(hasTransactionBefore).IsTrue(); + await Assert.That(hasTransactionAfter).IsFalse(); } - [Fact] + [Test] public async Task When_Committing_Async_Then_Checking_HasOpenTransaction() { // Arrange @@ -228,15 +227,15 @@ public async Task When_Committing_Async_Then_Checking_HasOpenTransaction() var provider = new MongoDbEntityFrameworkTransactionProvider(context); // Act - Assert.True(provider.HasOpenTransaction); + await Assert.That(provider.HasOpenTransaction).IsTrue(); await provider.CommitAsync(CancellationToken.None); var hasTransactionAfterCommit = provider.HasOpenTransaction; // Assert - Assert.False(hasTransactionAfterCommit); + await Assert.That(hasTransactionAfterCommit).IsFalse(); } - [Fact] + [Test] public async Task When_Rolling_Back_Async_Then_Checking_HasOpenTransaction() { // Arrange @@ -253,15 +252,15 @@ public async Task When_Rolling_Back_Async_Then_Checking_HasOpenTransaction() var provider = new MongoDbEntityFrameworkTransactionProvider(context); // Act - Assert.True(provider.HasOpenTransaction); + await Assert.That(provider.HasOpenTransaction).IsTrue(); await provider.RollbackAsync(); var hasTransactionAfterRollback = provider.HasOpenTransaction; // Assert - Assert.False(hasTransactionAfterRollback); + await Assert.That(hasTransactionAfterRollback).IsFalse(); } - [Fact] + [Test] public async Task When_Commit_Called_Async_Multiple_Times_Should_Not_Throw() { // Arrange @@ -282,7 +281,7 @@ public async Task When_Commit_Called_Async_Multiple_Times_Should_Not_Throw() await provider.CommitAsync(CancellationToken.None); // Second commit with null transaction - should not throw } - [Fact] + [Test] public async Task When_Rollback_Called_Async_Multiple_Times_Should_Not_Throw() { // Arrange diff --git a/tests/Paramore.Brighter.MongoDb.Tests/EntityFramework/MongoDbEntityFrameworkTransactionProviderTest.cs b/tests/Paramore.Brighter.MongoDb.Tests/EntityFramework/MongoDbEntityFrameworkTransactionProviderTest.cs index e5a2e0af8b..d809cff640 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/EntityFramework/MongoDbEntityFrameworkTransactionProviderTest.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/EntityFramework/MongoDbEntityFrameworkTransactionProviderTest.cs @@ -5,16 +5,15 @@ using Microsoft.EntityFrameworkCore.Storage; using MongoDB.Driver; using Paramore.Brighter.MongoDb.EntityFramework; -using Xunit; namespace Paramore.Brighter.MongoDb.Tests.EntityFramework; -[Trait("Category", "MongoDb")] -[Trait("Feature", "EntityFramework.TransactionProvider")] +[Category("MongoDb")] +[Property("Feature", "EntityFramework.TransactionProvider")] public class MongoDbEntityFrameworkTransactionProviderTest { - [Fact] - public void When_Creating_Provider_With_DbContext_Should_Initialize_Correctly() + [Test] + public async Task When_Creating_Provider_With_DbContext_Should_Initialize_Correctly() { // Arrange var context = A.Fake(); @@ -23,11 +22,11 @@ public void When_Creating_Provider_With_DbContext_Should_Initialize_Correctly() var provider = new MongoDbEntityFrameworkTransactionProvider(context); // Assert - Assert.NotNull(provider); + await Assert.That(provider).IsNotNull(); } - [Fact] - public void When_Getting_IsSharedConnection_Should_Return_True() + [Test] + public async Task When_Getting_IsSharedConnection_Should_Return_True() { // Arrange var context = A.Fake(); @@ -37,11 +36,11 @@ public void When_Getting_IsSharedConnection_Should_Return_True() var isShared = provider.IsSharedConnection; // Assert - Assert.True(isShared); + await Assert.That(isShared).IsTrue(); } - [Fact] - public void When_HasOpenTransaction_Initially_Should_Return_False() + [Test] + public async Task When_HasOpenTransaction_Initially_Should_Return_False() { // Arrange var context = A.Fake(); @@ -52,11 +51,11 @@ public void When_HasOpenTransaction_Initially_Should_Return_False() var hasOpenTransaction = provider.HasOpenTransaction; // Assert - Assert.False(hasOpenTransaction); + await Assert.That(hasOpenTransaction).IsFalse(); } - [Fact] - public void When_HasOpenTransaction_With_Active_Transaction_Should_Return_True() + [Test] + public async Task When_HasOpenTransaction_With_Active_Transaction_Should_Return_True() { // Arrange var context = A.Fake(); @@ -68,11 +67,11 @@ public void When_HasOpenTransaction_With_Active_Transaction_Should_Return_True() var hasOpenTransaction = provider.HasOpenTransaction; // Assert - Assert.True(hasOpenTransaction); + await Assert.That(hasOpenTransaction).IsTrue(); } - [Fact] - public void When_Getting_Transaction_With_Non_MongoTransaction_Throws() + [Test] + public async Task When_Getting_Transaction_With_Non_MongoTransaction_Throws() { // Arrange var context = A.Fake(); @@ -84,12 +83,12 @@ public void When_Getting_Transaction_With_Non_MongoTransaction_Throws() var provider = new MongoDbEntityFrameworkTransactionProvider(context); // Act & Assert - var ex = Assert.Throws(() => provider.GetTransaction()); - Assert.Contains("not a MongoTransaction", ex.Message); + var ex = await Assert.That(() => provider.GetTransaction()).ThrowsExactly(); + await Assert.That(ex.Message).Contains("not a MongoTransaction"); } - [Fact] - public void When_Committing_Active_Transaction_Should_Call_Commit() + [Test] + public async Task When_Committing_Active_Transaction_Should_Call_Commit() { // Arrange var context = A.Fake(); @@ -105,8 +104,8 @@ public void When_Committing_Active_Transaction_Should_Call_Commit() A.CallTo(() => mockTransaction.Commit()).MustHaveHappenedOnceExactly(); } - [Fact] - public void When_Committing_Null_Transaction_Does_Not_Throw() + [Test] + public async Task When_Committing_Null_Transaction_Does_Not_Throw() { // Arrange var context = A.Fake(); @@ -118,8 +117,8 @@ public void When_Committing_Null_Transaction_Does_Not_Throw() provider.Commit(); } - [Fact] - public void When_Rolling_Back_Active_Transaction_Should_Call_Rollback() + [Test] + public async Task When_Rolling_Back_Active_Transaction_Should_Call_Rollback() { // Arrange var context = A.Fake(); @@ -129,14 +128,14 @@ public void When_Rolling_Back_Active_Transaction_Should_Call_Rollback() var provider = new MongoDbEntityFrameworkTransactionProvider(context); // Act - provider.Rollback(); + await provider.RollbackAsync(); // Assert A.CallTo(() => mockTransaction.Rollback()).MustHaveHappenedOnceExactly(); } - [Fact] - public void When_Rolling_Back_Null_Transaction_Does_Not_Throw() + [Test] + public async Task When_Rolling_Back_Null_Transaction_Does_Not_Throw() { // Arrange var context = A.Fake(); @@ -145,11 +144,11 @@ public void When_Rolling_Back_Null_Transaction_Does_Not_Throw() var provider = new MongoDbEntityFrameworkTransactionProvider(context); // Act & Assert - Should not throw - provider.Rollback(); + await provider.RollbackAsync(); } - [Fact] - public void When_Closing_Active_Transaction_Should_Call_Dispose() + [Test] + public async Task When_Closing_Active_Transaction_Should_Call_Dispose() { // Arrange var context = A.Fake(); @@ -165,8 +164,8 @@ public void When_Closing_Active_Transaction_Should_Call_Dispose() A.CallTo(() => mockTransaction.Dispose()).MustHaveHappenedOnceExactly(); } - [Fact] - public void When_Closing_Null_Transaction_Does_Not_Throw() + [Test] + public async Task When_Closing_Null_Transaction_Does_Not_Throw() { // Arrange var context = A.Fake(); @@ -178,8 +177,8 @@ public void When_Closing_Null_Transaction_Does_Not_Throw() provider.Close(); } - [Fact] - public void When_Committing_And_Then_Checking_HasOpenTransaction() + [Test] + public async Task When_Committing_And_Then_Checking_HasOpenTransaction() { // Arrange var context = A.Fake(); @@ -193,16 +192,16 @@ public void When_Committing_And_Then_Checking_HasOpenTransaction() var provider = new MongoDbEntityFrameworkTransactionProvider(context); // Act - Assert.True(provider.HasOpenTransaction); + await Assert.That(provider.HasOpenTransaction).IsTrue(); provider.Commit(); var hasTransactionAfterCommit = provider.HasOpenTransaction; // Assert - Assert.False(hasTransactionAfterCommit); + await Assert.That(hasTransactionAfterCommit).IsFalse(); } - [Fact] - public void When_Rolling_Back_And_Then_Checking_HasOpenTransaction() + [Test] + public async Task When_Rolling_Back_And_Then_Checking_HasOpenTransaction() { // Arrange var context = A.Fake(); @@ -215,16 +214,16 @@ public void When_Rolling_Back_And_Then_Checking_HasOpenTransaction() var provider = new MongoDbEntityFrameworkTransactionProvider(context); // Act - Assert.True(provider.HasOpenTransaction); - provider.Rollback(); + await Assert.That(provider.HasOpenTransaction).IsTrue(); + await provider.RollbackAsync(); var hasTransactionAfterRollback = provider.HasOpenTransaction; // Assert - Assert.False(hasTransactionAfterRollback); + await Assert.That(hasTransactionAfterRollback).IsFalse(); } - [Fact] - public void When_Closing_And_Then_Checking_HasOpenTransaction() + [Test] + public async Task When_Closing_And_Then_Checking_HasOpenTransaction() { // Arrange var context = A.Fake(); @@ -237,16 +236,16 @@ public void When_Closing_And_Then_Checking_HasOpenTransaction() var provider = new MongoDbEntityFrameworkTransactionProvider(context); // Act - Assert.True(provider.HasOpenTransaction); + await Assert.That(provider.HasOpenTransaction).IsTrue(); provider.Close(); var hasTransactionAfterClose = provider.HasOpenTransaction; // Assert - Assert.False(hasTransactionAfterClose); + await Assert.That(hasTransactionAfterClose).IsFalse(); } - [Fact] - public void When_Commit_Called_Multiple_Times_Should_Not_Throw() + [Test] + public async Task When_Commit_Called_Multiple_Times_Should_Not_Throw() { // Arrange var context = A.Fake(); @@ -264,8 +263,8 @@ public void When_Commit_Called_Multiple_Times_Should_Not_Throw() provider.Commit(); // Second commit with null transaction - should not throw } - [Fact] - public void When_Rollback_Called_Multiple_Times_Should_Not_Throw() + [Test] + public async Task When_Rollback_Called_Multiple_Times_Should_Not_Throw() { // Arrange var context = A.Fake(); @@ -278,7 +277,7 @@ public void When_Rollback_Called_Multiple_Times_Should_Not_Throw() var provider = new MongoDbEntityFrameworkTransactionProvider(context); // Act & Assert - provider.Rollback(); // First rollback - provider.Rollback(); // Second rollback with null transaction - should not throw + await provider.RollbackAsync(); // First rollback + await provider.RollbackAsync(); // Second rollback with null transaction - should not throw } } diff --git a/tests/Paramore.Brighter.MongoDb.Tests/MongoDbLockingProviderTest.cs b/tests/Paramore.Brighter.MongoDb.Tests/MongoDbLockingProviderTest.cs index 6e3868870e..899151dcb3 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/MongoDbLockingProviderTest.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/MongoDbLockingProviderTest.cs @@ -1,12 +1,11 @@ -using System; +using System; using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.Locking.MongoDb; -using Xunit; namespace Paramore.Brighter.MongoDb.Tests; -[Trait("Category", "MongoDb")] +[Category("MongoDb")] public class MongoDbLockingProviderTest { private readonly MongoDbLockingProvider _locking; @@ -16,7 +15,7 @@ public MongoDbLockingProviderTest() _locking = new MongoDbLockingProvider(Configuration.CreateLocking("locking")); } - [Fact] + [Test] public async Task GivenAnPostgresLockingProvider_WhenLockIsCalled_ItCanOnlyBeObtainedOnce() { var resourceName = $"TestLock-{Guid.NewGuid()}"; @@ -24,11 +23,11 @@ public async Task GivenAnPostgresLockingProvider_WhenLockIsCalled_ItCanOnlyBeObt var first = await _locking.ObtainLockAsync(resourceName, CancellationToken.None); var second = await _locking.ObtainLockAsync(resourceName, CancellationToken.None); - Assert.Equal(first, resourceName); - Assert.Null(second); + await Assert.That(resourceName).IsEqualTo(first); + await Assert.That(second).IsNull(); } - [Fact] + [Test] public async Task GivenAnPostgresLockingProviderWithALockedBlob_WhenReleaseLockIsCalled_ItCanOnlyBeLockedAgain() { var resourceName = $"TestLock-{Guid.NewGuid()}"; @@ -39,8 +38,8 @@ public async Task GivenAnPostgresLockingProviderWithALockedBlob_WhenReleaseLockI var second = await _locking.ObtainLockAsync(resourceName, CancellationToken.None); var third = await _locking.ObtainLockAsync(resourceName, CancellationToken.None); - Assert.Equal(first, resourceName); - Assert.Equal(second, resourceName); - Assert.Null(third); + await Assert.That(resourceName).IsEqualTo(first); + await Assert.That(resourceName).IsEqualTo(second); + await Assert.That(third).IsNull(); } } diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs index c079562a1e..47d93b8646 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MongoDB.Tests.Outbox.Async; -public class WhenAddingADuplicateMessageItShouldNotThrowAsync : IAsyncLifetime +public class WhenAddingADuplicateMessageItShouldNotThrowAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenAddingADuplicateMessageItShouldNotThrowAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() { // Arrange @@ -47,6 +49,6 @@ public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } } diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs index fa771cacb8..381bbda065 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MongoDB.Tests.Outbox.Async; -public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync : IAsyncLifetime +public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async() { // Arrange @@ -49,37 +51,37 @@ public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_ var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs index 476f1fb84f..07e69793d2 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MongoDB.Tests.Outbox.Async; -public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -58,8 +60,8 @@ public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Ou .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs index 65e2c02517..4810f27ff3 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.MongoDB.Tests.Outbox.Async; -public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -47,17 +46,20 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -84,8 +86,8 @@ public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Asy .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs index dcfd9cd788..d5acf4da12 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.MongoDB.Tests.Outbox.Async; -public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync : IAsyncLifetime +public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async() { // Arrange @@ -80,38 +82,38 @@ public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_M var message = await outbox.GetAsync(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs index a6805556d0..6757bfdd01 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MongoDB.Tests.Outbox.Async; -public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync : IAsyncLifetime +public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async() { // Arrange @@ -45,6 +47,6 @@ public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_ var message = await outbox.GetAsync(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs index deb94f73e7..0609bc4e69 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.MongoDB.Tests.Outbox.Async; -public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync : IAsyncLifetime +public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync( _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async() { // Arrange @@ -80,9 +82,9 @@ public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_An var messages = (await _outboxProvider.GetAllMessagesAsync()).ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs index 1e63f3d147..f2c0b60ee0 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MongoDB.Tests.Outbox.Async; -public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_As var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs index ee82e0a7c1..4e36556060 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.MongoDB.Tests.Outbox.Async; -public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync : IAsyncLifetime +public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async() { // Arrange @@ -82,9 +84,9 @@ public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requeste .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs index 5bedc98967..7ffddecc72 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MongoDB.Tests.Outbox.Async; -public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_A var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs index 20088f18b2..fd58de3a88 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenAddingADuplicateMessageItShouldNotThrow() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() + [Test] + public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw() { // Arrange var context = new RequestContext(); @@ -63,7 +62,7 @@ public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } public void Dispose() diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs index e563dce3c3..46c281f1c2 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenAddingAMessageItShouldBeStoredWithAllProperties() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() + [Test] + public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() { // Arrange var context = new RequestContext(); @@ -64,38 +63,38 @@ public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs index c7f3149174..18b458510e 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,9 +73,9 @@ public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs index c56eac5e30..514f0b2210 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,9 +73,9 @@ public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs index 1315a6ebdb..60d6f06a1b 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() + [Test] + public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() { // Arrange var context = new RequestContext(); @@ -70,39 +69,39 @@ public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message var message = outbox.Get(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs index ac131ad624..e775a81813 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() + [Test] + public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() { // Arrange var context = new RequestContext(); @@ -60,7 +59,7 @@ public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Messag var message = outbox.Get(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs index 4a63f3fd1a..bfd92d3faa 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() + [Test] + public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() { // Arrange var context = new RequestContext(); @@ -70,10 +69,10 @@ public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undi var messages = _outboxProvider.GetAllMessages().ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs index 4413ef503e..68bcc8072a 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,19 +71,19 @@ public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs index c08fd7c103..38f84c7432 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() + [Test] + public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() { // Arrange var context = new RequestContext(); @@ -72,10 +71,10 @@ public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Mess .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs index 48be80f360..8ef20834e6 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Outbox/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,19 +71,19 @@ public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Paramore.Brighter.MongoDb.Tests.csproj b/tests/Paramore.Brighter.MongoDb.Tests/Paramore.Brighter.MongoDb.Tests.csproj index 86380e97e0..d5e15c2750 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Paramore.Brighter.MongoDb.Tests.csproj +++ b/tests/Paramore.Brighter.MongoDb.Tests/Paramore.Brighter.MongoDb.Tests.csproj @@ -1,32 +1,16 @@ - $(BrighterTestTargetFrameworks) false + Exe - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - + + - - + - @@ -36,5 +20,4 @@ - - + \ No newline at end of file diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_unwrapping_a_large_message.cs b/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_unwrapping_a_large_message.cs index 4b9427cce1..8b2bf18dfd 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_unwrapping_a_large_message.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_unwrapping_a_large_message.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Text.Json; using System.Threading.Tasks; @@ -7,11 +7,10 @@ using Paramore.Brighter.MongoDb.Tests.TestDoubles; using Paramore.Brighter.Transformers.MongoGridFS; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.MongoDb.Tests.Transformers; -[Trait("Category", "MongoDb")] +[Category("MongoDb")] public class LargeMessagePayloadUnwrapTests { private readonly TransformPipelineBuilder _pipelineBuilder; @@ -20,7 +19,6 @@ public class LargeMessagePayloadUnwrapTests public LargeMessagePayloadUnwrapTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); var mapperRegistry = new MessageMapperRegistry( new SimpleMessageMapperFactory(_ => new MyLargeCommandMessageMapper()), @@ -39,8 +37,8 @@ public LargeMessagePayloadUnwrapTests() _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, messageTransformerFactory); } - [Fact] - public void When_unwrapping_a_large_message() + [Test] + public async Task When_unwrapping_a_large_message() { //store our luggage and get the claim check var contents = DataGenerator.CreateString(6000); @@ -50,10 +48,10 @@ public void When_unwrapping_a_large_message() var stream = new MemoryStream(); var writer = new StreamWriter(stream); - writer.Write(commandAsJson); - writer.Flush(); + await writer.WriteAsync(commandAsJson); + await writer.FlushAsync(); stream.Position = 0; - var id = _luggageStore.Store(stream); + var id = await _luggageStore.StoreAsync(stream); //pretend we ran through the claim check myCommand.Value = $"Claim Check {id}"; @@ -75,7 +73,7 @@ public void When_unwrapping_a_large_message() //assert //contents should be from storage - Assert.Equal(contents, transformedMessage.Value); - Assert.False(_luggageStore.HasClaim(id)); + await Assert.That(transformedMessage.Value).IsEqualTo(contents); + await Assert.That(await _luggageStore.HasClaimAsync(id)).IsFalse(); } } diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_unwrapping_a_large_message_async.cs b/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_unwrapping_a_large_message_async.cs index dba3d3bc56..52adb4e616 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_unwrapping_a_large_message_async.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_unwrapping_a_large_message_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Text.Json; using System.Threading.Tasks; @@ -8,11 +8,10 @@ using Paramore.Brighter.Observability; using Paramore.Brighter.Transformers.MongoGridFS; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.MongoDb.Tests.Transformers; -[Trait("Category", "MongoDb")] +[Category("MongoDb")] public class LargeMessagePayloadAsyncUnwrapTests { private readonly TransformPipelineBuilderAsync _pipelineBuilder; @@ -21,7 +20,6 @@ public class LargeMessagePayloadAsyncUnwrapTests public LargeMessagePayloadAsyncUnwrapTests() { //arrange - TransformPipelineBuilder.ClearPipelineCache(); var mapperRegistry = new MessageMapperRegistry( null, @@ -40,7 +38,7 @@ public LargeMessagePayloadAsyncUnwrapTests() _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, messageTransformerFactory, InstrumentationOptions.All); } - [Fact] + [Test] public async Task When_unwrapping_a_large_message_async() { //arrange @@ -79,7 +77,7 @@ public async Task When_unwrapping_a_large_message_async() //assert //contents should be from storage - Assert.Equal(contents, transformedMessage.Value); - Assert.False(await _luggageStore.HasClaimAsync(id)); + await Assert.That(transformedMessage.Value).IsEqualTo(contents); + await Assert.That(await _luggageStore.HasClaimAsync(id)).IsFalse(); } } diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_validating_a_luggage_store_exists.cs b/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_validating_a_luggage_store_exists.cs index 5658f2a3b9..5e1e145ae0 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_validating_a_luggage_store_exists.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_validating_a_luggage_store_exists.cs @@ -1,16 +1,15 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Transformers.MongoGridFS; using Paramore.Brighter.Transforms.Storage; -using Xunit; namespace Paramore.Brighter.MongoDb.Tests.Transformers; -[Trait("Category", "MongoDb")] +[Category("MongoDb")] public class LuggageStoreExistsTests { - [Fact] - public void When_checking_store_that_does_not_exist() + [Test] + public async Task When_checking_store_that_does_not_exist() { //act var doesNotExist = Catch.Exception(() => @@ -27,7 +26,7 @@ public void When_checking_store_that_does_not_exist() luggageStore.EnsureStoreExists(); }); - Assert.NotNull(doesNotExist); - Assert.True(doesNotExist is InvalidOperationException); + await Assert.That(doesNotExist).IsNotNull(); + await Assert.That(doesNotExist is InvalidOperationException).IsTrue(); } } diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_validating_a_luggage_store_exists_async.cs b/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_validating_a_luggage_store_exists_async.cs index 270c4828f6..df261db9c5 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_validating_a_luggage_store_exists_async.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_validating_a_luggage_store_exists_async.cs @@ -1,15 +1,14 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.Transformers.MongoGridFS; using Paramore.Brighter.Transforms.Storage; -using Xunit; namespace Paramore.Brighter.MongoDb.Tests.Transformers; -[Trait("Category", "MongoDb")] +[Category("MongoDb")] public class LuggageStoreExistsAsyncTests { - [Fact] + [Test] public async Task When_checking_store_that_does_not_exist_async() { //act @@ -27,7 +26,7 @@ public async Task When_checking_store_that_does_not_exist_async() await luggageStore.EnsureStoreExistsAsync(); }); - Assert.NotNull(doesNotExist); - Assert.True(doesNotExist is InvalidOperationException); + await Assert.That(doesNotExist).IsNotNull(); + await Assert.That(doesNotExist is InvalidOperationException).IsTrue(); } } diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_wrapping_a_large_message.cs b/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_wrapping_a_large_message.cs index 9873718c3b..58f44c29d4 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_wrapping_a_large_message.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_wrapping_a_large_message.cs @@ -1,13 +1,12 @@ -using System; +using System; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MongoDb.Tests.TestDoubles; using Paramore.Brighter.Transformers.MongoGridFS; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.MongoDb.Tests.Transformers; -[Trait("Category", "MongoDb")] +[Category("MongoDb")] public class LargeMessagePayloadWrapTests : IDisposable { private string? _id; @@ -20,7 +19,6 @@ public class LargeMessagePayloadWrapTests : IDisposable public LargeMessagePayloadWrapTests () { //arrange - TransformPipelineBuilderAsync.ClearPipelineCache(); var mapperRegistry = new MessageMapperRegistry( new SimpleMessageMapperFactory(_ => new MyLargeCommandMessageMapper()), @@ -44,20 +42,20 @@ public LargeMessagePayloadWrapTests () _pipelineBuilder = new TransformPipelineBuilder(mapperRegistry, transformerFactoryAsync); } - [Fact] - public void When_wrapping_a_large_message() + [Test] + public async Task When_wrapping_a_large_message() { //act _transformPipeline = _pipelineBuilder.BuildWrapPipeline(); var message = _transformPipeline.Wrap(_myCommand, new RequestContext(), _publication); //assert - Assert.True(message.Header.Bag.ContainsKey(ClaimCheckTransformer.CLAIM_CHECK)); - Assert.NotNull(message.Header.DataRef); + await Assert.That(message.Header.Bag.ContainsKey(ClaimCheckTransformer.CLAIM_CHECK)).IsTrue(); + await Assert.That(message.Header.DataRef).IsNotNull(); _id = (string)message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK]; - Assert.Equal($"Claim Check {_id}", message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo($"Claim Check {_id}"); - Assert.True(_luggageStore.HasClaim(_id)); + await Assert.That(await _luggageStore.HasClaimAsync(_id)).IsTrue(); } public void Dispose() diff --git a/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_wrapping_a_large_message_async.cs b/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_wrapping_a_large_message_async.cs index 6e54fc1495..0e5c31e876 100644 --- a/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_wrapping_a_large_message_async.cs +++ b/tests/Paramore.Brighter.MongoDb.Tests/Transformers/When_wrapping_a_large_message_async.cs @@ -1,15 +1,14 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.AWS.Tests.TestDoubles; using Paramore.Brighter.MongoDb.Tests.TestDoubles; using Paramore.Brighter.Observability; using Paramore.Brighter.Transformers.MongoGridFS; using Paramore.Brighter.Transforms.Transformers; -using Xunit; namespace Paramore.Brighter.MongoDb.Tests.Transformers; -[Trait("Category", "MongoDb")] +[Category("MongoDb")] public class LargeMessagePayloadAsyncWrapTests : IAsyncDisposable { private string? _id; @@ -22,7 +21,6 @@ public class LargeMessagePayloadAsyncWrapTests : IAsyncDisposable public LargeMessagePayloadAsyncWrapTests () { //arrange - TransformPipelineBuilderAsync.ClearPipelineCache(); var mapperRegistry = new MessageMapperRegistry(null, new SimpleMessageMapperFactoryAsync( @@ -46,7 +44,7 @@ public LargeMessagePayloadAsyncWrapTests () _pipelineBuilder = new TransformPipelineBuilderAsync(mapperRegistry, transformerFactoryAsync, InstrumentationOptions.All); } - [Fact] + [Test] public async Task When_wrapping_a_large_message_async() { //act @@ -54,12 +52,12 @@ public async Task When_wrapping_a_large_message_async() var message = await _transformPipeline.WrapAsync(_myCommand, new RequestContext(), _publication); //assert - Assert.True(message.Header.Bag.ContainsKey(ClaimCheckTransformer.CLAIM_CHECK)); - Assert.NotNull(message.Header.DataRef); + await Assert.That(message.Header.Bag.ContainsKey(ClaimCheckTransformer.CLAIM_CHECK)).IsTrue(); + await Assert.That(message.Header.DataRef).IsNotNull(); _id = (string)message.Header.Bag[ClaimCheckTransformer.CLAIM_CHECK]; - Assert.Equal($"Claim Check {_id}", message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo($"Claim Check {_id}"); - Assert.True(await _luggageStore.HasClaimAsync(_id)); + await Assert.That(await _luggageStore.HasClaimAsync(_id)).IsTrue(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs index 77e6feb6de..30ff2e4ade 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MySQL.Tests.Outbox.Binary.Async; -public class WhenAddingADuplicateMessageItShouldNotThrowAsync : IAsyncLifetime +public class WhenAddingADuplicateMessageItShouldNotThrowAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenAddingADuplicateMessageItShouldNotThrowAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() { // Arrange @@ -47,6 +49,6 @@ public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs index d62b07b895..2381e7f6a7 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MySQL.Tests.Outbox.Binary.Async; -public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync : IAsyncLifetime +public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async() { // Arrange @@ -49,37 +51,37 @@ public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_ var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs index b3471e3214..886f57bcb8 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MySQL.Tests.Outbox.Binary.Async; -public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async() { // Arrange @@ -54,6 +56,6 @@ public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Shoul var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs index 48879ed5c4..c6a18d3d73 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MySQL.Tests.Outbox.Binary.Async; -public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async() { // Arrange @@ -54,37 +56,37 @@ public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_A var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs index aa50a35fc7..f872d14df2 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MySQL.Tests.Outbox.Binary.Async; -public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -58,8 +60,8 @@ public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Ou .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs index 33920f11b8..80f0d5968c 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.MySQL.Tests.Outbox.Binary.Async; -public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -47,17 +46,20 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -84,8 +86,8 @@ public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Asy .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs index 64e5220f0e..3a970cb5cd 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.MySQL.Tests.Outbox.Binary.Async; -public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync : IAsyncLifetime +public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async() { // Arrange @@ -80,38 +82,38 @@ public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_M var message = await outbox.GetAsync(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs index af1ca45194..2c36efdd9f 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MySQL.Tests.Outbox.Binary.Async; -public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync : IAsyncLifetime +public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async() { // Arrange @@ -45,6 +47,6 @@ public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_ var message = await outbox.GetAsync(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs index a93c1ef76d..91242a784b 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.MySQL.Tests.Outbox.Binary.Async; -public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync : IAsyncLifetime +public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync( _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async() { // Arrange @@ -80,9 +82,9 @@ public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_An var messages = (await _outboxProvider.GetAllMessagesAsync()).ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs index 451e4b0410..434c2d59fd 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MySQL.Tests.Outbox.Binary.Async; -public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_As var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs index c238091a9e..7239d59492 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.MySQL.Tests.Outbox.Binary.Async; -public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync : IAsyncLifetime +public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async() { // Arrange @@ -82,9 +84,9 @@ public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requeste .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs index 52c885c4e9..7469fa81b5 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MySQL.Tests.Outbox.Binary.Async; -public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_A var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs index 379ce96415..5ff25c6501 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenAddingADuplicateMessageItShouldNotThrow() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() + [Test] + public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw() { // Arrange var context = new RequestContext(); @@ -63,7 +62,7 @@ public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs index 8aae392fdb..c99ac126a2 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenAddingAMessageItShouldBeStoredWithAllProperties() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() + [Test] + public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() { // Arrange var context = new RequestContext(); @@ -64,38 +63,38 @@ public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs index 37af643fa3..a16610d073 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,14 +47,14 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,12 +63,12 @@ public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_ // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Rollback(); + await transaction.RollbackAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs index 93dd923e89..f3384e5f28 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,14 +47,14 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,43 +63,43 @@ public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_C // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Commit(); + await transaction.CommitAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs index aea73d7c44..02a1933e9a 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,9 +73,9 @@ public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs index fa7d8df5fd..27e3ac0da0 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,9 +73,9 @@ public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs index a35643c036..6e216dfaa9 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() + [Test] + public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() { // Arrange var context = new RequestContext(); @@ -70,39 +69,39 @@ public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message var message = outbox.Get(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs index ee0d6007c3..d3e90b603d 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() + [Test] + public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() { // Arrange var context = new RequestContext(); @@ -60,7 +59,7 @@ public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Messag var message = outbox.Get(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs index bb9f1b8442..4b1f2155a3 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() + [Test] + public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() { // Arrange var context = new RequestContext(); @@ -70,10 +69,10 @@ public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undi var messages = _outboxProvider.GetAllMessages().ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs index 4829ff03ff..fc17d8bd7c 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,19 +71,19 @@ public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs index 480c009ee0..8f72bba12a 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() + [Test] + public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() { // Arrange var context = new RequestContext(); @@ -72,10 +71,10 @@ public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Mess .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs index 8785ce0c4f..e139b5c091 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,19 +71,19 @@ public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs index 18553dadc7..922ab5c64c 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MySQL.Tests.Outbox.Text.Async; -public class WhenAddingADuplicateMessageItShouldNotThrowAsync : IAsyncLifetime +public class WhenAddingADuplicateMessageItShouldNotThrowAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenAddingADuplicateMessageItShouldNotThrowAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() { // Arrange @@ -47,6 +49,6 @@ public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs index 741813e4aa..f086fcbfd7 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MySQL.Tests.Outbox.Text.Async; -public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync : IAsyncLifetime +public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async() { // Arrange @@ -49,37 +51,37 @@ public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_ var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs index 9de913d501..a048d14720 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MySQL.Tests.Outbox.Text.Async; -public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async() { // Arrange @@ -54,6 +56,6 @@ public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Shoul var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs index 3a9c424ca0..eb69b27948 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MySQL.Tests.Outbox.Text.Async; -public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async() { // Arrange @@ -54,37 +56,37 @@ public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_A var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs index eb5a90b390..c64a1e1b7d 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MySQL.Tests.Outbox.Text.Async; -public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -58,8 +60,8 @@ public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Ou .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs index d7fd916b26..ee0ff7c94e 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.MySQL.Tests.Outbox.Text.Async; -public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -47,17 +46,20 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -84,8 +86,8 @@ public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Asy .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs index 6af5587205..32bd5c6e9b 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.MySQL.Tests.Outbox.Text.Async; -public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync : IAsyncLifetime +public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async() { // Arrange @@ -80,38 +82,38 @@ public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_M var message = await outbox.GetAsync(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs index a75353237f..12e55eeb2d 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MySQL.Tests.Outbox.Text.Async; -public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync : IAsyncLifetime +public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async() { // Arrange @@ -45,6 +47,6 @@ public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_ var message = await outbox.GetAsync(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs index f4c4e02eca..aa700562b6 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.MySQL.Tests.Outbox.Text.Async; -public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync : IAsyncLifetime +public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync( _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async() { // Arrange @@ -80,9 +82,9 @@ public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_An var messages = (await _outboxProvider.GetAllMessagesAsync()).ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs index 733203d2af..e090c88015 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MySQL.Tests.Outbox.Text.Async; -public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_As var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs index 92fdf9ec88..e820db40ed 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.MySQL.Tests.Outbox.Text.Async; -public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync : IAsyncLifetime +public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async() { // Arrange @@ -82,9 +84,9 @@ public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requeste .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs index c930ec642a..a21104948a 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.MySQL.Tests.Outbox.Text.Async; -public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_A var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs index c8f3a3e37d..277bcf3637 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenAddingADuplicateMessageItShouldNotThrow() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() + [Test] + public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw() { // Arrange var context = new RequestContext(); @@ -63,7 +62,7 @@ public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs index f03c328148..edf8fb0f3e 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenAddingAMessageItShouldBeStoredWithAllProperties() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() + [Test] + public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() { // Arrange var context = new RequestContext(); @@ -64,38 +63,38 @@ public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs index a0cb7e0c78..645aab1cb2 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,14 +47,14 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,12 +63,12 @@ public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_ // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Rollback(); + await transaction.RollbackAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs index 738108150f..9eeed72671 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,14 +47,14 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,43 +63,43 @@ public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_C // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Commit(); + await transaction.CommitAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs index a4335b3e50..1b242ea82a 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,9 +73,9 @@ public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs index 678efdafbe..ffadbd9924 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,9 +73,9 @@ public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs index cb87d2fcfa..e036cb349e 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() + [Test] + public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() { // Arrange var context = new RequestContext(); @@ -70,39 +69,39 @@ public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message var message = outbox.Get(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs index 26de3ced3a..d723bc3e99 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() + [Test] + public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() { // Arrange var context = new RequestContext(); @@ -60,7 +59,7 @@ public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Messag var message = outbox.Get(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs index e7c9f74e41..70f4c9009e 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() + [Test] + public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() { // Arrange var context = new RequestContext(); @@ -70,10 +69,10 @@ public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undi var messages = _outboxProvider.GetAllMessages().ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs index 0edbb4f693..62a5af375b 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,19 +71,19 @@ public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs index 9a7c917daf..efdba201f8 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() + [Test] + public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() { // Arrange var context = new RequestContext(); @@ -72,10 +71,10 @@ public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Mess .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs index 125c598259..ac2fd6c75f 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.MySQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,19 +71,19 @@ public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.MySQL.Tests/Paramore.Brighter.MySQL.Tests.csproj b/tests/Paramore.Brighter.MySQL.Tests/Paramore.Brighter.MySQL.Tests.csproj index a8989a8071..40ed75873b 100644 --- a/tests/Paramore.Brighter.MySQL.Tests/Paramore.Brighter.MySQL.Tests.csproj +++ b/tests/Paramore.Brighter.MySQL.Tests/Paramore.Brighter.MySQL.Tests.csproj @@ -1,34 +1,18 @@ - - - $(BrighterTestNineOnlyTargetFrameworks) - false - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - + + $(BrighterTestNineOnlyTargetFrameworks) + false + Exe + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_a_message_is_sent_keep_order.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_a_message_is_sent_keep_order.cs index 6a9e02d4c2..be208f2e32 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_a_message_is_sent_keep_order.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_a_message_is_sent_keep_order.cs @@ -1,14 +1,13 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.Postgres; using Paramore.Brighter.PostgresSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.PostgresSQL.Tests.MessagingGateway; -[Trait("Category", "PostgresSql")] +[Category("PostgresSql")] public class OrderTest : IAsyncDisposable, IDisposable { private readonly string _queueName = Guid.NewGuid().ToString(); @@ -36,8 +35,8 @@ public OrderTest() _consumer = new PostgresConsumerFactory(new PostgresMessagingGatewayConnection(testHelper.Configuration)).Create(sub); } - [Fact] - public void When_a_message_is_sent_keep_order() + [Test] + public async Task When_a_message_is_sent_keep_order() { //Send a sequence of messages to postgres var msgId = SendMessage(); @@ -49,23 +48,23 @@ public void When_a_message_is_sent_keep_order() var firstMessage = ConsumeMessages(_consumer); var message = firstMessage.First(); - Assert.False(message.IsEmpty); - Assert.Equal(msgId, message.Id); + await Assert.That(message.IsEmpty).IsFalse(); + await Assert.That(message.Id).IsEqualTo(msgId); var secondMessage = ConsumeMessages(_consumer); message = secondMessage.First(); - Assert.False(message.IsEmpty); - Assert.Equal(msgId2, message.Id); + await Assert.That(message.IsEmpty).IsFalse(); + await Assert.That(message.Id).IsEqualTo(msgId2); var thirdMessages = ConsumeMessages(_consumer); message = thirdMessages.First(); - Assert.False(message.IsEmpty); - Assert.Equal(msgId3, message.Id); + await Assert.That(message.IsEmpty).IsFalse(); + await Assert.That(message.Id).IsEqualTo(msgId3); var fourthMessage = ConsumeMessages(_consumer); message = fourthMessage.First(); - Assert.False(message.IsEmpty); - Assert.Equal(msgId4, message.Id); + await Assert.That(message.IsEmpty).IsFalse(); + await Assert.That(message.Id).IsEqualTo(msgId4); } private string SendMessage() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_a_message_is_sent_keep_order_async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_a_message_is_sent_keep_order_async.cs index fe93ae34e0..9e50d0f114 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_a_message_is_sent_keep_order_async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_a_message_is_sent_keep_order_async.cs @@ -1,22 +1,22 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.Postgres; using Paramore.Brighter.PostgresSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.PostgresSQL.Tests.MessagingGateway; -[Trait("Category", "PostgresSql")] -public class OrderTestAsync : IAsyncDisposable, IDisposable +[Category("PostgresSql")] +public class OrderTestAsync : IAsyncDisposable { private readonly string _queueName = Guid.NewGuid().ToString(); private readonly string _topicName = Guid.NewGuid().ToString(); - private readonly IAmAProducerRegistry _producerRegistry; - private readonly IAmAMessageConsumerAsync _consumer; + private IAmAProducerRegistry _producerRegistry; + private IAmAMessageConsumerAsync _consumer; - public OrderTestAsync() + [Before(Test)] + public async Task Setup() { var testHelper = new PostgresSqlTestHelper(); testHelper.SetupDatabase(); @@ -28,15 +28,15 @@ public OrderTestAsync() new ChannelName(_topicName), routingKey, messagePumpType: MessagePumpType.Proactor); - _producerRegistry = new PostgresProducerRegistryFactory( + _producerRegistry = await new PostgresProducerRegistryFactory( new PostgresMessagingGatewayConnection(testHelper.Configuration), [new PostgresPublication { Topic = routingKey }] - ).CreateAsync().GetAwaiter().GetResult(); - + ).CreateAsync(); + _consumer = new PostgresConsumerFactory(new PostgresMessagingGatewayConnection(testHelper.Configuration)).CreateAsync(sub); } - [Fact] + [Test] public async Task When_a_message_is_sent_keep_order() { //Send a sequence of messages to postgres @@ -49,23 +49,23 @@ public async Task When_a_message_is_sent_keep_order() var firstMessage = await ConsumeMessagesAsync(_consumer); var message = firstMessage.First(); - Assert.False(message.IsEmpty); - Assert.Equal(msgId, message.Id); + await Assert.That(message.IsEmpty).IsFalse(); + await Assert.That(message.Id).IsEqualTo(msgId); var secondMessage = await ConsumeMessagesAsync(_consumer); message = secondMessage.First(); - Assert.False(message.IsEmpty); - Assert.Equal(msgId2, message.Id); + await Assert.That(message.IsEmpty).IsFalse(); + await Assert.That(message.Id).IsEqualTo(msgId2); var thirdMessages = await ConsumeMessagesAsync(_consumer); message = thirdMessages.First(); - Assert.False(message.IsEmpty); - Assert.Equal(msgId3, message.Id); + await Assert.That(message.IsEmpty).IsFalse(); + await Assert.That(message.Id).IsEqualTo(msgId3); var fourthMessage = await ConsumeMessagesAsync(_consumer); message = fourthMessage.First(); - Assert.False(message.IsEmpty); - Assert.Equal(msgId4, message.Id); + await Assert.That(message.IsEmpty).IsFalse(); + await Assert.That(message.Id).IsEqualTo(msgId4); } private async Task SendMessageAsync() @@ -104,7 +104,8 @@ private async Task> ConsumeMessagesAsync(IAmAMessageConsume return messages; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { _producerRegistry.Dispose(); ((IAmAMessageConsumerSync)_consumer).Dispose(); diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_creating_postgres_consumer_with_dlq_subscription_should_pass_routing_keys.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_creating_postgres_consumer_with_dlq_subscription_should_pass_routing_keys.cs index 1492ae23f7..4263bc060e 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_creating_postgres_consumer_with_dlq_subscription_should_pass_routing_keys.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_creating_postgres_consumer_with_dlq_subscription_should_pass_routing_keys.cs @@ -26,7 +26,6 @@ THE SOFTWARE. */ using System.Reflection; using Paramore.Brighter.MessagingGateway.Postgres; using Paramore.Brighter.PostgresSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.PostgresSQL.Tests.MessagingGateway; @@ -44,8 +43,8 @@ public PostgresMessageConsumerFactoryDlqTests() _factory = new PostgresConsumerFactory(connection); } - [Fact] - public void When_creating_postgres_consumer_with_dlq_subscription_should_pass_routing_keys() + [Test] + public async Task When_creating_postgres_consumer_with_dlq_subscription_should_pass_routing_keys() { //Arrange var dlqRoutingKey = new RoutingKey("orders-dlq"); @@ -64,7 +63,7 @@ public void When_creating_postgres_consumer_with_dlq_subscription_should_pass_ro _consumer = _factory.Create(subscription); //Assert - verify the factory passed routing keys to the consumer - Assert.NotNull(_consumer); + await Assert.That(_consumer).IsNotNull(); var consumerType = _consumer.GetType(); var dlqField = consumerType.GetField("_deadLetterRoutingKey", @@ -72,17 +71,17 @@ public void When_creating_postgres_consumer_with_dlq_subscription_should_pass_ro var invalidField = consumerType.GetField("_invalidMessageRoutingKey", BindingFlags.NonPublic | BindingFlags.Instance); - Assert.NotNull(dlqField); - Assert.NotNull(invalidField); + await Assert.That(dlqField).IsNotNull(); + await Assert.That(invalidField).IsNotNull(); var actualDlq = dlqField.GetValue(_consumer) as RoutingKey; var actualInvalid = invalidField.GetValue(_consumer) as RoutingKey; - Assert.NotNull(actualDlq); - Assert.Equal("orders-dlq", actualDlq.Value); + await Assert.That(actualDlq).IsNotNull(); + await Assert.That(actualDlq.Value).IsEqualTo("orders-dlq"); - Assert.NotNull(actualInvalid); - Assert.Equal("orders-invalid", actualInvalid.Value); + await Assert.That(actualInvalid).IsNotNull(); + await Assert.That(actualInvalid.Value).IsEqualTo("orders-invalid"); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_creating_postgres_subscription_with_dlq_routing_keys_should_expose_properties.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_creating_postgres_subscription_with_dlq_routing_keys_should_expose_properties.cs index 691408c9f1..1073a9b9d7 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_creating_postgres_subscription_with_dlq_routing_keys_should_expose_properties.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_creating_postgres_subscription_with_dlq_routing_keys_should_expose_properties.cs @@ -24,14 +24,13 @@ THE SOFTWARE. */ using Paramore.Brighter.MessagingGateway.Postgres; using Paramore.Brighter.PostgresSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.PostgresSQL.Tests.MessagingGateway; public class PostgresSubscriptionDlqRoutingKeyTests { - [Fact] - public void When_creating_postgres_subscription_with_dlq_routing_keys_should_expose_properties() + [Test] + public async Task When_creating_postgres_subscription_with_dlq_routing_keys_should_expose_properties() { //Arrange var deadLetterRoutingKey = new RoutingKey("orders-dlq"); @@ -48,17 +47,17 @@ public void When_creating_postgres_subscription_with_dlq_routing_keys_should_exp ); //Assert - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var dlqSupport = (IUseBrighterDeadLetterSupport)subscription; - Assert.Equal(deadLetterRoutingKey, dlqSupport.DeadLetterRoutingKey); + await Assert.That(dlqSupport.DeadLetterRoutingKey).IsEqualTo(deadLetterRoutingKey); - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var invalidSupport = (IUseBrighterInvalidMessageSupport)subscription; - Assert.Equal(invalidMessageRoutingKey, invalidSupport.InvalidMessageRoutingKey); + await Assert.That(invalidSupport.InvalidMessageRoutingKey).IsEqualTo(invalidMessageRoutingKey); } - [Fact] - public void When_creating_postgres_subscription_without_dlq_routing_keys_should_default_to_null() + [Test] + public async Task When_creating_postgres_subscription_without_dlq_routing_keys_should_default_to_null() { //Arrange & Act var subscription = new PostgresSubscription( @@ -69,12 +68,12 @@ public void When_creating_postgres_subscription_without_dlq_routing_keys_should_ ); //Assert - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var dlqSupport = (IUseBrighterDeadLetterSupport)subscription; - Assert.Null(dlqSupport.DeadLetterRoutingKey); + await Assert.That(dlqSupport.DeadLetterRoutingKey).IsNull(); - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var invalidSupport = (IUseBrighterInvalidMessageSupport)subscription; - Assert.Null(invalidSupport.InvalidMessageRoutingKey); + await Assert.That(invalidSupport.InvalidMessageRoutingKey).IsNull(); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_postgres_consumer_requeues_with_delay_should_use_native_sql.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_postgres_consumer_requeues_with_delay_should_use_native_sql.cs index 0a577b3cd6..6b2bb6d72f 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_postgres_consumer_requeues_with_delay_should_use_native_sql.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_postgres_consumer_requeues_with_delay_should_use_native_sql.cs @@ -5,11 +5,10 @@ using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.Postgres; using Paramore.Brighter.PostgresSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.PostgresSQL.Tests.MessagingGateway; -[Trait("Category", "PostgresSql")] +[Category("PostgresSql")] public class PostgreSqlMessageConsumerNativeDelayTests : IDisposable { private readonly Message _message; @@ -49,8 +48,8 @@ public PostgreSqlMessageConsumerNativeDelayTests() _channelFactory = new PostgresChannelFactory(new PostgresMessagingGatewayConnection(testHelper.Configuration)); } - [Fact] - public void When_postgres_consumer_requeues_with_delay_should_use_native_sql() + [Test] + public async Task When_postgres_consumer_requeues_with_delay_should_use_native_sql() { // Arrange - send and receive a message ((IAmAMessageProducerSync)_producerRegistry.LookupBy(_topic)).Send(_message); @@ -62,17 +61,17 @@ public void When_postgres_consumer_requeues_with_delay_should_use_native_sql() bool requeued = channel.Requeue(message, requeueDelay); // Assert - requeue succeeded - Assert.True(requeued); + await Assert.That(requeued).IsTrue(); // Assert - message is NOT visible immediately (native SQL sets visible_timeout in the future) var immediateReceive = channel.Receive(TimeSpan.FromMilliseconds(500)); - Assert.Equal(MessageType.MT_NONE, immediateReceive.Header.MessageType); + await Assert.That(immediateReceive.Header.MessageType).IsEqualTo(MessageType.MT_NONE); // Assert - message becomes visible after the delay elapses Thread.Sleep(requeueDelay); var delayedReceive = channel.Receive(TimeSpan.FromMilliseconds(2000)); - Assert.Equal(MessageType.MT_COMMAND, delayedReceive.Header.MessageType); - Assert.Equal(message.Body.Value, delayedReceive.Body.Value); + await Assert.That(delayedReceive.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(delayedReceive.Body.Value).IsEqualTo(message.Body.Value); // Cleanup channel.Acknowledge(delayedReceive); diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_queue_is_purged.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_queue_is_purged.cs index 8b6a8df9dc..a66f147327 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_queue_is_purged.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_queue_is_purged.cs @@ -1,14 +1,13 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.Postgres; using Paramore.Brighter.PostgresSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.PostgresSQL.Tests.MessagingGateway; -[Trait("Category", "PostgresSql")] +[Category("PostgresSql")] public class PurgeTest : IAsyncDisposable, IDisposable { private readonly string _queueName = Guid.NewGuid().ToString(); @@ -36,8 +35,8 @@ public PurgeTest() _consumer = new PostgresConsumerFactory(new PostgresMessagingGatewayConnection(testHelper.Configuration)).Create(sub); } - [Fact] - public void When_queue_is_Purged() + [Test] + public async Task When_queue_is_Purged() { //Send a sequence of messages to postgres var msgId = SendMessage(); @@ -46,7 +45,7 @@ public void When_queue_is_Purged() var firstMessage = ConsumeMessages(_consumer); var message = firstMessage.First(); - Assert.Equal(msgId, message.Id); + await Assert.That(message.Id).IsEqualTo(msgId); _consumer.Purge(); @@ -55,7 +54,7 @@ public void When_queue_is_Purged() var nextMessage = ConsumeMessages(_consumer); message = nextMessage.First(); - Assert.Equal(new Message(), message); + await Assert.That(message).IsEqualTo(new Message()); } private string SendMessage() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_queue_is_purged_async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_queue_is_purged_async.cs index d92372f26f..962b7377d9 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_queue_is_purged_async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_queue_is_purged_async.cs @@ -1,22 +1,22 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.Postgres; using Paramore.Brighter.PostgresSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.PostgresSQL.Tests.MessagingGateway; -[Trait("Category", "PostgresSql")] -public class PurgeTestAsync : IAsyncDisposable, IDisposable +[Category("PostgresSql")] +public class PurgeTestAsync : IAsyncDisposable { private readonly string _queueName = Guid.NewGuid().ToString(); - private readonly IAmAProducerRegistry _producerRegistry; - private readonly IAmAMessageConsumerAsync _consumer; - private readonly RoutingKey _routingKey; + private IAmAProducerRegistry _producerRegistry; + private IAmAMessageConsumerAsync _consumer; + private RoutingKey _routingKey; - public PurgeTestAsync() + [Before(Test)] + public async Task Setup() { var testHelper = new PostgresSqlTestHelper(); testHelper.SetupDatabase(); @@ -27,16 +27,16 @@ public PurgeTestAsync() new SubscriptionName(_queueName), new ChannelName(_routingKey.Value), _routingKey, messagePumpType: MessagePumpType.Proactor); - - _producerRegistry = new PostgresProducerRegistryFactory( + + _producerRegistry = await new PostgresProducerRegistryFactory( new PostgresMessagingGatewayConnection(testHelper.Configuration), [new PostgresPublication { Topic = _routingKey } ] - ).CreateAsync().GetAwaiter().GetResult(); - + ).CreateAsync(); + _consumer = new PostgresConsumerFactory(new PostgresMessagingGatewayConnection(testHelper.Configuration)).CreateAsync(sub); } - [Fact] + [Test] public async Task When_queue_is_Purged() { //Send a sequence of messages to postgres @@ -45,7 +45,7 @@ public async Task When_queue_is_Purged() // Now read those messages in order var firstMessage = await ConsumeMessagesAsync(_consumer); var message = firstMessage.First(); - Assert.Equal(msgId, message.Id); + await Assert.That(message.Id).IsEqualTo(msgId); await _consumer.PurgeAsync(); @@ -53,7 +53,7 @@ public async Task When_queue_is_Purged() var nextMessage = await ConsumeMessagesAsync(_consumer); message = nextMessage.First(); - Assert.Equal(new Message(), message); + await Assert.That(message).IsEqualTo(new Message()); } private async Task SendMessageAsync() @@ -91,7 +91,8 @@ private async Task> ConsumeMessagesAsync(IAmAMessageConsume return messages; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { ((IAmAMessageConsumerSync)_consumer).Dispose(); _producerRegistry.Dispose(); diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs index f4adf3f4a2..da72a91ac4 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs @@ -26,11 +26,10 @@ THE SOFTWARE. */ using System.Linq; using Paramore.Brighter.MessagingGateway.Postgres; using Paramore.Brighter.PostgresSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.PostgresSQL.Tests.MessagingGateway; -[Trait("Category", "PostgresSql")] +[Category("PostgresSql")] public class PostgresMessageConsumerDeliveryErrorDlqTests : IDisposable { private readonly IAmAMessageProducerSync _producer; @@ -79,8 +78,8 @@ public PostgresMessageConsumerDeliveryErrorDlqTests() new MessageBody("test content")); } - [Fact] - public void When_rejecting_message_with_delivery_error_should_send_to_dlq() + [Test] + public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq() { // Arrange - send a message and consume it from the source topic _producer.Send(_message); @@ -92,27 +91,25 @@ public void When_rejecting_message_with_delivery_error_should_send_to_dlq() new MessageRejectionReason(RejectionReason.DeliveryError, "Test delivery error")); // Assert - reject returns true - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - message should appear on DLQ var dlqMessage = ConsumeMessage(_dlqConsumer); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); // Assert - rejection metadata present in header bag - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(originalTopic, dlqMessage.Header.Bag["originalTopic"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.DeliveryError.ToString(), - dlqMessage.Header.Bag["rejectionReason"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal(MessageType.MT_COMMAND.ToString(), - dlqMessage.Header.Bag["originalMessageType"].ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalTopic"].ToString()).IsEqualTo(originalTopic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.DeliveryError.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalMessageType"].ToString()).IsEqualTo(MessageType.MT_COMMAND.ToString()); // Assert - source message is deleted (re-reading from source returns MT_NONE) var sourceMessage = ConsumeMessage(_consumer); - Assert.Equal(MessageType.MT_NONE, sourceMessage.Header.MessageType); + await Assert.That(sourceMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } private static Message ConsumeMessage(IAmAMessageConsumerSync consumer) diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs index 8a3a7e8efe..998db0d626 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs @@ -27,11 +27,10 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.Postgres; using Paramore.Brighter.PostgresSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.PostgresSQL.Tests.MessagingGateway; -[Trait("Category", "PostgresSql")] +[Category("PostgresSql")] public class PostgresMessageConsumerDeliveryErrorDlqAsyncTests : IAsyncDisposable { private readonly IAmAMessageProducerAsync _producer; @@ -78,7 +77,7 @@ public PostgresMessageConsumerDeliveryErrorDlqAsyncTests() new MessageBody("test content")); } - [Fact] + [Test] public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq_async() { // Arrange - send a message and consume it from the source topic via async path @@ -91,27 +90,25 @@ public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq_ new MessageRejectionReason(RejectionReason.DeliveryError, "Test delivery error")); // Assert - reject returns true - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - message should appear on DLQ var dlqMessage = await ConsumeMessageAsync(_dlqConsumer); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); // Assert - rejection metadata present in header bag - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(originalTopic, dlqMessage.Header.Bag["originalTopic"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.DeliveryError.ToString(), - dlqMessage.Header.Bag["rejectionReason"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal(MessageType.MT_COMMAND.ToString(), - dlqMessage.Header.Bag["originalMessageType"].ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalTopic"].ToString()).IsEqualTo(originalTopic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.DeliveryError.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalMessageType"].ToString()).IsEqualTo(MessageType.MT_COMMAND.ToString()); // Assert - source message is deleted (re-reading from source returns MT_NONE) var sourceMessage = await ConsumeMessageAsync(_consumer); - Assert.Equal(MessageType.MT_NONE, sourceMessage.Header.MessageType); + await Assert.That(sourceMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } private static async Task ConsumeMessageAsync(IAmAMessageConsumerAsync consumer) diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_rejecting_message_with_no_channels_configured_should_delete_and_log_warning.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_rejecting_message_with_no_channels_configured_should_delete_and_log_warning.cs index 095bb86fdb..e4895ce04a 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_rejecting_message_with_no_channels_configured_should_delete_and_log_warning.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_rejecting_message_with_no_channels_configured_should_delete_and_log_warning.cs @@ -26,11 +26,10 @@ THE SOFTWARE. */ using System.Linq; using Paramore.Brighter.MessagingGateway.Postgres; using Paramore.Brighter.PostgresSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.PostgresSQL.Tests.MessagingGateway; -[Trait("Category", "PostgresSql")] +[Category("PostgresSql")] public class PostgresMessageConsumerNoChannelsConfiguredTests : IDisposable { private readonly IAmAMessageProducerSync _producer; @@ -64,8 +63,8 @@ public PostgresMessageConsumerNoChannelsConfiguredTests() _consumer = consumerFactory.Create(sub); } - [Fact] - public void When_rejecting_message_with_no_channels_configured_should_delete_and_log_warning() + [Test] + public async Task When_rejecting_message_with_no_channels_configured_should_delete_and_log_warning() { // Arrange - send a message and consume it var message = new Message( @@ -79,11 +78,11 @@ public void When_rejecting_message_with_no_channels_configured_should_delete_and new MessageRejectionReason(RejectionReason.DeliveryError, "Test delivery error")); // Assert - reject returns true (source deleted, message silently dropped) - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - source message is deleted (re-reading returns MT_NONE) var sourceMessage = ConsumeMessage(_consumer); - Assert.Equal(MessageType.MT_NONE, sourceMessage.Header.MessageType); + await Assert.That(sourceMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); // Assert - consumer can continue to receive subsequent messages var nextMessage = new Message( @@ -91,7 +90,7 @@ public void When_rejecting_message_with_no_channels_configured_should_delete_and new MessageBody("second message")); _producer.Send(nextMessage); var received = ConsumeMessage(_consumer); - Assert.Equal(nextMessage.Id, received.Id); + await Assert.That(received.Id).IsEqualTo(nextMessage.Id); } private static Message ConsumeMessage(IAmAMessageConsumerSync consumer) diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs index 23c6b1620d..339c22824e 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs @@ -26,11 +26,10 @@ THE SOFTWARE. */ using System.Linq; using Paramore.Brighter.MessagingGateway.Postgres; using Paramore.Brighter.PostgresSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.PostgresSQL.Tests.MessagingGateway; -[Trait("Category", "PostgresSql")] +[Category("PostgresSql")] public class PostgresMessageConsumerUnacceptableFallbackDlqTests : IDisposable { private readonly IAmAMessageProducerSync _producer; @@ -78,8 +77,8 @@ public PostgresMessageConsumerUnacceptableFallbackDlqTests() new MessageBody("test content")); } - [Fact] - public void When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq() + [Test] + public async Task When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq() { // Arrange - send a message and consume it _producer.Send(_message); @@ -90,16 +89,16 @@ public void When_rejecting_message_with_unacceptable_and_no_invalid_channel_shou new MessageRejectionReason(RejectionReason.Unacceptable, "Bad message format")); // Assert - reject returns true - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - message should appear on DLQ (fallback) var dlqMessage = ConsumeMessage(_dlqConsumer); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); // Assert - source message is deleted var sourceMessage = ConsumeMessage(_consumer); - Assert.Equal(MessageType.MT_NONE, sourceMessage.Header.MessageType); + await Assert.That(sourceMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } private static Message ConsumeMessage(IAmAMessageConsumerSync consumer) diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs index dd50db3275..291996b9b3 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs @@ -26,11 +26,10 @@ THE SOFTWARE. */ using System.Linq; using Paramore.Brighter.MessagingGateway.Postgres; using Paramore.Brighter.PostgresSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.PostgresSQL.Tests.MessagingGateway; -[Trait("Category", "PostgresSql")] +[Category("PostgresSql")] public class PostgresMessageConsumerUnacceptableInvalidChannelTests : IDisposable { private readonly IAmAMessageProducerSync _producer; @@ -87,8 +86,8 @@ public PostgresMessageConsumerUnacceptableInvalidChannelTests() new MessageBody("test content")); } - [Fact] - public void When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel() + [Test] + public async Task When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel() { // Arrange - send a message and consume it _producer.Send(_message); @@ -99,20 +98,20 @@ public void When_rejecting_message_with_unacceptable_reason_should_send_to_inval new MessageRejectionReason(RejectionReason.Unacceptable, "Bad message format")); // Assert - reject returns true - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - message should appear on the invalid message channel var invalidMessage = ConsumeMessage(_invalidConsumer); - Assert.NotEqual(MessageType.MT_NONE, invalidMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, invalidMessage.Body.Value); + await Assert.That(invalidMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(invalidMessage.Body.Value).IsEqualTo(_message.Body.Value); // Assert - DLQ should be empty var dlqMessage = ConsumeMessage(_dlqConsumer); - Assert.Equal(MessageType.MT_NONE, dlqMessage.Header.MessageType); + await Assert.That(dlqMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); // Assert - source message is deleted var sourceMessage = ConsumeMessage(_consumer); - Assert.Equal(MessageType.MT_NONE, sourceMessage.Header.MessageType); + await Assert.That(sourceMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } private static Message ConsumeMessage(IAmAMessageConsumerSync consumer) diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_requeueing_a_message.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_requeueing_a_message.cs index 72335903bb..6afbd8d8eb 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_requeueing_a_message.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_requeueing_a_message.cs @@ -1,15 +1,14 @@ -using System; +using System; using System.Net.Mime; using System.Text.Json; using System.Threading; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.Postgres; using Paramore.Brighter.PostgresSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.PostgresSQL.Tests.MessagingGateway; -[Trait("Category", "PostgresSql")] +[Category("PostgresSql")] public class PostgreSqlMessageConsumerRequeueTests { private readonly Message _message; @@ -49,13 +48,13 @@ public PostgreSqlMessageConsumerRequeueTests() _channelFactory = new PostgresChannelFactory(new PostgresMessagingGatewayConnection(testHelper.Configuration)); } - [Fact] - public void When_requeueing_a_message() + [Test] + public async Task When_requeueing_a_message() { ((IAmAMessageProducerSync)_producerRegistry.LookupBy(_topic)).Send(_message); var channel = _channelFactory.CreateSyncChannel(_subscription); var message = channel.Receive(TimeSpan.FromMilliseconds(2000)); - Assert.True(channel.Requeue(message, TimeSpan.FromMilliseconds(100))); + await Assert.That(channel.Requeue(message, TimeSpan.FromMilliseconds(100))).IsTrue(); Thread.Sleep(TimeSpan.FromMilliseconds(100)); @@ -64,6 +63,6 @@ public void When_requeueing_a_message() //clear the queue channel.Acknowledge(requeuedMessage); - Assert.Equal(message.Body.Value, requeuedMessage.Body.Value); + await Assert.That(requeuedMessage.Body.Value).IsEqualTo(message.Body.Value); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_requeueing_a_message_aync.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_requeueing_a_message_aync.cs index 2a9f8c6f58..ea36bac477 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_requeueing_a_message_aync.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/MessagingGateway/When_requeueing_a_message_aync.cs @@ -1,19 +1,18 @@ -using System; +using System; using System.Net.Mime; using System.Text.Json; using System.Threading.Tasks; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.Postgres; using Paramore.Brighter.PostgresSQL.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.PostgresSQL.Tests.MessagingGateway; -[Trait("Category", "PostgresSql")] +[Category("PostgresSql")] public class PostgreSqlMessageConsumerRequeueTestsAsync : IDisposable { private readonly Message _message; - private readonly IAmAProducerRegistry _producerRegistry; + private IAmAProducerRegistry _producerRegistry; private readonly IAmAChannelFactory _channelFactory; private readonly PostgresSubscription _subscription; private readonly RoutingKey _topic; @@ -37,24 +36,30 @@ public PostgreSqlMessageConsumerRequeueTestsAsync() testHelper.SetupDatabase(); _subscription = new PostgresSubscription(new SubscriptionName(channelName), - new ChannelName(_topic), + new ChannelName(_topic), new RoutingKey(_topic), messagePumpType: MessagePumpType.Proactor); - - _producerRegistry = new PostgresProducerRegistryFactory( + _channelFactory = new PostgresChannelFactory(new PostgresMessagingGatewayConnection(testHelper.Configuration)); + } + + [Before(Test)] + public async Task Setup() + { + var testHelper = new PostgresSqlTestHelper(); + testHelper.SetupDatabase(); + _producerRegistry = await new PostgresProducerRegistryFactory( new PostgresMessagingGatewayConnection(testHelper.Configuration), [new PostgresPublication {Topic = new RoutingKey(_topic)}] - ).CreateAsync().Result; - _channelFactory = new PostgresChannelFactory(new PostgresMessagingGatewayConnection(testHelper.Configuration)); + ).CreateAsync(); } - [Fact] + [Test] public async Task When_requeueing_a_message_async() { await _producerRegistry.LookupAsyncBy(_topic).SendAsync(_message); var channel = await _channelFactory.CreateAsyncChannelAsync(_subscription); var message = await channel.ReceiveAsync(TimeSpan.FromMilliseconds(2000)); - Assert.True(await channel.RequeueAsync(message, TimeSpan.FromMilliseconds(100))); + await Assert.That(await channel.RequeueAsync(message, TimeSpan.FromMilliseconds(100))).IsTrue(); await Task.Delay(TimeSpan.FromMilliseconds(100)); @@ -63,7 +68,7 @@ public async Task When_requeueing_a_message_async() //clear the queue await channel.AcknowledgeAsync(requeuedMessage); - Assert.Equal(message.Body.Value, requeuedMessage.Body.Value); + await Assert.That(requeuedMessage.Body.Value).IsEqualTo(message.Body.Value); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs index c714ba7ec6..f133abba0b 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Binary.Async; -public class WhenAddingADuplicateMessageItShouldNotThrowAsync : IAsyncLifetime +public class WhenAddingADuplicateMessageItShouldNotThrowAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenAddingADuplicateMessageItShouldNotThrowAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() { // Arrange @@ -47,6 +49,6 @@ public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs index 926a9e17ec..11751920c9 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Binary.Async; -public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync : IAsyncLifetime +public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async() { // Arrange @@ -49,37 +51,37 @@ public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_ var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs index feec34fdb6..cfd9aa19c2 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Binary.Async; -public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async() { // Arrange @@ -54,6 +56,6 @@ public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Shoul var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs index 325a8758dc..d9d2e109df 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Binary.Async; -public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async() { // Arrange @@ -54,37 +56,37 @@ public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_A var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs index 861950d594..925f94c6a6 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Binary.Async; -public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -58,8 +60,8 @@ public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Ou .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs index 6c4671facf..560a2b195c 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Binary.Async; -public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -47,17 +46,20 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -84,8 +86,8 @@ public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Asy .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs index 116d825126..16a514e210 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Binary.Async; -public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync : IAsyncLifetime +public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async() { // Arrange @@ -80,38 +82,38 @@ public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_M var message = await outbox.GetAsync(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs index 5c3ecbcf41..f6e2ccd996 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Binary.Async; -public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync : IAsyncLifetime +public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async() { // Arrange @@ -45,6 +47,6 @@ public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_ var message = await outbox.GetAsync(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs index 267047e628..5e0d6e33fc 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Binary.Async; -public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync : IAsyncLifetime +public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync( _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async() { // Arrange @@ -80,9 +82,9 @@ public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_An var messages = (await _outboxProvider.GetAllMessagesAsync()).ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs index 2a3b84c9d3..e4fcbc1eaa 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Binary.Async; -public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_As var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs index 5ade2a3aec..aedf0d54bb 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Binary.Async; -public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync : IAsyncLifetime +public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async() { // Arrange @@ -82,9 +84,9 @@ public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requeste .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs index 3d53ee616b..4effde1bc5 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Binary.Async; -public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_A var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs index 2cb120113d..7a4cdb9291 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenAddingADuplicateMessageItShouldNotThrow() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() + [Test] + public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw() { // Arrange var context = new RequestContext(); @@ -63,7 +62,7 @@ public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs index 39d14c1031..7eca63394b 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenAddingAMessageItShouldBeStoredWithAllProperties() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() + [Test] + public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() { // Arrange var context = new RequestContext(); @@ -64,38 +63,38 @@ public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs index fc4b37ce62..fddc340bf4 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,14 +47,14 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,12 +63,12 @@ public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_ // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Rollback(); + await transaction.RollbackAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs index de070dc805..c0fba610a8 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,14 +47,14 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,43 +63,43 @@ public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_C // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Commit(); + await transaction.CommitAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs index 245ea83fae..47a8cb4564 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,9 +73,9 @@ public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs index 7eaa0dd9a8..aea751fd0a 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,9 +73,9 @@ public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs index 7dda79b199..682eb4fc32 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() + [Test] + public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() { // Arrange var context = new RequestContext(); @@ -70,39 +69,39 @@ public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message var message = outbox.Get(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs index 0b47fe236c..6746c1e5dd 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() + [Test] + public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() { // Arrange var context = new RequestContext(); @@ -60,7 +59,7 @@ public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Messag var message = outbox.Get(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs index ffaeb15359..5539dc314e 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() + [Test] + public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() { // Arrange var context = new RequestContext(); @@ -70,10 +69,10 @@ public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undi var messages = _outboxProvider.GetAllMessages().ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs index d77003c5fe..a0238fb362 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,19 +71,19 @@ public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs index 74e21c0636..7a0a36c061 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() + [Test] + public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() { // Arrange var context = new RequestContext(); @@ -72,10 +71,10 @@ public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Mess .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs index bf89359014..c01e032d1f 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,19 +71,19 @@ public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs index 01e83cfa26..54bb3dc06c 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Text.Async; -public class WhenAddingADuplicateMessageItShouldNotThrowAsync : IAsyncLifetime +public class WhenAddingADuplicateMessageItShouldNotThrowAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenAddingADuplicateMessageItShouldNotThrowAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() { // Arrange @@ -47,6 +49,6 @@ public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs index 4deb84c584..724a540101 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Text.Async; -public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync : IAsyncLifetime +public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async() { // Arrange @@ -49,37 +51,37 @@ public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_ var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs index 44fd772406..44511f52ae 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Text.Async; -public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async() { // Arrange @@ -54,6 +56,6 @@ public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Shoul var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs index 3fad3b9ef9..21460834d6 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Text.Async; -public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async() { // Arrange @@ -54,37 +56,37 @@ public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_A var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs index 64c82a0cca..ef6c7f0158 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Text.Async; -public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -58,8 +60,8 @@ public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Ou .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs index 5b217107c9..ec3cecd2fb 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Text.Async; -public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -47,17 +46,20 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -84,8 +86,8 @@ public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Asy .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs index 75f134a9ab..4abb69c91a 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Text.Async; -public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync : IAsyncLifetime +public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async() { // Arrange @@ -80,38 +82,38 @@ public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_M var message = await outbox.GetAsync(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs index 0c9c0aa71f..e665eebe4a 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Text.Async; -public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync : IAsyncLifetime +public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async() { // Arrange @@ -45,6 +47,6 @@ public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_ var message = await outbox.GetAsync(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs index 5691fd135b..32add3b874 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Text.Async; -public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync : IAsyncLifetime +public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync( _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async() { // Arrange @@ -80,9 +82,9 @@ public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_An var messages = (await _outboxProvider.GetAllMessagesAsync()).ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs index 96e95c726f..9fd04af533 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Text.Async; -public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_As var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs index e4302faf90..3c9c5fa9f7 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Text.Async; -public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync : IAsyncLifetime +public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async() { // Arrange @@ -82,9 +84,9 @@ public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requeste .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs index e7f291d52a..7e9855b5e5 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.PostgresSQL.Tests.Outbox.Text.Async; -public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_A var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs index 97c0fb44d4..f4037d7095 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenAddingADuplicateMessageItShouldNotThrow() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() + [Test] + public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw() { // Arrange var context = new RequestContext(); @@ -63,7 +62,7 @@ public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs index ea8badad39..1f80e2a908 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenAddingAMessageItShouldBeStoredWithAllProperties() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() + [Test] + public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() { // Arrange var context = new RequestContext(); @@ -64,38 +63,38 @@ public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs index c4f5a11aee..699ef665c6 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,14 +47,14 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,12 +63,12 @@ public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_ // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Rollback(); + await transaction.RollbackAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs index ca3e2e724e..26f4edc25b 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,14 +47,14 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,43 +63,43 @@ public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_C // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Commit(); + await transaction.CommitAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs index 79a72a3966..0223134806 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,9 +73,9 @@ public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs index 3d22472cb6..6153e9ef59 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,9 +73,9 @@ public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs index 4c925187bc..1a8cd8743f 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() + [Test] + public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() { // Arrange var context = new RequestContext(); @@ -70,39 +69,39 @@ public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message var message = outbox.Get(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs index 412bc33727..0ada948218 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() + [Test] + public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() { // Arrange var context = new RequestContext(); @@ -60,7 +59,7 @@ public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Messag var message = outbox.Get(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs index 344145985e..98dfc4b411 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() + [Test] + public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() { // Arrange var context = new RequestContext(); @@ -70,10 +69,10 @@ public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undi var messages = _outboxProvider.GetAllMessages().ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs index 1e192aa76b..de8a2a0900 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,19 +71,19 @@ public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs index 8b4e63daf0..14e95f7de8 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() + [Test] + public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() { // Arrange var context = new RequestContext(); @@ -72,10 +71,10 @@ public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Mess .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs index 6eec333359..ccf33aee4b 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,19 +71,19 @@ public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.PostgresSQL.Tests/Paramore.Brighter.PostgresSQL.Tests.csproj b/tests/Paramore.Brighter.PostgresSQL.Tests/Paramore.Brighter.PostgresSQL.Tests.csproj index c5b276d04f..e33018ab6f 100644 --- a/tests/Paramore.Brighter.PostgresSQL.Tests/Paramore.Brighter.PostgresSQL.Tests.csproj +++ b/tests/Paramore.Brighter.PostgresSQL.Tests/Paramore.Brighter.PostgresSQL.Tests.csproj @@ -1,34 +1,19 @@ - - - $(BrighterTestTargetFrameworks) - false - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - + + $(BrighterTestTargetFrameworks) + false + Exe + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Paramore.Brighter.Quartz.Tests/Paramore.Brighter.Quartz.Tests.csproj b/tests/Paramore.Brighter.Quartz.Tests/Paramore.Brighter.Quartz.Tests.csproj index 8abdbf3223..63a2a1d725 100644 --- a/tests/Paramore.Brighter.Quartz.Tests/Paramore.Brighter.Quartz.Tests.csproj +++ b/tests/Paramore.Brighter.Quartz.Tests/Paramore.Brighter.Quartz.Tests.csproj @@ -1,40 +1,18 @@ - $(BrighterTestTargetFrameworks) enable - false true ParamoreBrighter.Quartz.Tests + Exe - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - + + + - - - - - - - - - - + \ No newline at end of file diff --git a/tests/Paramore.Brighter.Quartz.Tests/TestDoubles/BrighterResolver.cs b/tests/Paramore.Brighter.Quartz.Tests/TestDoubles/BrighterResolver.cs index f1b55fc216..a311708a5b 100644 --- a/tests/Paramore.Brighter.Quartz.Tests/TestDoubles/BrighterResolver.cs +++ b/tests/Paramore.Brighter.Quartz.Tests/TestDoubles/BrighterResolver.cs @@ -8,10 +8,13 @@ namespace ParamoreBrighter.Quartz.Tests.TestDoubles; public class BrighterResolver : PropertySettingJobFactory { - public static IAmACommandProcessor Processor { get; set; } + public const string ProcessorContextKey = "BrighterProcessor"; public override IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler) { - return new QuartzBrighterJob(Processor); + var processor = scheduler.Context[ProcessorContextKey] as IAmACommandProcessor + ?? throw new InvalidOperationException("Quartz scheduler context is missing the Brighter command processor."); + + return new QuartzBrighterJob(processor); } } diff --git a/tests/Paramore.Brighter.Quartz.Tests/When_scheduling_a_message.cs b/tests/Paramore.Brighter.Quartz.Tests/When_scheduling_a_message.cs index 3b40c6bfc9..5f43e8877a 100644 --- a/tests/Paramore.Brighter.Quartz.Tests/When_scheduling_a_message.cs +++ b/tests/Paramore.Brighter.Quartz.Tests/When_scheduling_a_message.cs @@ -1,4 +1,4 @@ -using System.Collections.Specialized; +using System.Collections.Specialized; using System.Text.Json; using System.Transactions; using Paramore.Brighter; @@ -14,31 +14,36 @@ namespace ParamoreBrighter.Quartz.Tests; -[Collection("Scheduler")] public class QuartzSchedulerMessageTests { - private readonly QuartzSchedulerFactory _scheduler; - private readonly IAmACommandProcessor _processor; + private QuartzSchedulerFactory _scheduler; + private IScheduler _quartzScheduler; + private IAmACommandProcessor _processor; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); private readonly RoutingKey _routingKey; private readonly TimeProvider _timeProvider; + private readonly ISchedulerFactory _schedulerFactory; + private readonly SubscriberRegistry _subscriberRegistry; + private readonly SimpleHandlerFactory _handlerFactory; + private readonly PolicyRegistry _policyRegistry; + private readonly OutboxProducerMediator _outboxBus; public QuartzSchedulerMessageTests() { _routingKey = new RoutingKey($"Test-{Guid.NewGuid():N}"); _timeProvider = TimeProvider.System; - var handlerFactory = new SimpleHandlerFactory( + _handlerFactory = new SimpleHandlerFactory( _ => new MyEventHandler(new Dictionary()), _ => new FireSchedulerMessageHandler(_processor!)); - var subscriberRegistry = new SubscriberRegistry(); - subscriberRegistry.Register(); - subscriberRegistry.RegisterAsync(); + _subscriberRegistry = new SubscriberRegistry(); + _subscriberRegistry.Register(); + _subscriberRegistry.RegisterAsync(); - var policyRegistry = new PolicyRegistry + _policyRegistry = new PolicyRegistry { [CommandProcessor.RETRYPOLICY] = Policy.Handle().Retry(), [CommandProcessor.CIRCUITBREAKER] = @@ -59,9 +64,9 @@ public QuartzSchedulerMessageTests() var trace = new BrighterTracer(_timeProvider); _outbox = new InMemoryOutbox(_timeProvider) { Tracer = trace }; - var outboxBus = new OutboxProducerMediator( + _outboxBus = new OutboxProducerMediator( producerRegistry, - new ResiliencePipelineRegistry().AddBrighterDefault(), + new ResiliencePipelineRegistry().AddBrighterDefault(), messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), @@ -70,31 +75,35 @@ public QuartzSchedulerMessageTests() _outbox ); - var schedulerFactory = SchedulerBuilder.Create(new NameValueCollection()) + _schedulerFactory = SchedulerBuilder.Create(new NameValueCollection()) .UseDefaultThreadPool(x => x.MaxConcurrency = 5) .UseJobFactory() .Build(); + } - var scheduler = schedulerFactory.GetScheduler().GetAwaiter().GetResult(); - scheduler.Start().GetAwaiter().GetResult(); + [Before(Test)] + public async Task Setup() + { + _quartzScheduler = await _schedulerFactory.GetScheduler(); + await _quartzScheduler.Start(); - _scheduler = new QuartzSchedulerFactory(scheduler); + _scheduler = new QuartzSchedulerFactory(_quartzScheduler); _processor = new CommandProcessor( - subscriberRegistry, - handlerFactory, + _subscriberRegistry, + _handlerFactory, new InMemoryRequestContextFactory(), - policyRegistry, + _policyRegistry, new ResiliencePipelineRegistry(), - outboxBus, + _outboxBus, _scheduler ); - BrighterResolver.Processor = _processor; + _quartzScheduler.Context.Put(BrighterResolver.ProcessorContextKey, _processor); } - [Fact] - public void When_scheduler_a_message_with_a_datetimeoffset() + [Test] + public async Task When_scheduler_a_message_with_a_datetimeoffset() { var req = new MyEvent(); var message = @@ -106,19 +115,19 @@ public void When_scheduler_a_message_with_a_datetimeoffset() var id = scheduler.Schedule(message, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Equivalent(message, _outbox.Get(message.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(message.Id, new RequestContext())).IsEquivalentTo(message); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); } - [Fact] - public void When_scheduler_a_message_with_a_timespan() + [Test] + public async Task When_scheduler_a_message_with_a_timespan() { var req = new MyEvent(); var message = @@ -129,19 +138,19 @@ public void When_scheduler_a_message_with_a_timespan() var scheduler = (IAmAMessageSchedulerSync)_scheduler.Create(_processor); var id = scheduler.Schedule(message, TimeSpan.FromSeconds(1)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); - Assert.Equivalent(message, _outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsEquivalentTo(message); } - [Fact] - public void When_reschedule_a_message_with_a_datetimeoffset() + [Test] + public async Task When_reschedule_a_message_with_a_datetimeoffset() { var req = new MyEvent(); var message = @@ -152,22 +161,22 @@ public void When_reschedule_a_message_with_a_datetimeoffset() var scheduler = (IAmAMessageSchedulerSync)_scheduler.Create(_processor); var id = scheduler.Schedule(message, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(id.Length).IsNotEqualTo(0); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); scheduler.ReScheduler(id, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(5))); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); Thread.Sleep(TimeSpan.FromSeconds(4)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); - Assert.Equivalent(message, _outbox.Get(req.Id, new RequestContext())); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsEquivalentTo(message); } - [Fact] - public void When_reschedule_a_message_with_a_timespan() + [Test] + public async Task When_reschedule_a_message_with_a_timespan() { var req = new MyEvent(); var message = @@ -178,22 +187,22 @@ public void When_reschedule_a_message_with_a_timespan() var scheduler = (IAmAMessageSchedulerSync)_scheduler.Create(_processor); var id = scheduler.Schedule(message, TimeSpan.FromHours(1)); - Assert.NotEqual(0, id.Length); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(id.Length).IsNotEqualTo(0); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); scheduler.ReScheduler(id, TimeSpan.FromSeconds(5)); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Empty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsEmpty(); Thread.Sleep(TimeSpan.FromSeconds(4)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); - Assert.NotEqual(Message.Empty, _outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); } - [Fact] - public void When_cancel_scheduler_message_with_a_datetimeoffset() + [Test] + public async Task When_cancel_scheduler_message_with_a_datetimeoffset() { var req = new MyEvent(); var message = @@ -204,32 +213,32 @@ public void When_cancel_scheduler_message_with_a_datetimeoffset() var scheduler = (IAmAMessageSchedulerSync)_scheduler.Create(_processor); var id = scheduler.Schedule(message, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); scheduler.Cancel(id); Thread.Sleep(TimeSpan.FromSeconds(2)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] - public void When_cancel_scheduler_request_with_a_timespan() + [Test] + public async Task When_cancel_scheduler_request_with_a_timespan() { var req = new MyEvent(); var message = @@ -240,26 +249,32 @@ public void When_cancel_scheduler_request_with_a_timespan() var scheduler = (IAmAMessageSchedulerSync)_scheduler.Create(_processor); var id = scheduler.Schedule(message, TimeSpan.FromSeconds(1)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); scheduler.Cancel(id); Thread.Sleep(TimeSpan.FromSeconds(2)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); + } + + [After(Test)] + public async Task Cleanup() + { + await _quartzScheduler.Shutdown(waitForJobsToComplete: true); } } diff --git a/tests/Paramore.Brighter.Quartz.Tests/When_scheduling_a_message_async.cs b/tests/Paramore.Brighter.Quartz.Tests/When_scheduling_a_message_async.cs index 10614537ff..9371126a0b 100644 --- a/tests/Paramore.Brighter.Quartz.Tests/When_scheduling_a_message_async.cs +++ b/tests/Paramore.Brighter.Quartz.Tests/When_scheduling_a_message_async.cs @@ -1,4 +1,4 @@ -using System.Collections.Specialized; +using System.Collections.Specialized; using System.Text.Json; using System.Transactions; using Paramore.Brighter; @@ -14,23 +14,28 @@ namespace ParamoreBrighter.Quartz.Tests; -[Collection("Scheduler")] public class QuartzSchedulerMessageAsyncTests { - private readonly QuartzSchedulerFactory _scheduler; - private readonly IAmACommandProcessor _processor; + private QuartzSchedulerFactory _scheduler; + private IScheduler _quartzScheduler; + private IAmACommandProcessor _processor; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); private readonly RoutingKey _routingKey; private readonly TimeProvider _timeProvider; + private readonly ISchedulerFactory _schedulerFactory; + private readonly SubscriberRegistry _subscriberRegistry; + private readonly SimpleHandlerFactoryAsync _handlerFactory; + private readonly PolicyRegistry _policyRegistry; + private readonly OutboxProducerMediator _outboxBus; public QuartzSchedulerMessageAsyncTests() { _routingKey = new RoutingKey($"Test-{Guid.NewGuid():N}"); _timeProvider = TimeProvider.System; - var handlerFactory = new SimpleHandlerFactoryAsync( + _handlerFactory = new SimpleHandlerFactoryAsync( type => { if (type == typeof(MyEventHandlerAsync)) @@ -41,11 +46,11 @@ public QuartzSchedulerMessageAsyncTests() return new FireSchedulerMessageHandler(_processor!); }); - var subscriberRegistry = new SubscriberRegistry(); - subscriberRegistry.RegisterAsync(); - subscriberRegistry.RegisterAsync(); + _subscriberRegistry = new SubscriberRegistry(); + _subscriberRegistry.RegisterAsync(); + _subscriberRegistry.RegisterAsync(); - var policyRegistry = new PolicyRegistry + _policyRegistry = new PolicyRegistry { [CommandProcessor.RETRYPOLICYASYNC] = Policy.Handle().RetryAsync(), [CommandProcessor.CIRCUITBREAKERASYNC] = @@ -66,9 +71,9 @@ public QuartzSchedulerMessageAsyncTests() var trace = new BrighterTracer(_timeProvider); _outbox = new InMemoryOutbox(_timeProvider) { Tracer = trace }; - var outboxBus = new OutboxProducerMediator( + _outboxBus = new OutboxProducerMediator( producerRegistry, - new ResiliencePipelineRegistry().AddBrighterDefault(), + new ResiliencePipelineRegistry().AddBrighterDefault(), messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), @@ -77,30 +82,34 @@ public QuartzSchedulerMessageAsyncTests() _outbox ); - var schedulerFactory = SchedulerBuilder.Create(new NameValueCollection()) + _schedulerFactory = SchedulerBuilder.Create(new NameValueCollection()) .UseDefaultThreadPool(x => x.MaxConcurrency = 5) .UseJobFactory() .Build(); + } - var scheduler = schedulerFactory.GetScheduler().GetAwaiter().GetResult(); - scheduler.Start().GetAwaiter().GetResult(); + [Before(Test)] + public async Task Setup() + { + _quartzScheduler = await _schedulerFactory.GetScheduler(); + await _quartzScheduler.Start(); - _scheduler = new QuartzSchedulerFactory(scheduler); + _scheduler = new QuartzSchedulerFactory(_quartzScheduler); _processor = new CommandProcessor( - subscriberRegistry, - handlerFactory, + _subscriberRegistry, + _handlerFactory, new InMemoryRequestContextFactory(), - policyRegistry, + _policyRegistry, new ResiliencePipelineRegistry(), - outboxBus, + _outboxBus, _scheduler ); - BrighterResolver.Processor = _processor; + _quartzScheduler.Context.Put(BrighterResolver.ProcessorContextKey, _processor); } - [Fact] + [Test] public async Task When_scheduler_a_message_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -113,18 +122,18 @@ public async Task When_scheduler_a_message_with_a_datetimeoffset_async() var id = await scheduler.ScheduleAsync(message, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.Empty(_internalBus.Stream(_routingKey) ?? []); + await Assert.That(_internalBus.Stream(_routingKey) ?? []).IsEmpty(); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Equivalent(message, await _outbox.GetAsync(message.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(message.Id, new RequestContext())).IsEquivalentTo(message); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); } - [Fact] + [Test] public async Task When_scheduler_a_message_with_a_timespan_async() { var req = new MyEvent(); @@ -136,18 +145,18 @@ public async Task When_scheduler_a_message_with_a_timespan_async() var scheduler = (IAmAMessageSchedulerAsync)_scheduler.Create(_processor); var id = await scheduler.ScheduleAsync(message, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.Empty(_internalBus.Stream(_routingKey) ?? []); + await Assert.That(_internalBus.Stream(_routingKey) ?? []).IsEmpty(); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); - Assert.Equivalent(message, await _outbox.GetAsync(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsEquivalentTo(message); } - [Fact] + [Test] public async Task When_reschedule_a_message_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -159,21 +168,21 @@ public async Task When_reschedule_a_message_with_a_datetimeoffset_async() var scheduler = (IAmAMessageSchedulerAsync)_scheduler.Create(_processor); var id = await scheduler.ScheduleAsync(message, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); - Assert.Empty(_internalBus.Stream(_routingKey) ?? []); + await Assert.That((id)?.Any()).IsTrue(); + await Assert.That(_internalBus.Stream(_routingKey) ?? []).IsEmpty(); await scheduler.ReSchedulerAsync(id, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(5))); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Empty(_internalBus.Stream(_routingKey) ?? []); + await Assert.That(_internalBus.Stream(_routingKey) ?? []).IsEmpty(); await Task.Delay(TimeSpan.FromSeconds(4)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); - Assert.Equivalent(message, await _outbox.GetAsync(req.Id, new RequestContext())); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsEquivalentTo(message); } - [Fact] + [Test] public async Task When_reschedule_a_message_with_a_timespan_async() { var req = new MyEvent(); @@ -185,21 +194,21 @@ public async Task When_reschedule_a_message_with_a_timespan_async() var scheduler = (IAmAMessageSchedulerAsync)_scheduler.Create(_processor); var id = await scheduler.ScheduleAsync(message, TimeSpan.FromHours(1)); - Assert.True((id)?.Any()); - Assert.Empty(_internalBus.Stream(_routingKey) ?? []); + await Assert.That((id)?.Any()).IsTrue(); + await Assert.That(_internalBus.Stream(_routingKey) ?? []).IsEmpty(); await scheduler.ReSchedulerAsync(id, TimeSpan.FromSeconds(5)); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Empty(_internalBus.Stream(_routingKey) ?? []); + await Assert.That(_internalBus.Stream(_routingKey) ?? []).IsEmpty(); await Task.Delay(TimeSpan.FromSeconds(4)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); - Assert.NotEqual(Message.Empty, await _outbox.GetAsync(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); } - [Fact] + [Test] public async Task When_cancel_scheduler_message_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -211,7 +220,7 @@ public async Task When_cancel_scheduler_message_with_a_datetimeoffset_async() var scheduler = (IAmAMessageSchedulerAsync)_scheduler.Create(_processor); var id = await scheduler.ScheduleAsync(message, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); await scheduler.CancelAsync(id); @@ -220,22 +229,22 @@ public async Task When_cancel_scheduler_message_with_a_datetimeoffset_async() var expected = Message.Empty; var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_cancel_scheduler_request_with_a_timespan_async() { var req = new MyEvent(); @@ -247,7 +256,7 @@ public async Task When_cancel_scheduler_request_with_a_timespan_async() var scheduler = (IAmAMessageSchedulerAsync)_scheduler.Create(_processor); var id = await scheduler.ScheduleAsync(message, TimeSpan.FromHours(1)); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); await scheduler.CancelAsync(id); @@ -256,17 +265,23 @@ public async Task When_cancel_scheduler_request_with_a_timespan_async() var expected = Message.Empty; var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); + } + + [After(Test)] + public async Task Cleanup() + { + await _quartzScheduler.Shutdown(waitForJobsToComplete: true); } } diff --git a/tests/Paramore.Brighter.Quartz.Tests/When_scheduling_a_request.cs b/tests/Paramore.Brighter.Quartz.Tests/When_scheduling_a_request.cs index 3d0682ece6..718521af4f 100644 --- a/tests/Paramore.Brighter.Quartz.Tests/When_scheduling_a_request.cs +++ b/tests/Paramore.Brighter.Quartz.Tests/When_scheduling_a_request.cs @@ -1,4 +1,4 @@ -using System.Collections.Specialized; +using System.Collections.Specialized; using System.Transactions; using Paramore.Brighter; using Paramore.Brighter.Extensions; @@ -13,17 +13,22 @@ namespace ParamoreBrighter.Quartz.Tests; -[Collection("Scheduler")] public class QuartzSchedulerRequestTests { - private readonly QuartzSchedulerFactory _scheduler; - private readonly IAmACommandProcessor _processor; + private QuartzSchedulerFactory _scheduler; + private IScheduler _quartzScheduler; + private IAmACommandProcessor _processor; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); private readonly Dictionary _receivedMessages; private readonly RoutingKey _routingKey; private readonly TimeProvider _timeProvider; + private readonly ISchedulerFactory _schedulerFactory; + private readonly SubscriberRegistry _subscriberRegistry; + private readonly SimpleHandlerFactory _handlerFactory; + private readonly PolicyRegistry _policyRegistry; + private readonly OutboxProducerMediator _outboxBus; public QuartzSchedulerRequestTests() { @@ -31,15 +36,15 @@ public QuartzSchedulerRequestTests() _routingKey = new RoutingKey($"Test-{Guid.NewGuid():N}"); _timeProvider = TimeProvider.System; - var handlerFactory = new SimpleHandlerFactory( + _handlerFactory = new SimpleHandlerFactory( _ => new MyEventHandler(_receivedMessages), _ => new FireSchedulerRequestHandler(_processor!)); - var subscriberRegistry = new SubscriberRegistry(); - subscriberRegistry.Register(); - subscriberRegistry.RegisterAsync(); + _subscriberRegistry = new SubscriberRegistry(); + _subscriberRegistry.Register(); + _subscriberRegistry.RegisterAsync(); - var policyRegistry = new PolicyRegistry + _policyRegistry = new PolicyRegistry { [CommandProcessor.RETRYPOLICY] = Policy.Handle().Retry(), [CommandProcessor.CIRCUITBREAKER] = @@ -60,9 +65,9 @@ public QuartzSchedulerRequestTests() var trace = new BrighterTracer(_timeProvider); _outbox = new InMemoryOutbox(_timeProvider) { Tracer = trace }; - var outboxBus = new OutboxProducerMediator( + _outboxBus = new OutboxProducerMediator( producerRegistry, - new ResiliencePipelineRegistry().AddBrighterDefault(), + new ResiliencePipelineRegistry().AddBrighterDefault(), messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), @@ -71,353 +76,363 @@ public QuartzSchedulerRequestTests() _outbox ); - var schedulerFactory = SchedulerBuilder.Create(new NameValueCollection()) + _schedulerFactory = SchedulerBuilder.Create(new NameValueCollection()) .UseDefaultThreadPool(x => x.MaxConcurrency = 5) .UseJobFactory() .Build(); + } - var scheduler = schedulerFactory.GetScheduler().GetAwaiter().GetResult(); - scheduler.Start().GetAwaiter().GetResult(); + [Before(Test)] + public async Task Setup() + { + _quartzScheduler = await _schedulerFactory.GetScheduler(); + await _quartzScheduler.Start(); - _scheduler = new QuartzSchedulerFactory(scheduler); + _scheduler = new QuartzSchedulerFactory(_quartzScheduler); _processor = new CommandProcessor( - subscriberRegistry, - handlerFactory, + _subscriberRegistry, + _handlerFactory, new InMemoryRequestContextFactory(), - policyRegistry, + _policyRegistry, new ResiliencePipelineRegistry(), - outboxBus, + _outboxBus, _scheduler ); - BrighterResolver.Processor = _processor; + _quartzScheduler.Context.Put(BrighterResolver.ProcessorContextKey, _processor); } #region Scheduler - [Fact] - public void When_scheduler_send_request_with_a_datetimeoffset() + [Test] + public async Task When_scheduler_send_request_with_a_datetimeoffset() { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, RequestSchedulerType.Send, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] - public void When_scheduler_send_request_with_a_timespan() + [Test] + public async Task When_scheduler_send_request_with_a_timespan() { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, RequestSchedulerType.Send, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] - public void When_scheduler_publish_request_with_a_datetimeoffset() + [Test] + public async Task When_scheduler_publish_request_with_a_datetimeoffset() { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, RequestSchedulerType.Publish, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] - public void When_scheduler_publish_request_with_a_timespan() + [Test] + public async Task When_scheduler_publish_request_with_a_timespan() { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, RequestSchedulerType.Publish, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] - public void When_scheduler_post_request_with_a_datetimeoffset() + [Test] + public async Task When_scheduler_post_request_with_a_datetimeoffset() { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, RequestSchedulerType.Post, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.Empty(_internalBus.Stream(_routingKey) ?? []); + await Assert.That(_internalBus.Stream(_routingKey) ?? []).IsEmpty(); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.NotEqual(Message.Empty, _outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); } - [Fact] - public void When_scheduler_post_request_with_a_timespan() + [Test] + public async Task When_scheduler_post_request_with_a_timespan() { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, RequestSchedulerType.Post, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.Empty(_internalBus.Stream(_routingKey) ?? []); + await Assert.That(_internalBus.Stream(_routingKey) ?? []).IsEmpty(); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); - Assert.NotEqual(Message.Empty, _outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); } #endregion #region Rescheduler - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Publish)] - public void When_reschedule_request_with_a_datetimeoffset(RequestSchedulerType type) + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Publish)] + public async Task When_reschedule_request_with_a_datetimeoffset(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, type, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); scheduler.ReScheduler(id, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(5))); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(4)); - Assert.Contains(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Publish)] - public void When_reschedule_send_request_with_a_timespan(RequestSchedulerType type) + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Publish)] + public async Task When_reschedule_send_request_with_a_timespan(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, type, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That((id)?.Any()).IsTrue(); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); scheduler.ReScheduler(id, TimeSpan.FromSeconds(5)); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(4)); - Assert.Contains(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } #endregion #region Cancel - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] - public void When_cancel_scheduler_request_with_a_datetimeoffset(RequestSchedulerType type) + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] + public async Task When_cancel_scheduler_request_with_a_datetimeoffset(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, type, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); scheduler.Cancel(id); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] - public void When_cancel_scheduler_request_with_a_timespan(RequestSchedulerType type) + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] + public async Task When_cancel_scheduler_request_with_a_timespan(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateSync(_processor); var id = scheduler.Schedule(req, type, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That((id)?.Any()).IsTrue(); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); scheduler.Cancel(id); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandler), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } #endregion + + [After(Test)] + public async Task Cleanup() + { + await _quartzScheduler.Shutdown(waitForJobsToComplete: true); + } } diff --git a/tests/Paramore.Brighter.Quartz.Tests/When_scheduling_a_request_async.cs b/tests/Paramore.Brighter.Quartz.Tests/When_scheduling_a_request_async.cs index ec2b0737b7..3c9fae4ecf 100644 --- a/tests/Paramore.Brighter.Quartz.Tests/When_scheduling_a_request_async.cs +++ b/tests/Paramore.Brighter.Quartz.Tests/When_scheduling_a_request_async.cs @@ -1,4 +1,4 @@ -using System.Collections.Specialized; +using System.Collections.Specialized; using System.Transactions; using Paramore.Brighter; using Paramore.Brighter.Extensions; @@ -14,17 +14,22 @@ namespace ParamoreBrighter.Quartz.Tests; -[Collection("Scheduler")] public class QuartzSchedulerRequestAsyncTests { - private readonly QuartzSchedulerFactory _scheduler; - private readonly IAmACommandProcessor _processor; + private QuartzSchedulerFactory _scheduler; + private IScheduler _quartzScheduler; + private IAmACommandProcessor _processor; private readonly InMemoryOutbox _outbox; private readonly InternalBus _internalBus = new(); private readonly Dictionary _receivedMessages; private readonly RoutingKey _routingKey; private readonly TimeProvider _timeProvider; + private readonly ISchedulerFactory _schedulerFactory; + private readonly SubscriberRegistry _subscriberRegistry; + private readonly SimpleHandlerFactoryAsync _handlerFactory; + private readonly PolicyRegistry _policyRegistry; + private readonly OutboxProducerMediator _outboxBus; public QuartzSchedulerRequestAsyncTests() { @@ -32,8 +37,7 @@ public QuartzSchedulerRequestAsyncTests() _routingKey = new RoutingKey($"Test-{Guid.NewGuid():N}"); _timeProvider = TimeProvider.System; - - var handlerFactory = new SimpleHandlerFactoryAsync( + _handlerFactory = new SimpleHandlerFactoryAsync( type => { if (type == typeof(MyEventHandlerAsync)) @@ -44,11 +48,11 @@ public QuartzSchedulerRequestAsyncTests() return new FireSchedulerRequestHandler(_processor!); }); - var subscriberRegistry = new SubscriberRegistry(); - subscriberRegistry.RegisterAsync(); - subscriberRegistry.RegisterAsync(); + _subscriberRegistry = new SubscriberRegistry(); + _subscriberRegistry.RegisterAsync(); + _subscriberRegistry.RegisterAsync(); - var policyRegistry = new PolicyRegistry + _policyRegistry = new PolicyRegistry { [CommandProcessor.RETRYPOLICYASYNC] = Policy.Handle().RetryAsync(), [CommandProcessor.CIRCUITBREAKERASYNC] = @@ -69,9 +73,9 @@ public QuartzSchedulerRequestAsyncTests() var trace = new BrighterTracer(_timeProvider); _outbox = new InMemoryOutbox(_timeProvider) { Tracer = trace }; - var outboxBus = new OutboxProducerMediator( + _outboxBus = new OutboxProducerMediator( producerRegistry, - new ResiliencePipelineRegistry().AddBrighterDefault(), + new ResiliencePipelineRegistry().AddBrighterDefault(), messageMapperRegistry, new EmptyMessageTransformerFactory(), new EmptyMessageTransformerFactoryAsync(), @@ -80,32 +84,36 @@ public QuartzSchedulerRequestAsyncTests() _outbox ); - var schedulerFactory = SchedulerBuilder.Create(new NameValueCollection()) + _schedulerFactory = SchedulerBuilder.Create(new NameValueCollection()) .UseDefaultThreadPool(x => x.MaxConcurrency = 5) .UseJobFactory() .Build(); + } - var scheduler = schedulerFactory.GetScheduler().GetAwaiter().GetResult(); - scheduler.Start().GetAwaiter().GetResult(); + [Before(Test)] + public async Task Setup() + { + _quartzScheduler = await _schedulerFactory.GetScheduler(); + await _quartzScheduler.Start(); - _scheduler = new QuartzSchedulerFactory(scheduler); + _scheduler = new QuartzSchedulerFactory(_quartzScheduler); _processor = new CommandProcessor( - subscriberRegistry, - handlerFactory, + _subscriberRegistry, + _handlerFactory, new InMemoryRequestContextFactory(), - policyRegistry, + _policyRegistry, new ResiliencePipelineRegistry(), - outboxBus, + _outboxBus, _scheduler ); - BrighterResolver.Processor = _processor; + _quartzScheduler.Context.Put(BrighterResolver.ProcessorContextKey, _processor); } #region Scheduler - [Fact] + [Test] public async Task When_scheduler_send_request_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -113,64 +121,64 @@ public async Task When_scheduler_send_request_with_a_datetimeoffset_async() var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Send, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_scheduler_send_request_with_a_timespan_asc() { var req = new MyEvent(); var scheduler = _scheduler.CreateAsync(_processor); var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Send, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_scheduler_publish_request_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -178,64 +186,64 @@ public async Task When_scheduler_publish_request_with_a_datetimeoffset_async() var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Publish, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_scheduler_publish_request_with_a_timespan() { var req = new MyEvent(); var scheduler = _scheduler.CreateAsync(_processor); var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Publish, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_scheduler_post_request_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -243,122 +251,122 @@ public async Task When_scheduler_post_request_with_a_datetimeoffset_async() var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Post, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.Empty(_internalBus.Stream(_routingKey) ?? []); + await Assert.That(_internalBus.Stream(_routingKey) ?? []).IsEmpty(); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.NotEqual(Message.Empty, _outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); } - [Fact] + [Test] public async Task When_scheduler_post_request_with_a_timespan_async() { var req = new MyEvent(); var scheduler = _scheduler.CreateAsync(_processor); var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Post, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.Empty(_internalBus.Stream(_routingKey) ?? []); + await Assert.That(_internalBus.Stream(_routingKey) ?? []).IsEmpty(); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(_internalBus.Stream(_routingKey)); + await Assert.That(_internalBus.Stream(_routingKey)).IsNotEmpty(); - Assert.NotEqual(Message.Empty, _outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); } #endregion #region Rescheduler - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_reschedule_request_with_a_datetimeoffset_async(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateAsync(_processor); var id = await scheduler.ScheduleAsync(req, type, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); await scheduler.ReSchedulerAsync(id, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(5))); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(4)); - Assert.Contains(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_reschedule_send_request_with_a_timespan_async(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateAsync(_processor); var id = await scheduler.ScheduleAsync(req, type, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That((id)?.Any()).IsTrue(); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await scheduler.ReSchedulerAsync(id, TimeSpan.FromSeconds(5)); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(4)); - Assert.Contains(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; - var actual = _outbox.Get(req.Id, new RequestContext()); + var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } #endregion #region Cancel - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_cancel_scheduler_request_with_a_datetimeoffset(RequestSchedulerType type) { var req = new MyEvent(); @@ -366,66 +374,72 @@ public async Task When_cancel_scheduler_request_with_a_datetimeoffset(RequestSch var id = await scheduler.ScheduleAsync(req, type, _timeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await scheduler.CancelAsync(id); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_cancel_scheduler_request_with_a_timespan_async(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _scheduler.CreateAsync(_processor); var id = await scheduler.ScheduleAsync(req, type, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That((id)?.Any()).IsTrue(); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await scheduler.CancelAsync(id); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _receivedMessages); + await Assert.That(_receivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; var actual = await _outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } #endregion + + [After(Test)] + public async Task Cleanup() + { + await _quartzScheduler.Shutdown(waitForJobsToComplete: true); + } } diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessageDispatch/When_building_a_dispatcher.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessageDispatch/When_building_a_dispatcher.cs index 704d98dfe3..230db8ecb1 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessageDispatch/When_building_a_dispatcher.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessageDispatch/When_building_a_dispatcher.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -9,7 +9,6 @@ using Paramore.Brighter.ServiceActivator; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessageDispatch; @@ -70,15 +69,15 @@ public DispatchBuilderTests() .ConfigureInstrumentation(tracer, instrumentationOptions); } - [Fact] + [Test] public async Task When_Building_A_Dispatcher() { _dispatcher = _builder.Build(); - Assert.NotNull(_dispatcher); - Assert.NotNull(GetConnection("foo")); - Assert.NotNull(GetConnection("bar")); - Assert.Equal(DispatcherState.DS_AWAITING, _dispatcher.State); + await Assert.That(_dispatcher).IsNotNull(); + await Assert.That(GetConnection("foo")).IsNotNull(); + await Assert.That(GetConnection("bar")).IsNotNull(); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_AWAITING); await Task.Delay(1000); @@ -86,11 +85,11 @@ public async Task When_Building_A_Dispatcher() await Task.Delay(1000); - Assert.Equal(DispatcherState.DS_RUNNING, _dispatcher.State); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_RUNNING); await _dispatcher.End(); - Assert.Equal(DispatcherState.DS_STOPPED, _dispatcher.State); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_STOPPED); } private Subscription GetConnection(string name) { diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessageDispatch/When_building_a_dispatcher_async.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessageDispatch/When_building_a_dispatcher_async.cs index ca7b9edb62..48ee7ef362 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessageDispatch/When_building_a_dispatcher_async.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessageDispatch/When_building_a_dispatcher_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -9,7 +9,6 @@ using Paramore.Brighter.ServiceActivator; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessageDispatch; @@ -79,16 +78,16 @@ public DispatchBuilderTestsAsync() .ConfigureInstrumentation(tracer, instrumentationOptions); } - [Fact(Skip = "Breaks due to fault in Task Scheduler running after context has closed")] - //[Fact] + [Test, Skip("Breaks due to fault in Task Scheduler running after context has closed")] + //[Test] public async Task When_Building_A_Dispatcher_With_Async() { _dispatcher = _builder.Build(); - Assert.NotNull(_dispatcher); - Assert.NotNull(GetConnection("foo")); - Assert.NotNull(GetConnection("bar")); - Assert.Equal(DispatcherState.DS_AWAITING, _dispatcher.State); + await Assert.That(_dispatcher).IsNotNull(); + await Assert.That(GetConnection("foo")).IsNotNull(); + await Assert.That(GetConnection("bar")).IsNotNull(); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_AWAITING); await Task.Delay(1000); @@ -96,7 +95,7 @@ public async Task When_Building_A_Dispatcher_With_Async() await Task.Delay(1000); - Assert.Equal(DispatcherState.DS_RUNNING, _dispatcher.State); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_RUNNING); await _dispatcher.End(); } diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessageDispatch/When_building_a_dispatcher_with_named_gateway.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessageDispatch/When_building_a_dispatcher_with_named_gateway.cs index 94b65b674e..73ddab4ed6 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessageDispatch/When_building_a_dispatcher_with_named_gateway.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessageDispatch/When_building_a_dispatcher_with_named_gateway.cs @@ -1,4 +1,4 @@ -using System; +using System; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.MessagingGateway.RMQ.Async; @@ -7,7 +7,6 @@ using Paramore.Brighter.ServiceActivator; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessageDispatch; @@ -82,11 +81,11 @@ public DispatchBuilderWithNamedGateway() .ConfigureInstrumentation(tracer, instrumentationOptions); } - [Fact] - public void When_building_a_dispatcher_with_named_gateway() + [Test] + public async Task When_building_a_dispatcher_with_named_gateway() { _dispatcher = _builder.Build(); - Assert.NotNull(_dispatcher); + await Assert.That(_dispatcher).IsNotNull(); } } diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessageDispatch/When_building_a_dispatcher_with_named_gateway_async.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessageDispatch/When_building_a_dispatcher_with_named_gateway_async.cs index 6464804e57..434b024372 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessageDispatch/When_building_a_dispatcher_with_named_gateway_async.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessageDispatch/When_building_a_dispatcher_with_named_gateway_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.MessagingGateway.RMQ.Async; @@ -7,7 +7,6 @@ using Paramore.Brighter.ServiceActivator; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessageDispatch; @@ -83,11 +82,11 @@ public DispatchBuilderWithNamedGatewayAsync() .ConfigureInstrumentation(tracer, instrumentationOptions); } - [Fact] - public void When_building_a_dispatcher_with_named_gateway() + [Test] + public async Task When_building_a_dispatcher_with_named_gateway() { _dispatcher = _builder.Build(); - Assert.NotNull(_dispatcher); + await Assert.That(_dispatcher).IsNotNull(); } } diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Acceptance/When_publishing_and_receiving_with_mtls.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Acceptance/When_publishing_and_receiving_with_mtls.cs index c25e0df635..df368fa2e6 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Acceptance/When_publishing_and_receiving_with_mtls.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Acceptance/When_publishing_and_receiving_with_mtls.cs @@ -3,15 +3,14 @@ using System.Linq; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Acceptance; // Acceptance tests verify actual mTLS connections to Docker RabbitMQ // These tests run against the actual transport configured in Docker (per ADR #3946) -[Trait("Category", "RabbitMQ")] -[Trait("Category", "MutualTLS")] -[Trait("Requires", "Docker-mTLS")] +[Category("RabbitMQ")] +[Category("MutualTLS")] +[Property("Requires", "Docker-mTLS")] public class RmqMutualTlsAcceptanceTests : IDisposable { private readonly string _clientCertPath; @@ -35,7 +34,7 @@ public void Dispose() // Cleanup if needed } - [Fact] + [Test] public async Task When_connecting_with_client_certificate_can_publish_message_async() { // Verify certificate exists @@ -68,13 +67,13 @@ public async Task When_connecting_with_client_certificate_can_publish_message_as await producer.SendAsync(message); // If we reach here, TLS handshake succeeded - Assert.True(true); + await Assert.That(true).IsTrue(); // Cleanup await producer.DisposeAsync(); } - [Fact] + [Test] public async Task When_connecting_with_mtls_can_publish_and_receive_message_async() { // Verify certificate exists @@ -100,7 +99,7 @@ public async Task When_connecting_with_mtls_can_publish_and_receive_message_asyn // Act - Create consumer first to ensure queue exists and is bound var consumer = new RmqMessageConsumer(connection, queueName, routingKey, false); - consumer.Purge(); // Ensure queue is created and bound before publishing + await consumer.PurgeAsync(); // Ensure queue is created and bound before publishing // Act - Publish var producer = new RmqMessageProducer(connection); @@ -114,10 +113,10 @@ public async Task When_connecting_with_mtls_can_publish_and_receive_message_asyn var receivedMessages = await consumer.ReceiveAsync(TimeSpan.FromSeconds(5)); // Assert - Assert.NotEmpty(receivedMessages); + await Assert.That(receivedMessages).IsNotEmpty(); var receivedMessage = receivedMessages.First(); - Assert.Equal(sentMessage.Id, receivedMessage.Id); - Assert.Equal(sentMessage.Body.Value, receivedMessage.Body.Value); + await Assert.That(receivedMessage.Id).IsEqualTo(sentMessage.Id); + await Assert.That(receivedMessage.Body.Value).IsEqualTo(sentMessage.Body.Value); // Cleanup await producer.DisposeAsync(); diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Acceptance/When_publishing_with_trace_context_over_mtls.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Acceptance/When_publishing_with_trace_context_over_mtls.cs index 1606dfdea1..bef11b5332 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Acceptance/When_publishing_with_trace_context_over_mtls.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Acceptance/When_publishing_with_trace_context_over_mtls.cs @@ -11,7 +11,6 @@ using OpenTelemetry.Trace; using Paramore.Brighter.MessagingGateway.RMQ.Async; using Paramore.Brighter.Observability; -using Xunit; using Baggage = OpenTelemetry.Baggage; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Acceptance; @@ -24,10 +23,10 @@ namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Acceptance; /// These tests also verify Rule #1 (cross-gateway uniformity) by ensuring async behavior /// matches the sync variant's observability characteristics. /// -[Trait("Category", "RMQ")] -[Trait("Category", "MutualTLS")] -[Trait("Category", "Observability")] -[Trait("Requires", "Docker-mTLS")] +[Category("RMQ")] +[Category("MutualTLS")] +[Category("Observability")] +[Property("Requires", "Docker-mTLS")] public class RmqMutualTlsObservabilityAsyncTests : IDisposable { private readonly string _clientCertPath; @@ -82,7 +81,7 @@ public void Dispose() /// This test verifies Rule #10 compliance: W3C Trace Context must flow through all gateways. /// Also verifies Rule #1 (cross-gateway uniformity): async works identically to sync. /// - [Fact] + [Test] public async Task When_publishing_with_traceparent_over_mtls_header_is_preserved_async() { // Verify certificate exists @@ -125,11 +124,11 @@ public async Task When_publishing_with_traceparent_over_mtls_header_is_preserved _tracerProvider.ForceFlush(); // Assert - TraceParent must be preserved - Assert.NotNull(message.Header.TraceParent); - Assert.NotEmpty(message.Header.TraceParent.Value); + await Assert.That(message.Header.TraceParent).IsNotNull(); + await Assert.That(message.Header.TraceParent.Value).IsNotEmpty(); // Verify traceparent format (00-{trace-id}-{span-id}-{flags}) - Assert.Matches(@"^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$", message.Header.TraceParent.Value); + await Assert.That(message.Header.TraceParent.Value).Matches(@"^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$"); } finally { @@ -142,7 +141,7 @@ public async Task When_publishing_with_traceparent_over_mtls_header_is_preserved /// This test verifies Rule #10 compliance: W3C Trace Context (TraceState, Baggage) must flow through all gateways. /// Also verifies Rule #1 (cross-gateway uniformity): async works identically to sync. /// - [Fact] + [Test] public async Task When_publishing_with_tracestate_and_baggage_over_mtls_headers_are_preserved_async() { // Verify certificate exists @@ -185,21 +184,20 @@ public async Task When_publishing_with_tracestate_and_baggage_over_mtls_headers_ _tracerProvider.ForceFlush(); // Assert - All W3C trace headers must be preserved - Assert.NotNull(message.Header.TraceParent); - Assert.NotNull(message.Header.TraceState); - Assert.NotNull(message.Header.Baggage); + await Assert.That(message.Header.TraceParent).IsNotNull(); + await Assert.That(message.Header.TraceState).IsNotNull(); + await Assert.That(message.Header.Baggage).IsNotNull(); // Verify TraceState contains expected values - Assert.Contains("brighter=00f067aa0ba902b7", message.Header.TraceState); - Assert.Contains("congo=t61rcWkgMzE", message.Header.TraceState); + await Assert.That(message.Header.TraceState).Contains("brighter=00f067aa0ba902b7"); + await Assert.That(message.Header.TraceState).Contains("congo=t61rcWkgMzE"); // Verify Baggage contains expected values (baggage values may be URL-encoded) var baggageString = message.Header.Baggage.ToString(); - Assert.Contains("userId=alice", baggageString); + await Assert.That(baggageString).Contains("userId=alice"); // Note: Colon in serverNode value is URL-encoded as %3A - Assert.True(baggageString.Contains("serverNode=DF:28") || baggageString.Contains("serverNode=DF%3A28"), - "Baggage should contain serverNode with value DF:28 (possibly URL-encoded)"); - Assert.Contains("isProduction=false", baggageString); + await Assert.That(baggageString.Contains("serverNode=DF:28") || baggageString.Contains("serverNode=DF%3A28")).IsTrue(); + await Assert.That(baggageString).Contains("isProduction=false"); } finally { @@ -212,7 +210,7 @@ public async Task When_publishing_with_tracestate_and_baggage_over_mtls_headers_ /// This test verifies Rule #11 compliance: BrighterTracer.WriteProducerEvent must be called for all gateway producers. /// Also verifies Rule #1 (cross-gateway uniformity): async works identically to sync. /// - [Fact] + [Test] public async Task When_publishing_with_mtls_brighter_tracer_write_producer_event_is_called_async() { // Verify certificate exists @@ -264,10 +262,9 @@ public async Task When_publishing_with_mtls_brighter_tracer_write_producer_event // If producer event exists, BrighterTracer.WriteProducerEvent was called // Note: This verification depends on the tracer being properly configured // In production scenarios, this ensures observability is maintained with mTLS - Assert.True( - producerEvents.Any() || _exportedActivities.Any(), - "BrighterTracer should record producer events when publishing over mTLS (async)" - ); + await Assert.That( + producerEvents.Any() || _exportedActivities.Any() + ).IsTrue(); } finally { @@ -280,7 +277,7 @@ public async Task When_publishing_with_mtls_brighter_tracer_write_producer_event /// This test verifies Rule #12 compliance: CloudEvents trace context must survive serialization. /// Also verifies Rule #1 (cross-gateway uniformity): async works identically to sync. /// - [Fact] + [Test] public async Task When_publishing_cloudevents_trace_context_survives_mtls_serialization_async() { // Verify certificate exists @@ -325,21 +322,20 @@ public async Task When_publishing_cloudevents_trace_context_survives_mtls_serial // Assert - CloudEvents trace context must survive serialization // The message should contain trace headers that were propagated from the parent activity - Assert.NotNull(message.Header.TraceParent); - Assert.NotNull(message.Header.TraceState); - Assert.NotNull(message.Header.Baggage); + await Assert.That(message.Header.TraceParent).IsNotNull(); + await Assert.That(message.Header.TraceState).IsNotNull(); + await Assert.That(message.Header.Baggage).IsNotNull(); // Verify the trace context is in a format compatible with CloudEvents // CloudEvents uses W3C Trace Context, so the format should be consistent - Assert.Matches(@"^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$", message.Header.TraceParent.Value); + await Assert.That(message.Header.TraceParent.Value).Matches(@"^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$"); // Verify the message headers contain the trace information // This ensures that message creators can extract trace from CloudEvents // and message publishers can write trace to CloudEvents format - Assert.True( - message.Header.Bag.ContainsKey("traceparent") || message.Header.TraceParent != null, - "CloudEvents trace context (traceparent) must survive serialization over mTLS (async)" - ); + await Assert.That( + message.Header.Bag.ContainsKey("traceparent") || message.Header.TraceParent != null + ).IsTrue(); } finally { @@ -352,7 +348,7 @@ public async Task When_publishing_cloudevents_trace_context_survives_mtls_serial /// This test ensures observability works with both certificate configuration methods. /// Also verifies Rule #1 (cross-gateway uniformity): async works identically to sync. /// - [Fact] + [Test] public async Task When_publishing_with_certificate_from_file_path_trace_context_is_preserved_async() { // Verify certificate exists @@ -395,19 +391,18 @@ public async Task When_publishing_with_certificate_from_file_path_trace_context_ _tracerProvider.ForceFlush(); // Assert - Trace context must be preserved regardless of certificate configuration method - Assert.NotNull(message.Header.TraceParent); - Assert.NotNull(message.Header.TraceState); - Assert.NotNull(message.Header.Baggage); + await Assert.That(message.Header.TraceParent).IsNotNull(); + await Assert.That(message.Header.TraceState).IsNotNull(); + await Assert.That(message.Header.Baggage).IsNotNull(); // Verify TraceState - Assert.Contains("brighter=00f067aa0ba902b7", message.Header.TraceState); + await Assert.That(message.Header.TraceState).Contains("brighter=00f067aa0ba902b7"); // Verify Baggage (baggage values may be URL-encoded) var baggageString = message.Header.Baggage.ToString(); - Assert.Contains("userId=alice", baggageString); + await Assert.That(baggageString).Contains("userId=alice"); // Note: Colon in serverNode value is URL-encoded as %3A - Assert.True(baggageString.Contains("serverNode=DF:28") || baggageString.Contains("serverNode=DF%3A28"), - "Baggage should contain serverNode with value DF:28 (possibly URL-encoded)"); + await Assert.That(baggageString.Contains("serverNode=DF:28") || baggageString.Contains("serverNode=DF%3A28")).IsTrue(); } finally { diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Acceptance/When_using_mtls_with_quorum_queues.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Acceptance/When_using_mtls_with_quorum_queues.cs index fef4d81b5a..106fb432c7 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Acceptance/When_using_mtls_with_quorum_queues.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Acceptance/When_using_mtls_with_quorum_queues.cs @@ -8,7 +8,6 @@ using OpenTelemetry.Resources; using OpenTelemetry.Trace; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Acceptance; @@ -22,11 +21,11 @@ namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Acceptance; /// Rule #11: BrighterTracer.WriteProducerEvent must be called for all producers /// Rule #12: CloudEvents trace context must survive serialization /// -[Trait("Category", "RabbitMQ")] -[Trait("Category", "MutualTLS")] -[Trait("Category", "Quorum")] -[Trait("Category", "Observability")] -[Trait("Requires", "Docker-mTLS")] +[Category("RabbitMQ")] +[Category("MutualTLS")] +[Category("Quorum")] +[Category("Observability")] +[Property("Requires", "Docker-mTLS")] public class RmqMutualTlsQuorumObservabilityAsyncTests : IDisposable { private readonly string _clientCertPath; @@ -63,7 +62,7 @@ public RmqMutualTlsQuorumObservabilityAsyncTests() .Build(); } - [Fact] + [Test] public async Task When_publishing_with_mtls_and_quorum_trace_context_is_preserved_async() { // Arrange - mTLS connection @@ -100,7 +99,7 @@ public async Task When_publishing_with_mtls_and_quorum_trace_context_is_preserve // Act - Create consumer first to ensure queue exists using var consumer = new RmqMessageConsumer(connection, queueName.Value, routingKey.Value, false); - consumer.Purge(); + await consumer.PurgeAsync(); // Publish message with trace context using var producer = new RmqMessageProducer(connection) @@ -123,19 +122,19 @@ public async Task When_publishing_with_mtls_and_quorum_trace_context_is_preserve var receivedMessages = await consumer.ReceiveAsync(TimeSpan.FromSeconds(5)); // Assert - Verify message was received - Assert.NotEmpty(receivedMessages); + await Assert.That(receivedMessages).IsNotEmpty(); var receivedMessage = receivedMessages.First(); // Assert - Rule #10: TraceParent must be preserved - Assert.NotNull(receivedMessage.Header.TraceParent); - Assert.Contains(activity?.TraceId.ToString() ?? "", receivedMessage.Header.TraceParent.Value); + await Assert.That(receivedMessage.Header.TraceParent).IsNotNull(); + await Assert.That(receivedMessage.Header.TraceParent.Value).Contains(activity?.TraceId.ToString() ?? ""); // Assert - Rule #11: BrighterTracer.WriteProducerEvent was called // The presence of activities in our exporter confirms the tracer is working - Assert.NotEmpty(_exportedActivities); + await Assert.That(_exportedActivities).IsNotEmpty(); } - [Fact] + [Test] public async Task When_publishing_with_mtls_quorum_and_baggage_context_survives_async() { // Arrange - mTLS connection @@ -162,7 +161,7 @@ public async Task When_publishing_with_mtls_quorum_and_baggage_context_survives_ { // Act using var consumer = new RmqMessageConsumer(connection, queueName.Value, routingKey.Value, false); - consumer.Purge(); + await consumer.PurgeAsync(); using var producer = new RmqMessageProducer(connection) { @@ -178,13 +177,13 @@ public async Task When_publishing_with_mtls_quorum_and_baggage_context_survives_ var receivedMessages = await consumer.ReceiveAsync(TimeSpan.FromSeconds(5)); // Assert - Baggage must survive (Rule #12) - Assert.NotEmpty(receivedMessages); + await Assert.That(receivedMessages).IsNotEmpty(); var receivedMessage = receivedMessages.First(); - Assert.NotNull(receivedMessage.Header.Baggage); + await Assert.That(receivedMessage.Header.Baggage).IsNotNull(); var baggageString = receivedMessage.Header.Baggage.ToString(); - Assert.Contains("userId=alice", baggageString); - Assert.Contains("serverNode=node-42", baggageString); + await Assert.That(baggageString).Contains("userId=alice"); + await Assert.That(baggageString).Contains("serverNode=node-42"); } finally { diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_a_message_consumer_a_cloud_events.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_a_message_consumer_a_cloud_events.cs index 578f7d7f21..f3afe342e0 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_a_message_consumer_a_cloud_events.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_a_message_consumer_a_cloud_events.cs @@ -1,11 +1,10 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -[Trait("Category", "RMQ")] +[Category("RMQ")] public class RMQBufferedConsumerCloudEventsTestsAsync : IAsyncDisposable { private readonly IAmAMessageProducerAsync _messageProducer; @@ -31,7 +30,7 @@ public RMQBufferedConsumerCloudEventsTestsAsync() .GetResult(); } - [Fact] + [Test] public async Task When_uses_cloud_events_async() { //Post one more than batch size messages @@ -52,13 +51,13 @@ public async Task When_uses_cloud_events_async() var messages = await _messageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); //We should only have three messages - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); - Assert.Equal(messageOne.Header.MessageId, messages[0].Header.MessageId); - Assert.Equal(messageOne.Header.Subject, messages[0].Header.Subject); - Assert.Equal(messageOne.Header.Type, messages[0].Header.Type); - Assert.Equal(messageOne.Header.Source, messages[0].Header.Source); - Assert.Equal(messageOne.Header.DataSchema, messages[0].Header.DataSchema); + await Assert.That(messages[0].Header.MessageId).IsEqualTo(messageOne.Header.MessageId); + await Assert.That(messages[0].Header.Subject).IsEqualTo(messageOne.Header.Subject); + await Assert.That(messages[0].Header.Type).IsEqualTo(messageOne.Header.Type); + await Assert.That(messages[0].Header.Source).IsEqualTo(messageOne.Header.Source); + await Assert.That(messages[0].Header.DataSchema).IsEqualTo(messageOne.Header.DataSchema); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs index 8ecef01e5f..fce47311c3 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs @@ -1,15 +1,14 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -[Trait("Category", "RMQ")] -public class RMQBufferedConsumerTestsAsync : IDisposable, IAsyncDisposable +[Category("RMQ")] +public class RMQBufferedConsumerTestsAsync : IAsyncDisposable { - private readonly IAmAMessageProducerAsync _messageProducer; - private readonly IAmAMessageConsumerAsync _messageConsumer; + private IAmAMessageProducerAsync _messageProducer; + private IAmAMessageConsumerAsync _messageConsumer; private readonly ChannelName _channelName = new(Guid.NewGuid().ToString()); private readonly RoutingKey _routingKey = new(Guid.NewGuid().ToString()); private const int BatchSize = 3; @@ -24,12 +23,22 @@ public RMQBufferedConsumerTestsAsync() _messageProducer = new RmqMessageProducer(rmqConnection); _messageConsumer = new RmqMessageConsumer(connection:rmqConnection, queueName:_channelName, routingKey:_routingKey, isDurable:false, highAvailability:false, batchSize:BatchSize); + } + + [Before(Test)] + public async Task Setup() + { + var rmqConnection = new RmqMessagingGatewayConnection + { + AmpqUri = new AmqpUriSpecification(new Uri("amqp://guest:guest@localhost:5672/%2f")), + Exchange = new Exchange("paramore.brighter.exchange") + }; //create the queue, so that we can receive messages posted to it - new QueueFactory(rmqConnection, _channelName, new RoutingKeys(_routingKey)).CreateAsync().GetAwaiter().GetResult(); + await new QueueFactory(rmqConnection, _channelName, new RoutingKeys(_routingKey)).CreateAsync(); } - [Fact] + [Test] public async Task When_a_message_consumer_reads_multiple_messages() { //Post one more than batch size messages @@ -49,7 +58,7 @@ public async Task When_a_message_consumer_reads_multiple_messages() var messages = await _messageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); //We should only have three messages - Assert.Equal(3, messages.Length); + await Assert.That(messages.Length).IsEqualTo(3); //ack those to remove from the queue foreach (var message in messages) @@ -64,12 +73,13 @@ public async Task When_a_message_consumer_reads_multiple_messages() messages = await _messageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(500)); //This time, just the one message - Assert.Equal(1, messages.Length); + await Assert.That(messages.Length).IsEqualTo(1); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - _messageConsumer.PurgeAsync().GetAwaiter().GetResult(); + await _messageConsumer.PurgeAsync(); ((IAmAMessageProducerSync)_messageProducer).Dispose(); ((IAmAMessageProducerSync)_messageProducer).Dispose(); } diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_a_message_consumer_throws_an_already_closed_exception_when_connecting_async.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_a_message_consumer_throws_an_already_closed_exception_when_connecting_async.cs index f04daf5f60..bc4b47f735 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_a_message_consumer_throws_an_already_closed_exception_when_connecting_async.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_a_message_consumer_throws_an_already_closed_exception_when_connecting_async.cs @@ -3,12 +3,11 @@ using Paramore.Brighter.MessagingGateway.RMQ.Async; using Paramore.Brighter.RMQ.Async.Tests.TestDoubles; using RabbitMQ.Client.Exceptions; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -[Trait("Category", "RMQ")] -public class AsyncRmqMessageConsumerConnectionClosedTests : IDisposable, IAsyncDisposable +[Category("RMQ")] +public class AsyncRmqMessageConsumerConnectionClosedTests : IAsyncDisposable { private readonly IAmAMessageProducerAsync _sender; private readonly IAmAMessageConsumerAsync _receiver; @@ -37,7 +36,7 @@ public AsyncRmqMessageConsumerConnectionClosedTests() _badReceiver = new AlreadyClosedRmqMessageConsumer(rmqConnection, queueName, _sentMessage.Header.Topic, false, 1, false); } - [Fact] + [Test] public async Task When_a_message_consumer_throws_an_already_closed_exception_when_connecting() { await _sender.SendAsync(_sentMessage); @@ -50,13 +49,14 @@ public async Task When_a_message_consumer_throws_an_already_closed_exception_whe catch (ChannelFailureException cfe) { exceptionHappened = true; - Assert.True((cfe.InnerException) is AlreadyClosedException); + await Assert.That((cfe.InnerException) is AlreadyClosedException).IsTrue(); } - Assert.True(exceptionHappened); + await Assert.That(exceptionHappened).IsTrue(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { ((IAmAMessageProducerSync)_sender).Dispose(); ((IAmAMessageConsumerSync)_receiver).Dispose(); diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_a_message_consumer_throws_an_not_supported_exception_when_connecting_async.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_a_message_consumer_throws_an_not_supported_exception_when_connecting_async.cs index 9c72524030..62be745cce 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_a_message_consumer_throws_an_not_supported_exception_when_connecting_async.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_a_message_consumer_throws_an_not_supported_exception_when_connecting_async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -26,24 +26,24 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; using Paramore.Brighter.RMQ.Async.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -[Trait("Category", "RMQ")] +[Category("RMQ")] -public class AsyncRmqMessageConsumerChannelFailureTests : IAsyncDisposable, IDisposable +public class AsyncRmqMessageConsumerChannelFailureTests : IAsyncDisposable { - private readonly IAmAMessageProducerAsync _sender; - private readonly IAmAMessageConsumerAsync _badReceiver; + private IAmAMessageProducerAsync _sender; + private IAmAMessageConsumerAsync _badReceiver; + private Message _sentMessage; public AsyncRmqMessageConsumerChannelFailureTests() { - var messageHeader = new MessageHeader(Guid.NewGuid().ToString(), + var messageHeader = new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey(Guid.NewGuid().ToString()), MessageType.MT_COMMAND); messageHeader.UpdateHandledCount(); - Message sentMessage = new(messageHeader, new MessageBody("test content")); + _sentMessage = new Message(messageHeader, new MessageBody("test content")); var rmqConnection = new RmqMessagingGatewayConnection { @@ -53,13 +53,17 @@ public AsyncRmqMessageConsumerChannelFailureTests() _sender = new RmqMessageProducer(rmqConnection); var queueName = new ChannelName(Guid.NewGuid().ToString()); - - _badReceiver = new NotSupportedRmqMessageConsumer(rmqConnection,queueName, sentMessage.Header.Topic, false, 1, false); - _sender.SendAsync(sentMessage).GetAwaiter().GetResult(); + _badReceiver = new NotSupportedRmqMessageConsumer(rmqConnection,queueName, _sentMessage.Header.Topic, false, 1, false); + } + + [Before(Test)] + public async Task Setup() + { + await _sender.SendAsync(_sentMessage); } - [Fact] + [Test] public async Task When_a_message_consumer_throws_an_not_supported_exception_when_connecting() { //let messages propogate @@ -73,14 +77,14 @@ public async Task When_a_message_consumer_throws_an_not_supported_exception_when catch (ChannelFailureException cfe) { exceptionHappened = true; - Assert.True((cfe.InnerException) is NotSupportedException); + await Assert.That((cfe.InnerException) is NotSupportedException).IsTrue(); } - Assert.True(exceptionHappened); + await Assert.That(exceptionHappened).IsTrue(); } - [Fact] - public void Dispose() + [After(Test)] + public async Task Cleanup() { ((IAmAMessageProducerSync)_sender).Dispose(); ((IAmAMessageConsumerSync)_badReceiver).Dispose(); diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_a_message_consumer_throws_an_operation_interrupted_exception_when_connecting_async.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_a_message_consumer_throws_an_operation_interrupted_exception_when_connecting_async.cs index 4b368367e5..561f6d7dcd 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_a_message_consumer_throws_an_operation_interrupted_exception_when_connecting_async.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_a_message_consumer_throws_an_operation_interrupted_exception_when_connecting_async.cs @@ -27,24 +27,24 @@ THE SOFTWARE. */ using Paramore.Brighter.MessagingGateway.RMQ.Async; using Paramore.Brighter.RMQ.Async.Tests.TestDoubles; using RabbitMQ.Client.Exceptions; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -[Trait("Category", "RMQ")] -public class AsyncRmqMessageConsumerOperationInterruptedTestsAsync : IAsyncDisposable, IDisposable +[Category("RMQ")] +public class AsyncRmqMessageConsumerOperationInterruptedTestsAsync : IAsyncDisposable { - private readonly IAmAMessageProducerAsync _sender; - private readonly IAmAMessageConsumerAsync _receiver; - private readonly IAmAMessageConsumerAsync _badReceiver; + private IAmAMessageProducerAsync _sender; + private IAmAMessageConsumerAsync _receiver; + private IAmAMessageConsumerAsync _badReceiver; + private Message _sentMessage; public AsyncRmqMessageConsumerOperationInterruptedTestsAsync() { - var messageHeader = new MessageHeader(Guid.NewGuid().ToString(), + var messageHeader = new MessageHeader(Guid.NewGuid().ToString(), new RoutingKey(Guid.NewGuid().ToString()), MessageType.MT_COMMAND); messageHeader.UpdateHandledCount(); - Message sentMessage = new(messageHeader, new MessageBody("test content")); + _sentMessage = new Message(messageHeader, new MessageBody("test content")); var rmqConnection = new RmqMessagingGatewayConnection { @@ -53,13 +53,17 @@ public AsyncRmqMessageConsumerOperationInterruptedTestsAsync() }; _sender = new RmqMessageProducer(rmqConnection); - _receiver = new RmqMessageConsumer(rmqConnection, new ChannelName(Guid.NewGuid().ToString()), sentMessage.Header.Topic, false, false); - _badReceiver = new OperationInterruptedRmqMessageConsumer(rmqConnection, new ChannelName(Guid.NewGuid().ToString()), sentMessage.Header.Topic, false, 1, false); + _receiver = new RmqMessageConsumer(rmqConnection, new ChannelName(Guid.NewGuid().ToString()), _sentMessage.Header.Topic, false, false); + _badReceiver = new OperationInterruptedRmqMessageConsumer(rmqConnection, new ChannelName(Guid.NewGuid().ToString()), _sentMessage.Header.Topic, false, 1, false); + } - _sender.SendAsync(sentMessage).GetAwaiter().GetResult(); + [Before(Test)] + public async Task Setup() + { + await _sender.SendAsync(_sentMessage); } - [Fact] + [Test] public async Task When_a_message_consumer_throws_an_operation_interrupted_exception_when_connecting() { bool exceptionHappened = false; @@ -70,13 +74,14 @@ public async Task When_a_message_consumer_throws_an_operation_interrupted_excep catch (ChannelFailureException cfe) { exceptionHappened = true; - Assert.True((cfe.InnerException) is OperationInterruptedException); + await Assert.That((cfe.InnerException) is OperationInterruptedException).IsTrue(); } - Assert.True(exceptionHappened); + await Assert.That(exceptionHappened).IsTrue(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { ((IAmAMessageProducerSync)_sender).Dispose(); ((IAmAMessageConsumerSync)_receiver).Dispose(); diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_binding_a_channel_to_multiple_topics_async.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_binding_a_channel_to_multiple_topics_async.cs index 0d7eb02fbf..002d0637e3 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_binding_a_channel_to_multiple_topics_async.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_binding_a_channel_to_multiple_topics_async.cs @@ -1,49 +1,55 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -[Trait("Category", "RMQ")] -public class AsyncRmqMessageConsumerMultipleTopicTests : IAsyncDisposable, IDisposable +[Category("RMQ")] +public class AsyncRmqMessageConsumerMultipleTopicTests : IAsyncDisposable { - private readonly IAmAMessageProducerAsync _messageProducer; - private readonly IAmAMessageConsumerAsync _messageConsumer; - private readonly Message _messageTopic1, _messageTopic2; + private IAmAMessageProducerAsync _messageProducer; + private IAmAMessageConsumerAsync _messageConsumer; + private Message _messageTopic1, _messageTopic2; + private RmqMessagingGatewayConnection _rmqConnection; + private RoutingKeys _topics; + private ChannelName _queueName; public AsyncRmqMessageConsumerMultipleTopicTests() { var routingKeyOne = new RoutingKey(Guid.NewGuid().ToString()); var routingKeyTwo = new RoutingKey(Guid.NewGuid().ToString()); - + _messageTopic1 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), routingKeyOne, MessageType.MT_COMMAND), + new MessageHeader(Guid.NewGuid().ToString(), routingKeyOne, MessageType.MT_COMMAND), new MessageBody("test content for topic test 1")); _messageTopic2 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), routingKeyTwo, MessageType.MT_COMMAND), + new MessageHeader(Guid.NewGuid().ToString(), routingKeyTwo, MessageType.MT_COMMAND), new MessageBody("test content for topic test 2")); - var rmqConnection = new RmqMessagingGatewayConnection + _rmqConnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://guest:guest@localhost:5672/%2f")), Exchange = new Exchange("paramore.brighter.exchange") }; - var topics = new RoutingKeys([ + _topics = new RoutingKeys([ routingKeyOne, routingKeyTwo ]); - var queueName = new ChannelName(Guid.NewGuid().ToString()); + _queueName = new ChannelName(Guid.NewGuid().ToString()); - _messageProducer = new RmqMessageProducer(rmqConnection); - _messageConsumer = new RmqMessageConsumer(rmqConnection, queueName , topics, false, false); + _messageProducer = new RmqMessageProducer(_rmqConnection); + _messageConsumer = new RmqMessageConsumer(_rmqConnection, _queueName , _topics, false, false); + } - new QueueFactory(rmqConnection, queueName, topics).CreateAsync().GetAwaiter().GetResult(); + [Before(Test)] + public async Task Setup() + { + await new QueueFactory(_rmqConnection, _queueName, _topics).CreateAsync(); } - [Fact] + [Test] public async Task When_reading_a_message_from_a_channel_with_multiple_topics() { await _messageProducer.SendAsync(_messageTopic1); @@ -57,14 +63,15 @@ public async Task When_reading_a_message_from_a_channel_with_multiple_topics() var topic2Result = (await _messageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000))).First(); await _messageConsumer.AcknowledgeAsync(topic2Result); - Assert.Equal(_messageTopic1.Header.Topic, topic1Result.Header.Topic); - Assert.Equivalent(_messageTopic1.Body.Value, topic1Result.Body.Value); + await Assert.That(topic1Result.Header.Topic).IsEqualTo(_messageTopic1.Header.Topic); + await Assert.That(topic1Result.Body.Value).IsEquivalentTo(_messageTopic1.Body.Value); - Assert.Equal(_messageTopic2.Header.Topic, topic2Result.Header.Topic); - Assert.Equivalent(_messageTopic2.Body.Value, topic2Result.Body.Value); + await Assert.That(topic2Result.Header.Topic).IsEqualTo(_messageTopic2.Header.Topic); + await Assert.That(topic2Result.Body.Value).IsEquivalentTo(_messageTopic2.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { ((IAmAMessageProducerSync) _messageProducer).Dispose(); ((IAmAMessageConsumerSync)_messageConsumer).Dispose(); diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_confirming_multiple_messages_via_the_messaging_gateway_async.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_confirming_multiple_messages_via_the_messaging_gateway_async.cs index 558223779d..aabf4c118a 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_confirming_multiple_messages_via_the_messaging_gateway_async.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_confirming_multiple_messages_via_the_messaging_gateway_async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,11 +27,10 @@ THE SOFTWARE. */ using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -[Trait("Category", "RMQ")] +[Category("RMQ")] public class RmqMessageProducerConfirmationsMultipleMessagesAsyncTests : IDisposable { private readonly RmqMessageProducer _messageProducer; @@ -65,7 +64,7 @@ public RmqMessageProducerConfirmationsMultipleMessagesAsyncTests() .GetResult(); } - [Fact] + [Test] public async Task When_confirming_multiple_messages_via_the_messaging_gateway_async() { // Subscribe to the OnMessagePublished event @@ -84,7 +83,7 @@ public async Task When_confirming_multiple_messages_via_the_messaging_gateway_as await Task.Delay(1000); // Verify that OnMessagePublished was called for all messages - Assert.Equal(_numberOfMessages, _totalPublished); + await Assert.That(_totalPublished).IsEqualTo(_numberOfMessages); } public void Dispose() diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_confirming_posting_a_message_via_the_messaging_gateway_async.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_confirming_posting_a_message_via_the_messaging_gateway_async.cs index bec51f0d6d..5e91ac9b52 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_confirming_posting_a_message_via_the_messaging_gateway_async.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_confirming_posting_a_message_via_the_messaging_gateway_async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -25,11 +25,10 @@ THE SOFTWARE. */ using System; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -[Trait("Category", "RMQ")] +[Category("RMQ")] public class RmqMessageProducerConfirmationsSendMessageAsyncTests : IDisposable { private readonly RmqMessageProducer _messageProducer; @@ -55,7 +54,7 @@ public RmqMessageProducerConfirmationsSendMessageAsyncTests() { if (success) { - Assert.Equal(_message.Id, guid); + if (guid != _message.Id) throw new Exception($"Expected guid {_message.Id} but got {guid}"); _messageWasPublished = true; _messageWasNotPublished = false; } @@ -72,15 +71,15 @@ public RmqMessageProducerConfirmationsSendMessageAsyncTests() .GetResult(); } - [Fact] + [Test] public async Task When_confirming_posting_a_message_via_the_messaging_gateway_async() { await _messageProducer.SendAsync(_message); await Task.Delay(500); - Assert.False(_messageWasNotPublished); - Assert.True(_messageWasPublished); + await Assert.That(_messageWasNotPublished).IsFalse(); + await Assert.That(_messageWasPublished).IsTrue(); } public void Dispose() diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_creating_quorum_queue_validation.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_creating_quorum_queue_validation.cs index 73a9b44d03..a6134ae156 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_creating_quorum_queue_validation.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_creating_quorum_queue_validation.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2024 Ian Cooper @@ -26,15 +26,14 @@ THE SOFTWARE. */ using System.Linq; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -[Trait("Category", "RMQ")] +[Category("RMQ")] public class RmqMessageConsumerQuorumValidationTests { - [Fact] - public void When_creating_quorum_consumer_without_durability_should_throw() + [Test] + public async Task When_creating_quorum_consumer_without_durability_should_throw() { var rmqConnection = new RmqMessagingGatewayConnection { @@ -45,17 +44,17 @@ public void When_creating_quorum_consumer_without_durability_should_throw() var queueName = new ChannelName(Guid.NewGuid().ToString()); var routingKey = new RoutingKey(Guid.NewGuid().ToString()); - var exception = Assert.Throws(() => + var exception = Assert.ThrowsExactly(() => new RmqMessageConsumer(rmqConnection, queueName, routingKey, isDurable: false, // This should cause the exception highAvailability: false, queueType: QueueType.Quorum)); - Assert.Contains("Quorum queues require durability to be enabled", exception.Message); + await Assert.That(exception.Message).Contains("Quorum queues require durability to be enabled"); } - [Fact] - public void When_creating_quorum_consumer_with_high_availability_should_throw() + [Test] + public async Task When_creating_quorum_consumer_with_high_availability_should_throw() { var rmqConnection = new RmqMessagingGatewayConnection { @@ -66,17 +65,17 @@ public void When_creating_quorum_consumer_with_high_availability_should_throw() var queueName = new ChannelName(Guid.NewGuid().ToString()); var routingKey = new RoutingKey(Guid.NewGuid().ToString()); - var exception = Assert.Throws(() => + var exception = Assert.ThrowsExactly(() => new RmqMessageConsumer(rmqConnection, queueName, routingKey, isDurable: true, highAvailability: true, // This should cause the exception queueType: QueueType.Quorum)); - Assert.Contains("Quorum queues do not support high availability mirroring", exception.Message); + await Assert.That(exception.Message).Contains("Quorum queues do not support high availability mirroring"); } - [Fact] - public void When_creating_quorum_consumer_with_correct_settings_should_succeed() + [Test] + public async Task When_creating_quorum_consumer_with_correct_settings_should_succeed() { var rmqConnection = new RmqMessagingGatewayConnection { @@ -98,10 +97,10 @@ public void When_creating_quorum_consumer_with_correct_settings_should_succeed() .GetAwaiter() .GetResult(); - Assert.NotNull(consumer); + await Assert.That(consumer).IsNotNull(); } - [Fact] + [Test] public async Task When_creating_classic_consumer_with_default_settings_should_succeed() { var rmqConnection = new RmqMessagingGatewayConnection @@ -120,8 +119,8 @@ public async Task When_creating_classic_consumer_with_default_settings_should_su queueType: QueueType.Classic); var message = await consumer.ReceiveAsync(TimeSpan.FromMilliseconds(100)); - Assert.Equal(MessageType.MT_NONE, message.Single().Header.MessageType); + await Assert.That(message.Single().Header.MessageType).IsEqualTo(MessageType.MT_NONE); - Assert.NotNull(consumer); + await Assert.That(consumer).IsNotNull(); } } diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_infrastructure_exists_can_assert_async.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_infrastructure_exists_can_assert_async.cs index 15711ceb21..72fa25a4da 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_infrastructure_exists_can_assert_async.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_infrastructure_exists_can_assert_async.cs @@ -1,11 +1,10 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -public class RmqAssumeExistingInfrastructureTestsAsync : IDisposable, IAsyncDisposable +public class RmqAssumeExistingInfrastructureTestsAsync : IAsyncDisposable { private readonly IAmAMessageProducerAsync _messageProducer; private readonly IAmAMessageConsumerAsync _messageConsumer; @@ -42,7 +41,7 @@ public RmqAssumeExistingInfrastructureTestsAsync() .GetResult() ; } - [Fact] + [Test] public async Task When_infrastructure_exists_can_assume_producer() { var exceptionThrown = false; @@ -57,10 +56,11 @@ public async Task When_infrastructure_exists_can_assume_producer() exceptionThrown = true; } - Assert.False(exceptionThrown); + await Assert.That(exceptionThrown).IsFalse(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { ((IAmAMessageProducerSync)_messageProducer).Dispose(); ((IAmAMessageConsumerSync)_messageConsumer).Dispose(); diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_infrastructure_exists_can_validate_async.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_infrastructure_exists_can_validate_async.cs index 093785c2ff..0d93eb5f89 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_infrastructure_exists_can_validate_async.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_infrastructure_exists_can_validate_async.cs @@ -1,11 +1,10 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -public class RmqValidateExistingInfrastructureTestsAsync : IDisposable, IAsyncDisposable +public class RmqValidateExistingInfrastructureTestsAsync : IAsyncDisposable { private readonly IAmAMessageProducerAsync _messageProducer; private readonly IAmAMessageConsumerAsync _messageConsumer; @@ -42,7 +41,7 @@ public RmqValidateExistingInfrastructureTestsAsync() .GetResult(); } - [Fact] + [Test] public async Task When_infrastructure_exists_can_validate_producer() { var exceptionThrown = false; @@ -57,10 +56,11 @@ public async Task When_infrastructure_exists_can_validate_producer() exceptionThrown = true; } - Assert.False(exceptionThrown); + await Assert.That(exceptionThrown).IsFalse(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { ((IAmAMessageProducerSync)_messageProducer).Dispose(); ((IAmAMessageConsumerSync)_messageConsumer).Dispose(); diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_multiple_threads_try_to_post_a_message_at_the_same_time_async.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_multiple_threads_try_to_post_a_message_at_the_same_time_async.cs index 11cc1b1a6a..608a11006b 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_multiple_threads_try_to_post_a_message_at_the_same_time_async.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_multiple_threads_try_to_post_a_message_at_the_same_time_async.cs @@ -2,12 +2,11 @@ using System.Linq; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -[Trait("Category", "RMQ")] -public class RmqMessageProducerSupportsMultipleThreadsTestsAsync : IDisposable, IAsyncDisposable +[Category("RMQ")] +public class RmqMessageProducerSupportsMultipleThreadsTestsAsync : IAsyncDisposable { private readonly IAmAMessageProducerAsync _messageProducer; private readonly Message _message; @@ -28,7 +27,7 @@ public RmqMessageProducerSupportsMultipleThreadsTestsAsync() _messageProducer = new RmqMessageProducer(rmqConnection); } - [Fact] + [Test] public async Task When_multiple_threads_try_to_post_a_message_at_the_same_time() { bool exceptionHappened = false; @@ -46,10 +45,11 @@ await Parallel.ForEachAsync(Enumerable.Range(0, 10), options, async (_, ct) => } //_should_not_throw - Assert.False(exceptionHappened); + await Assert.That(exceptionHappened).IsFalse(); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { ((IAmAMessageProducerSync)_messageProducer).Dispose(); } diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_posting_a_message_but_no_broker_created_async.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_posting_a_message_but_no_broker_created_async.cs index 2ce3ce5e43..9842379d0e 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_posting_a_message_but_no_broker_created_async.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_posting_a_message_but_no_broker_created_async.cs @@ -1,7 +1,6 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; @@ -27,7 +26,7 @@ public RmqBrokerNotPreCreatedTestsAsync() } - [Fact] + [Test] public async Task When_posting_a_message_but_no_broker_created() { bool exceptionHappened = false; @@ -40,7 +39,7 @@ public async Task When_posting_a_message_but_no_broker_created() exceptionHappened = true; } - Assert.True(exceptionHappened); + await Assert.That(exceptionHappened).IsTrue(); } public void Dispose() diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_posting_a_message_to_persist_via_the_messaging_gateway_async.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_posting_a_message_to_persist_via_the_messaging_gateway_async.cs index 0624430bb9..3d7f316ebc 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_posting_a_message_to_persist_via_the_messaging_gateway_async.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_posting_a_message_to_persist_via_the_messaging_gateway_async.cs @@ -1,13 +1,12 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -[Trait("Category", "RMQ")] -public class RmqMessageProducerSendPersistentMessageTestsAsync : IDisposable, IAsyncDisposable +[Category("RMQ")] +public class RmqMessageProducerSendPersistentMessageTestsAsync : IAsyncDisposable { private IAmAMessageProducerAsync _messageProducer; private IAmAMessageConsumerAsync _messageConsumer; @@ -38,7 +37,7 @@ public RmqMessageProducerSendPersistentMessageTestsAsync() .GetResult(); } - [Fact] + [Test] public async Task When_posting_a_message_to_persist_via_the_messaging_gateway() { // arrange @@ -48,10 +47,11 @@ public async Task When_posting_a_message_to_persist_via_the_messaging_gateway() var result = (await _messageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))).First(); // assert - Assert.Equal(true, result.Persist); + await Assert.That(result.Persist).IsEqualTo(true); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { ((IAmAMessageProducerSync)_messageProducer).Dispose(); } diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs index 65062d8419..9363e16a55 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -29,12 +29,11 @@ THE SOFTWARE. */ using Paramore.Brighter.Extensions; using Paramore.Brighter.MessagingGateway.RMQ.Async; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -[Trait("Category", "RMQ")] -public class RmqMessageProducerSendMessageTestsAsync : IDisposable, IAsyncDisposable +[Category("RMQ")] +public class RmqMessageProducerSendMessageTestsAsync : IAsyncDisposable { private readonly IAmAMessageProducerAsync _messageProducer; private readonly IAmAMessageConsumerAsync _messageConsumer; @@ -97,7 +96,7 @@ public RmqMessageProducerSendMessageTestsAsync() .GetResult(); } - [Fact] + [Test] public async Task When_posting_a_message_via_the_messaging_gateway() { await _messageProducer.SendAsync(_message); @@ -105,28 +104,29 @@ public async Task When_posting_a_message_via_the_messaging_gateway() var result = (await _messageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000))).First(); // Assert message body - Assert.Equal(_message.Body.Value, result.Body.Value); + await Assert.That(result.Body.Value).IsEqualTo(_message.Body.Value); // Assert header values - Assert.Equal(_message.Header.MessageId, result.Header.MessageId); - Assert.Equal(_message.Header.Topic, result.Header.Topic); - Assert.Equal(_message.Header.MessageType, result.Header.MessageType); - Assert.Equal(_message.Header.Source, result.Header.Source); - Assert.Equal(_message.Header.Type, result.Header.Type); - Assert.Equal(_message.Header.TimeStamp, result.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(_message.Header.CorrelationId, result.Header.CorrelationId); - Assert.Equal(_message.Header.ReplyTo, result.Header.ReplyTo); - Assert.Equal(_message.Header.ContentType, result.Header.ContentType); - Assert.Equal(_message.Header.HandledCount, result.Header.HandledCount); - Assert.Equal(_message.Header.DataSchema, result.Header.DataSchema); - Assert.Equal(_message.Header.Subject, result.Header.Subject); - Assert.Equal(TimeSpan.Zero, result.Header.Delayed); //we clear any delay from the producer, as it represents delay in the pipeline - Assert.Equal(_message.Header.TraceParent, result.Header.TraceParent); - Assert.Equal(_message.Header.TraceState, result.Header.TraceState); - Assert.Equal(_message.Header.Baggage, result.Header.Baggage); + await Assert.That(result.Header.MessageId).IsEqualTo(_message.Header.MessageId); + await Assert.That(result.Header.Topic).IsEqualTo(_message.Header.Topic); + await Assert.That(result.Header.MessageType).IsEqualTo(_message.Header.MessageType); + await Assert.That(result.Header.Source).IsEqualTo(_message.Header.Source); + await Assert.That(result.Header.Type).IsEqualTo(_message.Header.Type); + await Assert.That(result.Header.TimeStamp).IsEqualTo(_message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(result.Header.CorrelationId).IsEqualTo(_message.Header.CorrelationId); + await Assert.That(result.Header.ReplyTo).IsEqualTo(_message.Header.ReplyTo); + await Assert.That(result.Header.ContentType).IsEqualTo(_message.Header.ContentType); + await Assert.That(result.Header.HandledCount).IsEqualTo(_message.Header.HandledCount); + await Assert.That(result.Header.DataSchema).IsEqualTo(_message.Header.DataSchema); + await Assert.That(result.Header.Subject).IsEqualTo(_message.Header.Subject); + await Assert.That(result.Header.Delayed).IsEqualTo(TimeSpan.Zero); //we clear any delay from the producer, as it represents delay in the pipeline + await Assert.That(result.Header.TraceParent).IsEqualTo(_message.Header.TraceParent); + await Assert.That(result.Header.TraceState).IsEqualTo(_message.Header.TraceState); + await Assert.That(result.Header.Baggage).IsEqualTo(_message.Header.Baggage); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { ((IAmAMessageProducerSync)_messageProducer).Dispose(); } diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_posting_a_message_via_the_messaging_gateway_quorum_async.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_posting_a_message_via_the_messaging_gateway_quorum_async.cs index 544e5d6ea5..5ebc115001 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_posting_a_message_via_the_messaging_gateway_quorum_async.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_posting_a_message_via_the_messaging_gateway_quorum_async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2024 Ian Cooper @@ -29,12 +29,11 @@ THE SOFTWARE. */ using Paramore.Brighter.Extensions; using Paramore.Brighter.MessagingGateway.RMQ.Async; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -[Trait("Category", "RMQ")] -public class RmqMessageProducerSendMessageQuorumTestsAsync : IDisposable, IAsyncDisposable +[Category("RMQ")] +public class RmqMessageProducerSendMessageQuorumTestsAsync : IAsyncDisposable { private readonly IAmAMessageProducerAsync _messageProducer; private readonly IAmAMessageConsumerAsync _messageConsumer; @@ -97,7 +96,7 @@ public RmqMessageProducerSendMessageQuorumTestsAsync() queueType: QueueType.Quorum); } - [Fact] + [Test] public async Task When_posting_a_message_via_the_messaging_gateway_with_quorum_queue() { //we need to do this to create the queue @@ -112,28 +111,29 @@ public async Task When_posting_a_message_via_the_messaging_gateway_with_quorum_q var result = (await _messageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000))).First(); // Assert message body - Assert.Equal(_message.Body.Value, result.Body.Value); + await Assert.That(result.Body.Value).IsEqualTo(_message.Body.Value); // Assert header values - Assert.Equal(_message.Header.MessageId, result.Header.MessageId); - Assert.Equal(_message.Header.Topic, result.Header.Topic); - Assert.Equal(_message.Header.MessageType, result.Header.MessageType); - Assert.Equal(_message.Header.Source, result.Header.Source); - Assert.Equal(_message.Header.Type, result.Header.Type); - Assert.Equal(_message.Header.TimeStamp, result.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(_message.Header.CorrelationId, result.Header.CorrelationId); - Assert.Equal(_message.Header.ReplyTo, result.Header.ReplyTo); - Assert.Equal(_message.Header.ContentType, result.Header.ContentType); - Assert.Equal(_message.Header.HandledCount, result.Header.HandledCount); - Assert.Equal(_message.Header.DataSchema, result.Header.DataSchema); - Assert.Equal(_message.Header.Subject, result.Header.Subject); - Assert.Equal(TimeSpan.Zero, result.Header.Delayed); //we clear any delay from the producer, as it represents delay in the pipeline - Assert.Equal(_message.Header.TraceParent, result.Header.TraceParent); - Assert.Equal(_message.Header.TraceState, result.Header.TraceState); - Assert.Equal(_message.Header.Baggage, result.Header.Baggage); + await Assert.That(result.Header.MessageId).IsEqualTo(_message.Header.MessageId); + await Assert.That(result.Header.Topic).IsEqualTo(_message.Header.Topic); + await Assert.That(result.Header.MessageType).IsEqualTo(_message.Header.MessageType); + await Assert.That(result.Header.Source).IsEqualTo(_message.Header.Source); + await Assert.That(result.Header.Type).IsEqualTo(_message.Header.Type); + await Assert.That(result.Header.TimeStamp).IsEqualTo(_message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(result.Header.CorrelationId).IsEqualTo(_message.Header.CorrelationId); + await Assert.That(result.Header.ReplyTo).IsEqualTo(_message.Header.ReplyTo); + await Assert.That(result.Header.ContentType).IsEqualTo(_message.Header.ContentType); + await Assert.That(result.Header.HandledCount).IsEqualTo(_message.Header.HandledCount); + await Assert.That(result.Header.DataSchema).IsEqualTo(_message.Header.DataSchema); + await Assert.That(result.Header.Subject).IsEqualTo(_message.Header.Subject); + await Assert.That(result.Header.Delayed).IsEqualTo(TimeSpan.Zero); //we clear any delay from the producer, as it represents delay in the pipeline + await Assert.That(result.Header.TraceParent).IsEqualTo(_message.Header.TraceParent); + await Assert.That(result.Header.TraceState).IsEqualTo(_message.Header.TraceState); + await Assert.That(result.Header.Baggage).IsEqualTo(_message.Header.Baggage); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { ((IAmAMessageProducerSync)_messageProducer).Dispose(); } diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_queue_length_causes_a_message_to_be_rejected_async.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_queue_length_causes_a_message_to_be_rejected_async.cs index 5bc7a9790d..4d4940ca31 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_queue_length_causes_a_message_to_be_rejected_async.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_queue_length_causes_a_message_to_be_rejected_async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -26,12 +26,11 @@ THE SOFTWARE. */ using System.Linq; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -[Trait("Category", "RMQ")] -public class RmqMessageProducerQueueLengthTestsAsync : IDisposable, IAsyncDisposable +[Category("RMQ")] +public class RmqMessageProducerQueueLengthTestsAsync : IAsyncDisposable { private readonly IAmAMessageProducerAsync _messageProducer; private readonly IAmAMessageConsumerAsync _messageConsumer; @@ -74,7 +73,7 @@ public RmqMessageProducerQueueLengthTestsAsync() } - [Fact] + [Test] public async Task When_rejecting_a_message_due_to_queue_length() { //create the infrastructure @@ -93,11 +92,12 @@ public async Task When_rejecting_a_message_due_to_queue_length() //try to grab the next message var nextMessages = await _messageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000)); message = nextMessages.First(); - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { ((IAmAMessageProducerSync)_messageProducer).Dispose(); } diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_reading_a_delayed_message_via_the_messaging_gateway_async.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_reading_a_delayed_message_via_the_messaging_gateway_async.cs index 43c22010ef..e45ec7968d 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_reading_a_delayed_message_via_the_messaging_gateway_async.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_reading_a_delayed_message_via_the_messaging_gateway_async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,12 +27,11 @@ THE SOFTWARE. */ using System.Net.Mime; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -[Trait("Category", "RMQ")] -public class RmqMessageProducerDelayedMessageTestsAsync : IDisposable, IAsyncDisposable +[Category("RMQ")] +public class RmqMessageProducerDelayedMessageTestsAsync : IAsyncDisposable { private readonly IAmAMessageProducerAsync _messageProducer; private readonly IAmAMessageConsumerAsync _messageConsumer; @@ -67,39 +66,39 @@ public RmqMessageProducerDelayedMessageTestsAsync() .GetResult(); } - [Fact] + [Test] public async Task When_reading_a_delayed_message_via_the_messaging_gateway() { await _messageProducer.SendWithDelayAsync(_message, TimeSpan.FromMilliseconds(3000)); var immediateResult = (await _messageConsumer.ReceiveAsync(TimeSpan.Zero)).First(); var deliveredWithoutWait = immediateResult.Header.MessageType == MessageType.MT_NONE; - Assert.Equal(0, immediateResult.Header.HandledCount); - Assert.Equal(TimeSpan.Zero, immediateResult.Header.Delayed); + await Assert.That(immediateResult.Header.HandledCount).IsEqualTo(0); + await Assert.That(immediateResult.Header.Delayed).IsEqualTo(TimeSpan.Zero); //_should_have_not_been_able_get_message_before_delay - Assert.True(deliveredWithoutWait); + await Assert.That(deliveredWithoutWait).IsTrue(); var delayedResult = (await _messageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000))).First(); //_should_send_a_message_via_rmq_with_the_matching_body - Assert.Equal(_message.Body.Value, delayedResult.Body.Value); - Assert.Equal(MessageType.MT_COMMAND, delayedResult.Header.MessageType); - Assert.Equal(0, delayedResult.Header.HandledCount); - Assert.Equal(TimeSpan.FromMilliseconds(3000), delayedResult.Header.Delayed); + await Assert.That(delayedResult.Body.Value).IsEqualTo(_message.Body.Value); + await Assert.That(delayedResult.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(delayedResult.Header.HandledCount).IsEqualTo(0); + await Assert.That(delayedResult.Header.Delayed).IsEqualTo(TimeSpan.FromMilliseconds(3000)); await _messageConsumer.AcknowledgeAsync(delayedResult); } - [Fact] + [Test] public async Task When_requeing_a_failed_message_with_delay() { //send & receive a message await _messageProducer.SendAsync(_message); var message = (await _messageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))).Single(); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(TimeSpan.FromMilliseconds(0), message.Header.Delayed); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.FromMilliseconds(0)); await _messageConsumer.AcknowledgeAsync(message); @@ -109,13 +108,14 @@ public async Task When_requeing_a_failed_message_with_delay() //receive and assert var message2 = (await _messageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000))).Single(); - Assert.Equal(MessageType.MT_COMMAND, message2.Header.MessageType); - Assert.Equal(1, message2.Header.HandledCount); + await Assert.That(message2.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(message2.Header.HandledCount).IsEqualTo(1); await _messageConsumer.AcknowledgeAsync(message2); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { ((IAmAMessageConsumerSync)_messageConsumer).Dispose(); ((IAmAMessageProducerSync)_messageProducer).Dispose(); diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_rejecting_a_message_to_a_dead_letter_queue_async.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_rejecting_a_message_to_a_dead_letter_queue_async.cs index c2f9f69c55..e78695f6e0 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_rejecting_a_message_to_a_dead_letter_queue_async.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_rejecting_a_message_to_a_dead_letter_queue_async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,12 +27,11 @@ THE SOFTWARE. */ using System.Net.Mime; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -[Trait("Category", "RMQ")] -public class RmqMessageProducerDLQTestsAsync : IDisposable, IAsyncDisposable +[Category("RMQ")] +public class RmqMessageProducerDLQTestsAsync : IAsyncDisposable { private readonly IAmAMessageProducerAsync _messageProducer; private readonly IAmAMessageConsumerAsync _messageConsumer; @@ -84,7 +83,7 @@ public RmqMessageProducerDLQTestsAsync() ); } - [Fact] + [Test] public async Task When_rejecting_a_message_to_a_dead_letter_queue() { //create the infrastructure @@ -100,11 +99,12 @@ public async Task When_rejecting_a_message_to_a_dead_letter_queue() var dlqMessage = (await _deadLetterConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000))).First(); //assert this is our message - Assert.Equal(_message.Id, dlqMessage.Id); - Assert.Equal(dlqMessage.Body.Value, message.Body.Value); + await Assert.That(dlqMessage.Id).IsEqualTo(_message.Id); + await Assert.That(message.Body.Value).IsEqualTo(dlqMessage.Body.Value); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { ((IAmAMessageProducerSync)_messageProducer).Dispose(); } diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_requeuing_a_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_requeuing_a_message_via_the_messaging_gateway.cs index d598dcf464..660c4b9609 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_requeuing_a_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_requeuing_a_message_via_the_messaging_gateway.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -29,11 +29,10 @@ THE SOFTWARE. */ using Paramore.Brighter.MessagingGateway.RMQ.Async; using Paramore.Brighter.Observability; using Paramore.Brighter.RMQ.Async.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -[Trait("Category", "RMQ")] +[Category("RMQ")] public class RmqMessageProducerRequeuingMessageTests : IAsyncDisposable { private readonly IAmAMessageProducerAsync _messageProducer; @@ -105,7 +104,7 @@ public RmqMessageProducerRequeuingMessageTests() .GetResult(); } - [Fact] + [Test] public async Task When_posting_a_message_via_the_messaging_gateway_async() { await _messageProducer.SendAsync(_message); @@ -116,25 +115,25 @@ public async Task When_posting_a_message_via_the_messaging_gateway_async() result = await _channel.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); // Assert message body - Assert.Equal(_message.Body.Value, result.Body.Value); + await Assert.That(result.Body.Value).IsEqualTo(_message.Body.Value); // Assert header values - Assert.Equal(_message.Header.MessageId.ToString(), result.Header.Bag[HeaderNames.ORIGINAL_MESSAGE_ID]); - Assert.Equal(_message.Header.Topic, result.Header.Topic); - Assert.Equal(_message.Header.MessageType, result.Header.MessageType); - Assert.Equal(_message.Header.Source, result.Header.Source); - Assert.Equal(_message.Header.Type, result.Header.Type); - Assert.Equal(_message.Header.TimeStamp, result.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(_message.Header.CorrelationId, result.Header.CorrelationId); - Assert.Equal(_message.Header.ReplyTo, result.Header.ReplyTo); - Assert.Equal(_message.Header.ContentType, result.Header.ContentType); - Assert.Equal(_message.Header.HandledCount, result.Header.HandledCount); - Assert.Equal(_message.Header.DataSchema, result.Header.DataSchema); - Assert.Equal(_message.Header.Subject, result.Header.Subject); - Assert.Equal(TimeSpan.Zero, result.Header.Delayed); //we clear any delay from the producer, as it represents delay in the pipeline - Assert.Equal(_message.Header.TraceParent, result.Header.TraceParent); - Assert.Equal(_message.Header.TraceState, result.Header.TraceState); - Assert.Equal(_message.Header.Baggage, result.Header.Baggage); + await Assert.That(result.Header.Bag[HeaderNames.ORIGINAL_MESSAGE_ID]).IsEqualTo(_message.Header.MessageId.ToString()); + await Assert.That(result.Header.Topic).IsEqualTo(_message.Header.Topic); + await Assert.That(result.Header.MessageType).IsEqualTo(_message.Header.MessageType); + await Assert.That(result.Header.Source).IsEqualTo(_message.Header.Source); + await Assert.That(result.Header.Type).IsEqualTo(_message.Header.Type); + await Assert.That(result.Header.TimeStamp).IsEqualTo(_message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(result.Header.CorrelationId).IsEqualTo(_message.Header.CorrelationId); + await Assert.That(result.Header.ReplyTo).IsEqualTo(_message.Header.ReplyTo); + await Assert.That(result.Header.ContentType).IsEqualTo(_message.Header.ContentType); + await Assert.That(result.Header.HandledCount).IsEqualTo(_message.Header.HandledCount); + await Assert.That(result.Header.DataSchema).IsEqualTo(_message.Header.DataSchema); + await Assert.That(result.Header.Subject).IsEqualTo(_message.Header.Subject); + await Assert.That(result.Header.Delayed).IsEqualTo(TimeSpan.Zero); //we clear any delay from the producer, as it represents delay in the pipeline + await Assert.That(result.Header.TraceParent).IsEqualTo(_message.Header.TraceParent); + await Assert.That(result.Header.TraceState).IsEqualTo(_message.Header.TraceState); + await Assert.That(result.Header.Baggage).IsEqualTo(_message.Header.Baggage); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_resetting_a_connection_that_exists.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_resetting_a_connection_that_exists.cs index 3b7be680ea..42022bbdd9 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_resetting_a_connection_that_exists.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_resetting_a_connection_that_exists.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -25,11 +25,10 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; using RabbitMQ.Client; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -[Trait("Category", "RMQ")] +[Category("RMQ")] public class RMQMessageGatewayConnectionPoolResetConnectionExists { private readonly RmqMessageGatewayConnectionPool _connectionPool; @@ -44,13 +43,13 @@ public RMQMessageGatewayConnectionPoolResetConnectionExists() _originalConnection = _connectionPool.GetConnection(connectionFactory); } - [Fact] + [Test] public async Task When_resetting_a_connection_that_exists() { var connectionFactory = new ConnectionFactory{HostName = "localhost"}; await _connectionPool.ResetConnectionAsync(connectionFactory); - Assert.NotSame(_originalConnection, (await _connectionPool.GetConnectionAsync(connectionFactory))); + await Assert.That((await _connectionPool.GetConnectionAsync(connectionFactory))).IsNotSameReferenceAs(_originalConnection); } } diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_retry_limits_force_a_message_onto_the_DLQ_async.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_retry_limits_force_a_message_onto_the_DLQ_async.cs index 1e0a00a6b1..e913954b10 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_retry_limits_force_a_message_onto_the_DLQ_async.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_retry_limits_force_a_message_onto_the_DLQ_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Net.Mime; using System.Text.Json; @@ -9,11 +9,10 @@ using Paramore.Brighter.RMQ.Async.Tests.TestDoubles; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -[Trait("Category", "RMQ")] +[Category("RMQ")] public class RMQMessageConsumerRetryDLQTestsAsync : IDisposable { private readonly IAmAMessagePump _messagePump; @@ -115,8 +114,8 @@ public RMQMessageConsumerRetryDLQTestsAsync() ); } - [Fact(Skip = "Breaks due to fault in Task Scheduler running after context has closed")] - //[Fact] + [Test, Skip("Breaks due to fault in Task Scheduler running after context has closed")] + //[Test] public async Task When_retry_limits_force_a_message_onto_the_dlq() { //NOTE: This test is **slow** because it needs to ensure infrastructure and then wait whilst we requeue a message a number of times, @@ -145,8 +144,8 @@ public async Task When_retry_limits_force_a_message_onto_the_dlq() var dlqMessage = (await _deadLetterConsumer.ReceiveAsync(new TimeSpan(10000))).First(); //assert this is our message - Assert.Equal(MessageType.MT_COMMAND, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); await _deadLetterConsumer.AcknowledgeAsync(dlqMessage); diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_rmq_async_consumer_creates_producer_should_use_message_topic_and_scheduler.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_rmq_async_consumer_creates_producer_should_use_message_topic_and_scheduler.cs index 5f8840739d..9406ab45f0 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_rmq_async_consumer_creates_producer_should_use_message_topic_and_scheduler.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_rmq_async_consumer_creates_producer_should_use_message_topic_and_scheduler.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; using Paramore.Brighter.RMQ.Async.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; @@ -36,7 +35,7 @@ namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; /// the producer should have the scheduler configured so that delayed sends use the scheduler /// rather than falling back to native publish without delay. /// -[Trait("Category", "RMQ")] +[Category("RMQ")] public class RMQMessageConsumerProducerTopicSchedulerTestsAsync : IAsyncDisposable { private readonly IAmAMessageProducerAsync _messageProducer; @@ -79,44 +78,42 @@ public RMQMessageConsumerProducerTopicSchedulerTestsAsync() .GetResult(); } - [Fact] + [Test] public async Task When_requeuing_with_delay_should_use_scheduler() { // Arrange - send and receive a message await _messageProducer.SendAsync(_message); var received = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.NotEmpty(received); - Assert.NotEqual(MessageType.MT_NONE, received[0].Header.MessageType); + await Assert.That(received).IsNotEmpty(); + await Assert.That(received[0].Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); // Act - requeue with delay await _consumer.RequeueAsync(received[0], TimeSpan.FromSeconds(5)); // Assert - scheduler should have been called (proving producer has scheduler configured) - Assert.True(_scheduler.ScheduleAsyncCalled, - "Scheduler.ScheduleAsync should have been called via the lazily created producer"); - Assert.Equal(_message.Body.Value, _scheduler.ScheduledMessage?.Body.Value); + await Assert.That(_scheduler.ScheduleAsyncCalled).IsTrue(); + await Assert.That(_scheduler.ScheduledMessage?.Body.Value).IsEqualTo(_message.Body.Value); } - [Fact] + [Test] public async Task When_requeuing_with_zero_delay_should_not_create_producer() { // Arrange - send and receive a message await _messageProducer.SendAsync(_message); var received = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.NotEmpty(received); - Assert.NotEqual(MessageType.MT_NONE, received[0].Header.MessageType); + await Assert.That(received).IsNotEmpty(); + await Assert.That(received[0].Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); // Act - requeue with zero delay (uses direct requeue, not producer) await _consumer.RequeueAsync(received[0], TimeSpan.Zero); // Assert - scheduler should NOT have been called - Assert.False(_scheduler.ScheduleAsyncCalled, - "Scheduler should not be called for zero-delay requeue"); + await Assert.That(_scheduler.ScheduleAsyncCalled).IsFalse(); } public async ValueTask DisposeAsync() { - _consumer.Dispose(); + await _consumer.DisposeAsync(); await _messageProducer.DisposeAsync(); } diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_rmq_async_consumer_disposes_should_dispose_producer.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_rmq_async_consumer_disposes_should_dispose_producer.cs index d57457879d..990e4958c4 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_rmq_async_consumer_disposes_should_dispose_producer.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_rmq_async_consumer_disposes_should_dispose_producer.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; using Paramore.Brighter.RMQ.Async.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; @@ -35,7 +34,7 @@ namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; /// When the RMQ async consumer is disposed, it should also dispose any lazily created producer. /// If no producer was created, disposal should still succeed without error. /// -[Trait("Category", "RMQ")] +[Category("RMQ")] public class When_rmq_async_consumer_disposes_should_dispose_producer { private readonly RmqMessagingGatewayConnection _rmqConnection; @@ -49,8 +48,8 @@ public When_rmq_async_consumer_disposes_should_dispose_producer() }; } - [Fact] - public void When_disposing_without_producer_created_should_not_throw() + [Test] + public async Task When_disposing_without_producer_created_should_not_throw() { // Arrange - consumer that never requeued with delay (no producer created) var consumer = new RmqMessageConsumer( @@ -60,11 +59,10 @@ public void When_disposing_without_producer_created_should_not_throw() isDurable: false); // Act & Assert - should not throw - var exception = Record.Exception(() => consumer.Dispose()); - Assert.Null(exception); + await Assert.That(() => consumer.Dispose()).ThrowsNothing(); } - [Fact] + [Test] public async Task When_disposing_after_delayed_requeue_should_not_throw() { // Arrange @@ -93,17 +91,16 @@ public async Task When_disposing_after_delayed_requeue_should_not_throw() // Send, receive, and requeue with delay to trigger producer creation await sendProducer.SendAsync(message); var received = await consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.NotEmpty(received); + await Assert.That(received).IsNotEmpty(); await consumer.RequeueAsync(received[0], TimeSpan.FromSeconds(5)); // Act & Assert - disposing consumer should also dispose the lazily created producer - var exception = Record.Exception(() => consumer.Dispose()); - Assert.Null(exception); + await Assert.That(() => consumer.Dispose()).ThrowsNothing(); sendProducer.Dispose(); } - [Fact] + [Test] public async Task When_disposing_async_after_delayed_requeue_should_not_throw() { // Arrange @@ -132,12 +129,11 @@ public async Task When_disposing_async_after_delayed_requeue_should_not_throw() // Send, receive, and requeue with delay to trigger producer creation await sendProducer.SendAsync(message); var received = await consumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.NotEmpty(received); + await Assert.That(received).IsNotEmpty(); await consumer.RequeueAsync(received[0], TimeSpan.FromSeconds(5)); // Act & Assert - async disposing consumer should also dispose the lazily created producer - var exception = await Record.ExceptionAsync(async () => await consumer.DisposeAsync()); - Assert.Null(exception); + await Assert.That(async () => await consumer.DisposeAsync()).ThrowsNothing(); await sendProducer.DisposeAsync(); } diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_rmq_async_consumer_requeues_without_native_delay_should_use_producer.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_rmq_async_consumer_requeues_without_native_delay_should_use_producer.cs index 9cf5d4e683..d91216ee47 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_rmq_async_consumer_requeues_without_native_delay_should_use_producer.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_rmq_async_consumer_requeues_without_native_delay_should_use_producer.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; using Paramore.Brighter.RMQ.Async.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; @@ -37,7 +36,7 @@ namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; /// with Task.Delay. This ensures the pump thread is freed immediately while the scheduler handles /// the delayed redelivery. /// -[Trait("Category", "RMQ")] +[Category("RMQ")] public class RmqMesageConsumerDelayTestsAsync : IAsyncDisposable { private readonly IAmAMessageProducerAsync _messageProducer; @@ -78,13 +77,13 @@ public RmqMesageConsumerDelayTestsAsync () .GetResult(); } - [Fact] + [Test] public async Task When_requeuing_with_delay_should_not_block_pump() { // Arrange - send and receive a message await _messageProducer.SendAsync(_message); var received = await _channel.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.NotEqual(MessageType.MT_NONE, received.Header.MessageType); + await Assert.That(received.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); // Act - requeue with a significant delay (5 seconds) var stopwatch = Stopwatch.StartNew(); @@ -92,15 +91,14 @@ public async Task When_requeuing_with_delay_should_not_block_pump() stopwatch.Stop(); // Assert - requeue should return true - Assert.True(result, "Requeue should succeed"); + await Assert.That(result).IsTrue(); // Assert - requeue should complete quickly, proving Task.Delay is NOT used to block the pump - Assert.True(stopwatch.Elapsed < TimeSpan.FromSeconds(2), - $"Requeue should not block with Task.Delay; took {stopwatch.Elapsed.TotalSeconds:F1}s"); + await Assert.That(stopwatch.Elapsed < TimeSpan.FromSeconds(2)).IsTrue(); // Assert - message should be available on the queue (published via producer through exchange) var requeued = await _channel.ReceiveAsync(TimeSpan.FromMilliseconds(10000)); - Assert.Equal(_message.Body.Value, requeued.Body.Value); + await Assert.That(requeued.Body.Value).IsEqualTo(_message.Body.Value); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_sending_a_message_should_propagate_context.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_sending_a_message_should_propagate_context.cs index 5a1cf59b93..67e55f3011 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_sending_a_message_should_propagate_context.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_sending_a_message_should_propagate_context.cs @@ -8,12 +8,11 @@ using OpenTelemetry.Trace; using Paramore.Brighter.MessagingGateway.RMQ.Async; using Paramore.Brighter.Observability; -using Xunit; using Baggage = OpenTelemetry.Baggage; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor { - [Trait("Category", "RMQ")] + [Category("RMQ")] public class RmqMessageProducerPropagateContextTests : IDisposable { private readonly IAmAMessageProducerAsync _messageProducer; @@ -61,7 +60,7 @@ public RmqMessageProducerPropagateContextTests() }; } - [Fact] + [Test] public async Task When_Sending_A_Message_Should_Propagate_Context() { //arrange @@ -76,9 +75,9 @@ public async Task When_Sending_A_Message_Should_Propagate_Context() .SelectMany(a => a.Events) .FirstOrDefault(e => e.Name == $"{_message.Header.Topic} {CommandProcessorSpanOperation.Publish.ToSpanName()}"); - Assert.NotNull(_message.Header.TraceParent); - Assert.Equal("brighter=00f067aa0ba902b7,congo=t61rcWkgMzE", _message.Header.TraceState); - Assert.Equal("key=value,key2=value2", _message.Header.Baggage.ToString()); + await Assert.That(_message.Header.TraceParent).IsNotNull(); + await Assert.That(_message.Header.TraceState).IsEqualTo("brighter=00f067aa0ba902b7,congo=t61rcWkgMzE"); + await Assert.That(_message.Header.Baggage.ToString()).IsEqualTo("key=value,key2=value2"); } public void Dispose() diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_ttl_causes_a_message_to_expire.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_ttl_causes_a_message_to_expire.cs index 27272990a5..1630174da9 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_ttl_causes_a_message_to_expire.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Proactor/When_ttl_causes_a_message_to_expire.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -26,28 +26,27 @@ THE SOFTWARE. */ using System.Linq; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Proactor; -[Trait("Category", "RMQ")] -public class RmqMessageProducerTTLTests : IAsyncDisposable, IDisposable +[Category("RMQ")] +public class RmqMessageProducerTTLTests : IAsyncDisposable { - private readonly IAmAMessageProducerAsync _messageProducer; - private readonly IAmAMessageConsumerAsync _messageConsumer; - private readonly Message _messageOne; - private readonly Message _messageTwo; + private IAmAMessageProducerAsync _messageProducer; + private IAmAMessageConsumerAsync _messageConsumer; + private Message _messageOne; + private Message _messageTwo; public RmqMessageProducerTTLTests () { _messageOne = new Message( - new MessageHeader(Guid.NewGuid().ToString(), - new RoutingKey(Guid.NewGuid().ToString()), MessageType.MT_COMMAND), + new MessageHeader(Guid.NewGuid().ToString(), + new RoutingKey(Guid.NewGuid().ToString()), MessageType.MT_COMMAND), new MessageBody("test content")); - + _messageTwo = new Message( - new MessageHeader(Guid.NewGuid().ToString(), - new RoutingKey(Guid.NewGuid().ToString()), MessageType.MT_COMMAND), + new MessageHeader(Guid.NewGuid().ToString(), + new RoutingKey(Guid.NewGuid().ToString()), MessageType.MT_COMMAND), new MessageBody("test content")); var rmqConnection = new RmqMessagingGatewayConnection @@ -55,25 +54,28 @@ public RmqMessageProducerTTLTests () AmpqUri = new AmqpUriSpecification(new Uri("amqp://guest:guest@localhost:5672/%2f")), Exchange = new Exchange("paramore.brighter.exchange"), }; - + _messageProducer = new RmqMessageProducer(rmqConnection); _messageConsumer = new RmqMessageConsumer( - connection: rmqConnection, - queueName: new ChannelName(Guid.NewGuid().ToString()), - routingKey: _messageOne.Header.Topic, - isDurable: false, + connection: rmqConnection, + queueName: new ChannelName(Guid.NewGuid().ToString()), + routingKey: _messageOne.Header.Topic, + isDurable: false, highAvailability: false, ttl: TimeSpan.FromMilliseconds(10000), makeChannels:OnMissingChannel.Create ); + } + [Before(Test)] + public async Task Setup() + { //create the infrastructure - _messageConsumer.ReceiveAsync(TimeSpan.Zero).GetAwaiter().GetResult(); - + await _messageConsumer.ReceiveAsync(TimeSpan.Zero); } - [Fact] + [Test] public async Task When_rejecting_a_message_to_a_dead_letter_queue() { await _messageProducer.SendAsync(_messageOne); @@ -81,7 +83,7 @@ public async Task When_rejecting_a_message_to_a_dead_letter_queue() //check messages are flowing - absence needs to be expiry var messageOne = (await _messageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(5000))).First(); - Assert.Equal(_messageOne.Id, messageOne.Id); + await Assert.That(messageOne.Id).IsEqualTo(_messageOne.Id); //Let it expire await Task.Delay(11000); @@ -89,10 +91,11 @@ public async Task When_rejecting_a_message_to_a_dead_letter_queue() var dlqMessage = (await _messageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(10000))).First(); //assert this is our message - Assert.Equal(MessageType.MT_NONE, dlqMessage.Header.MessageType); + await Assert.That(dlqMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(Test)] + public async Task Cleanup() { ((IAmAMessageProducerSync)_messageProducer).Dispose(); ((IAmAMessageConsumerSync)_messageConsumer).Dispose(); diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_a_message_consumer_a_cloud_events.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_a_message_consumer_a_cloud_events.cs index 8d4f4f7a58..99fa632c9c 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_a_message_consumer_a_cloud_events.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_a_message_consumer_a_cloud_events.cs @@ -1,12 +1,10 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RMQBufferedConsumerCloudEventsTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -32,8 +30,8 @@ public RMQBufferedConsumerCloudEventsTests() .GetResult(); } - [Fact] - public void When_uses_cloud_events() + [Test] + public async Task When_uses_cloud_events() { //Post one more than batch size messages var messageOne = new Message( @@ -53,13 +51,13 @@ public void When_uses_cloud_events() var messages = _messageConsumer.Receive(TimeSpan.FromMilliseconds(1000)); //We should only have three messages - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); - Assert.Equal(messageOne.Header.MessageId, messages[0].Header.MessageId); - Assert.Equal(messageOne.Header.Subject, messages[0].Header.Subject); - Assert.Equal(messageOne.Header.Type, messages[0].Header.Type); - Assert.Equal(messageOne.Header.Source, messages[0].Header.Source); - Assert.Equal(messageOne.Header.DataSchema, messages[0].Header.DataSchema); + await Assert.That(messages[0].Header.MessageId).IsEqualTo(messageOne.Header.MessageId); + await Assert.That(messages[0].Header.Subject).IsEqualTo(messageOne.Header.Subject); + await Assert.That(messages[0].Header.Type).IsEqualTo(messageOne.Header.Type); + await Assert.That(messages[0].Header.Source).IsEqualTo(messageOne.Header.Source); + await Assert.That(messages[0].Header.DataSchema).IsEqualTo(messageOne.Header.DataSchema); } public void Dispose() @@ -69,3 +67,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_a_message_consumer_reads_multiple_messages.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_a_message_consumer_reads_multiple_messages.cs index 719ee5d8ff..ad9e0e6b08 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_a_message_consumer_reads_multiple_messages.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_a_message_consumer_reads_multiple_messages.cs @@ -1,16 +1,14 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RMQBufferedConsumerTests : IDisposable { - private readonly IAmAMessageProducerSync _messageProducer; - private readonly IAmAMessageConsumerSync _messageConsumer; + private IAmAMessageProducerSync _messageProducer; + private IAmAMessageConsumerSync _messageConsumer; private readonly ChannelName _channelName = new(Guid.NewGuid().ToString()); private readonly RoutingKey _routingKey = new(Guid.NewGuid().ToString()); private const int BatchSize = 3; @@ -25,13 +23,23 @@ public RMQBufferedConsumerTests() _messageProducer = new RmqMessageProducer(rmqConnection); _messageConsumer = new RmqMessageConsumer(connection:rmqConnection, queueName:_channelName, routingKey:_routingKey, isDurable:false, highAvailability:false, batchSize:BatchSize); - + } + + [Before(Test)] + public async Task Setup() + { + var rmqConnection = new RmqMessagingGatewayConnection + { + AmpqUri = new AmqpUriSpecification(new Uri("amqp://guest:guest@localhost:5672/%2f")), + Exchange = new Exchange("paramore.brighter.exchange") + }; + //create the queue, so that we can receive messages posted to it - new QueueFactory(rmqConnection, _channelName, new RoutingKeys(_routingKey)).CreateAsync().GetAwaiter().GetResult(); + await new QueueFactory(rmqConnection, _channelName, new RoutingKeys(_routingKey)).CreateAsync(); } - [Fact] - public void When_a_message_consumer_reads_multiple_messages() + [Test] + public async Task When_a_message_consumer_reads_multiple_messages() { //Post one more than batch size messages var messageOne = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody("test content One")); @@ -50,7 +58,7 @@ public void When_a_message_consumer_reads_multiple_messages() var messages = _messageConsumer.Receive(TimeSpan.FromMilliseconds(1000)); //We should only have three messages - Assert.Equal(3, messages.Length); + await Assert.That(messages.Length).IsEqualTo(3); //ack those to remove from the queue foreach (var message in messages) @@ -65,7 +73,7 @@ public void When_a_message_consumer_reads_multiple_messages() messages = _messageConsumer.Receive(TimeSpan.FromMilliseconds(500)); //This time, just the one message - Assert.Equal(1, messages.Length); + await Assert.That(messages.Length).IsEqualTo(1); } @@ -76,3 +84,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_already_closed_exception_when_connecting.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_already_closed_exception_when_connecting.cs index 396746cd60..51d886ad34 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_already_closed_exception_when_connecting.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_already_closed_exception_when_connecting.cs @@ -2,12 +2,10 @@ using Paramore.Brighter.MessagingGateway.RMQ.Async; using Paramore.Brighter.RMQ.Async.Tests.TestDoubles; using RabbitMQ.Client.Exceptions; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageConsumerConnectionClosedTests : IDisposable { private readonly IAmAMessageProducerSync _sender; @@ -38,8 +36,8 @@ public RmqMessageConsumerConnectionClosedTests() } - [Fact] - public void When_a_message_consumer_throws_an_already_closed_exception_when_connecting() + [Test] + public async Task When_a_message_consumer_throws_an_already_closed_exception_when_connecting() { _sender.Send(_sentMessage); @@ -51,10 +49,10 @@ public void When_a_message_consumer_throws_an_already_closed_exception_when_conn catch (ChannelFailureException cfe) { exceptionHappened = true; - Assert.True((cfe.InnerException) is AlreadyClosedException); + await Assert.That((cfe.InnerException) is AlreadyClosedException).IsTrue(); } - Assert.True(exceptionHappened); + await Assert.That(exceptionHappened).IsTrue(); } public void Dispose() @@ -63,3 +61,4 @@ public void Dispose() _receiver.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_not_supported_exception_when_connecting.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_not_supported_exception_when_connecting.cs index 98d52930d7..54f20a1190 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_not_supported_exception_when_connecting.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_not_supported_exception_when_connecting.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -25,12 +25,10 @@ THE SOFTWARE. */ using System; using Paramore.Brighter.MessagingGateway.RMQ.Async; using Paramore.Brighter.RMQ.Async.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageConsumerChannelFailureTests : IDisposable { private readonly IAmAMessageProducerSync _sender; @@ -58,8 +56,8 @@ public RmqMessageConsumerChannelFailureTests() _sender.Send(sentMessage); } - [Fact] - public void When_a_message_consumer_throws_an_not_supported_exception_when_connecting() + [Test] + public async Task When_a_message_consumer_throws_an_not_supported_exception_when_connecting() { bool exceptionHappened = false; try @@ -69,16 +67,16 @@ public void When_a_message_consumer_throws_an_not_supported_exception_when_conne catch (ChannelFailureException cfe) { exceptionHappened = true; - Assert.True((cfe.InnerException) is NotSupportedException); + await Assert.That((cfe.InnerException) is NotSupportedException).IsTrue(); } - Assert.True(exceptionHappened); + await Assert.That(exceptionHappened).IsTrue(); } - [Fact] public void Dispose() { _sender.Dispose(); _badReceiver.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_operation_interrupted_exception_when_connecting.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_operation_interrupted_exception_when_connecting.cs index 35e977b297..65fc1d1a28 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_operation_interrupted_exception_when_connecting.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_operation_interrupted_exception_when_connecting.cs @@ -26,12 +26,10 @@ THE SOFTWARE. */ using Paramore.Brighter.MessagingGateway.RMQ.Async; using Paramore.Brighter.RMQ.Async.Tests.TestDoubles; using RabbitMQ.Client.Exceptions; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageConsumerOperationInterruptedTests : IDisposable { private readonly IAmAMessageProducerSync _sender; @@ -59,8 +57,8 @@ public RmqMessageConsumerOperationInterruptedTests() _sender.Send(sentMessage); } - [Fact] - public void When_a_message_consumer_throws_an_operation_interrupted_exception_when_connecting() + [Test] + public async Task When_a_message_consumer_throws_an_operation_interrupted_exception_when_connecting() { bool exceptionHappened = false; try @@ -70,10 +68,10 @@ public void When_a_message_consumer_throws_an_operation_interrupted_exception_w catch (ChannelFailureException cfe) { exceptionHappened = true; - Assert.True((cfe.InnerException) is OperationInterruptedException); + await Assert.That((cfe.InnerException) is OperationInterruptedException).IsTrue(); } - Assert.True(exceptionHappened); + await Assert.That(exceptionHappened).IsTrue(); } public void Dispose() @@ -82,3 +80,4 @@ public void Dispose() _receiver.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_binding_a_channel_to_multiple_topics.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_binding_a_channel_to_multiple_topics.cs index 9021d7d0cc..c9014016bf 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_binding_a_channel_to_multiple_topics.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_binding_a_channel_to_multiple_topics.cs @@ -1,51 +1,56 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageConsumerMultipleTopicTests : IDisposable { - private readonly IAmAMessageProducerSync _messageProducer; - private readonly IAmAMessageConsumerSync _messageConsumer; - private readonly Message _messageTopic1, _messageTopic2; + private IAmAMessageProducerSync _messageProducer; + private IAmAMessageConsumerSync _messageConsumer; + private Message _messageTopic1, _messageTopic2; + private RmqMessagingGatewayConnection _rmqConnection; + private RoutingKeys _topics; + private ChannelName _queueName; public RmqMessageConsumerMultipleTopicTests() { var routingKeyOne = new RoutingKey(Guid.NewGuid().ToString()); var routingKeyTwo = new RoutingKey(Guid.NewGuid().ToString()); - + _messageTopic1 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), routingKeyOne, MessageType.MT_COMMAND), + new MessageHeader(Guid.NewGuid().ToString(), routingKeyOne, MessageType.MT_COMMAND), new MessageBody("test content for topic test 1")); _messageTopic2 = new Message( - new MessageHeader(Guid.NewGuid().ToString(), routingKeyTwo, MessageType.MT_COMMAND), + new MessageHeader(Guid.NewGuid().ToString(), routingKeyTwo, MessageType.MT_COMMAND), new MessageBody("test content for topic test 2")); - var rmqConnection = new RmqMessagingGatewayConnection + _rmqConnection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://guest:guest@localhost:5672/%2f")), Exchange = new Exchange("paramore.brighter.exchange") }; - var topics = new RoutingKeys([ - routingKeyOne, + _topics = new RoutingKeys([ + routingKeyOne, routingKeyTwo ]); - var queueName = new ChannelName(Guid.NewGuid().ToString()); + _queueName = new ChannelName(Guid.NewGuid().ToString()); - _messageProducer = new RmqMessageProducer(rmqConnection); - _messageConsumer = new RmqMessageConsumer(rmqConnection, queueName , topics, false, false); + _messageProducer = new RmqMessageProducer(_rmqConnection); + _messageConsumer = new RmqMessageConsumer(_rmqConnection, _queueName , _topics, false, false); + } - new QueueFactory(rmqConnection, queueName, topics).CreateAsync().GetAwaiter().GetResult(); + [Before(Test)] + public async Task Setup() + { + await new QueueFactory(_rmqConnection, _queueName, _topics).CreateAsync(); } - [Fact] - public void When_reading_a_message_from_a_channel_with_multiple_topics() + [Test] + public async Task When_reading_a_message_from_a_channel_with_multiple_topics() { _messageProducer.Send(_messageTopic1); _messageProducer.Send(_messageTopic2); @@ -58,11 +63,11 @@ public void When_reading_a_message_from_a_channel_with_multiple_topics() var topic2Result = _messageConsumer.Receive(TimeSpan.FromMilliseconds(10000)).First(); _messageConsumer.Acknowledge(topic2Result); - Assert.Equal(_messageTopic1.Header.Topic, topic1Result.Header.Topic); - Assert.Equivalent(_messageTopic1.Body.Value, topic1Result.Body.Value); + await Assert.That(topic1Result.Header.Topic).IsEqualTo(_messageTopic1.Header.Topic); + await Assert.That(topic1Result.Body.Value).IsEquivalentTo(_messageTopic1.Body.Value); - Assert.Equal(_messageTopic2.Header.Topic, topic2Result.Header.Topic); - Assert.Equivalent(_messageTopic2.Body.Value, topic2Result.Body.Value); + await Assert.That(topic2Result.Header.Topic).IsEqualTo(_messageTopic2.Header.Topic); + await Assert.That(topic2Result.Body.Value).IsEquivalentTo(_messageTopic2.Body.Value); } public void Dispose() @@ -70,3 +75,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_confirming_multiple_messages_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_confirming_multiple_messages_via_the_messaging_gateway.cs index 6c3550cf78..dbfb40f030 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_confirming_multiple_messages_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_confirming_multiple_messages_via_the_messaging_gateway.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,12 +27,10 @@ THE SOFTWARE. */ using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageProducerConfirmationsMultipleMessagesTests : IDisposable { private readonly RmqMessageProducer _messageProducer; @@ -66,7 +64,7 @@ public RmqMessageProducerConfirmationsMultipleMessagesTests() .GetResult(); } - [Fact] + [Test] public async Task When_confirming_multiple_messages_via_the_messaging_gateway() { // Subscribe to the OnMessagePublished event @@ -78,14 +76,14 @@ public async Task When_confirming_multiple_messages_via_the_messaging_gateway() // Send all messages for (int i = 0; i < _messages.Count; i++) { - _messageProducer.Send(_messages[i]); + await _messageProducer.SendAsync(_messages[i]); } // Wait for confirmations await Task.Delay(1000); // Verify that OnMessagePublished was called for all messages - Assert.Equal(_numberOfMessages, _totalPublished); + await Assert.That(_totalPublished).IsEqualTo(_numberOfMessages); } public void Dispose() @@ -93,3 +91,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_confirming_posting_a_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_confirming_posting_a_message_via_the_messaging_gateway.cs index 5aeeddd37f..61f1e6a2ab 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_confirming_posting_a_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_confirming_posting_a_message_via_the_messaging_gateway.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -25,12 +25,10 @@ THE SOFTWARE. */ using System; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageProducerConfirmationsSendMessageTests : IDisposable { private readonly RmqMessageProducer _messageProducer; @@ -56,7 +54,7 @@ public RmqMessageProducerConfirmationsSendMessageTests () { if (success) { - Assert.Equal(_message.Id, guid); + if (guid != _message.Id) throw new Exception($"Expected guid {_message.Id} but got {guid}"); _messageWasPublished = true; _messageWasNotPublished = false; } @@ -73,17 +71,17 @@ public RmqMessageProducerConfirmationsSendMessageTests () .GetResult(); } - [Fact] + [Test] public async Task When_confirming_posting_a_message_via_the_messaging_gateway() { - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(500); //if this is true, then possible test failed because of timeout or RMQ issues - Assert.False(_messageWasNotPublished); + await Assert.That(_messageWasNotPublished).IsFalse(); //did we see the message - intent to test logic here - Assert.True(_messageWasPublished); + await Assert.That(_messageWasPublished).IsTrue(); } public void Dispose() @@ -91,3 +89,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_infrastructure_exists_can_assert.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_infrastructure_exists_can_assert.cs index b0ded5ad20..6542a10b05 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_infrastructure_exists_can_assert.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_infrastructure_exists_can_assert.cs @@ -1,10 +1,7 @@ -using System; +using System; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; - -[Collection("RMQ")] public class RmqAssumeExistingInfrastructureTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -42,8 +39,8 @@ public RmqAssumeExistingInfrastructureTests() .GetResult() ; } - [Fact] - public void When_infrastructure_exists_can_assume_producer() + [Test] + public async Task When_infrastructure_exists_can_assume_producer() { var exceptionThrown = false; try @@ -57,7 +54,7 @@ public void When_infrastructure_exists_can_assume_producer() exceptionThrown = true; } - Assert.False(exceptionThrown); + await Assert.That(exceptionThrown).IsFalse(); } public void Dispose() @@ -66,3 +63,4 @@ public void Dispose() _messageConsumer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_infrastructure_exists_can_validate.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_infrastructure_exists_can_validate.cs index 64ee624cd0..d6c9c20e6d 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_infrastructure_exists_can_validate.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_infrastructure_exists_can_validate.cs @@ -1,10 +1,7 @@ -using System; +using System; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; - -[Collection("RMQ")] public class RmqValidateExistingInfrastructureTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -42,8 +39,8 @@ public RmqValidateExistingInfrastructureTests() .GetResult(); } - [Fact] - public void When_infrastructure_exists_can_validate_producer() + [Test] + public async Task When_infrastructure_exists_can_validate_producer() { var exceptionThrown = false; try @@ -57,7 +54,7 @@ public void When_infrastructure_exists_can_validate_producer() exceptionThrown = true; } - Assert.False(exceptionThrown); + await Assert.That(exceptionThrown).IsFalse(); } public void Dispose() @@ -66,3 +63,4 @@ public void Dispose() _messageConsumer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_multiple_threads_try_to_post_a_message_at_the_same_time.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_multiple_threads_try_to_post_a_message_at_the_same_time.cs index 74ea084d35..949cc6d69f 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_multiple_threads_try_to_post_a_message_at_the_same_time.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_multiple_threads_try_to_post_a_message_at_the_same_time.cs @@ -2,12 +2,10 @@ using System.Linq; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageProducerSupportsMultipleThreadsTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -29,8 +27,8 @@ public RmqMessageProducerSupportsMultipleThreadsTests() _messageProducer = new RmqMessageProducer(rmqConnection); } - [Fact] - public void When_multiple_threads_try_to_post_a_message_at_the_same_time() + [Test] + public async Task When_multiple_threads_try_to_post_a_message_at_the_same_time() { bool exceptionHappened = false; try @@ -46,7 +44,7 @@ public void When_multiple_threads_try_to_post_a_message_at_the_same_time() } //_should_not_throw - Assert.False(exceptionHappened); + await Assert.That(exceptionHappened).IsFalse(); } public void Dispose() @@ -54,3 +52,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_posting_a_message_but_no_broker_created.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_posting_a_message_but_no_broker_created.cs index f9505e9be1..e0dce749bb 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_posting_a_message_but_no_broker_created.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_posting_a_message_but_no_broker_created.cs @@ -1,10 +1,7 @@ -using System; +using System; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; - -[Collection("RMQ")] public class RmqBrokerNotPreCreatedTests : IDisposable { private Message _message; @@ -27,10 +24,10 @@ public RmqBrokerNotPreCreatedTests() } - [Fact] - public void When_posting_a_message_but_no_broker_created() + [Test] + public async Task When_posting_a_message_but_no_broker_created() { - Assert.Throws(() => _messageProducer.Send(_message)); + await Assert.That(() => _messageProducer.Send(_message)).ThrowsExactly(); } public void Dispose() @@ -38,3 +35,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_posting_a_message_to_persist_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_posting_a_message_to_persist_via_the_messaging_gateway.cs index a067c4016c..344ce9cc2e 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_posting_a_message_to_persist_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_posting_a_message_to_persist_via_the_messaging_gateway.cs @@ -1,12 +1,10 @@ -using System; +using System; using System.Linq; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageProducerSendPersistentMessageTests : IDisposable { private IAmAMessageProducerSync _messageProducer; @@ -38,8 +36,8 @@ public RmqMessageProducerSendPersistentMessageTests() .GetResult(); } - [Fact] - public void When_posting_a_message_to_persist_via_the_messaging_gateway() + [Test] + public async Task When_posting_a_message_to_persist_via_the_messaging_gateway() { // arrange _messageProducer.Send(_message); @@ -48,7 +46,7 @@ public void When_posting_a_message_to_persist_via_the_messaging_gateway() var result = _messageConsumer.Receive(TimeSpan.FromMilliseconds(1000)).First(); // assert - Assert.Equal(true, result.Persist); + await Assert.That(result.Persist).IsEqualTo(true); } public void Dispose() @@ -56,3 +54,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_posting_a_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_posting_a_message_via_the_messaging_gateway.cs index 9ec7a4fc37..c7f3ccfd4b 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_posting_a_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_posting_a_message_via_the_messaging_gateway.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -28,12 +28,10 @@ THE SOFTWARE. */ using Paramore.Brighter.Extensions; using Paramore.Brighter.MessagingGateway.RMQ.Async; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageProducerSendMessageTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -97,33 +95,33 @@ public RmqMessageProducerSendMessageTests() .GetResult(); } - [Fact] - public void When_posting_a_message_via_the_messaging_gateway() + [Test] + public async Task When_posting_a_message_via_the_messaging_gateway() { _messageProducer.Send(_message); var result = _messageConsumer.Receive(TimeSpan.FromMilliseconds(10000)).First(); // Assert message body - Assert.Equal(_message.Body.Value, result.Body.Value); + await Assert.That(result.Body.Value).IsEqualTo(_message.Body.Value); // Assert header values - Assert.Equal(_message.Header.MessageId, result.Header.MessageId); - Assert.Equal(_message.Header.Topic, result.Header.Topic); - Assert.Equal(_message.Header.MessageType, result.Header.MessageType); - Assert.Equal(_message.Header.Source, result.Header.Source); - Assert.Equal(_message.Header.Type, result.Header.Type); - Assert.Equal(_message.Header.TimeStamp, result.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(_message.Header.CorrelationId, result.Header.CorrelationId); - Assert.Equal(_message.Header.ReplyTo, result.Header.ReplyTo); - Assert.Equal(_message.Header.ContentType, result.Header.ContentType); - Assert.Equal(_message.Header.HandledCount, result.Header.HandledCount); - Assert.Equal(_message.Header.DataSchema, result.Header.DataSchema); - Assert.Equal(_message.Header.Subject, result.Header.Subject); - Assert.Equal(TimeSpan.Zero, result.Header.Delayed); //we clear any delay from the producer, as it represents delay in the pipeline - Assert.Equal(_message.Header.TraceParent, result.Header.TraceParent); - Assert.Equal(_message.Header.TraceState, result.Header.TraceState); - Assert.Equal(_message.Header.Baggage, result.Header.Baggage); + await Assert.That(result.Header.MessageId).IsEqualTo(_message.Header.MessageId); + await Assert.That(result.Header.Topic).IsEqualTo(_message.Header.Topic); + await Assert.That(result.Header.MessageType).IsEqualTo(_message.Header.MessageType); + await Assert.That(result.Header.Source).IsEqualTo(_message.Header.Source); + await Assert.That(result.Header.Type).IsEqualTo(_message.Header.Type); + await Assert.That(result.Header.TimeStamp).IsEqualTo(_message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(result.Header.CorrelationId).IsEqualTo(_message.Header.CorrelationId); + await Assert.That(result.Header.ReplyTo).IsEqualTo(_message.Header.ReplyTo); + await Assert.That(result.Header.ContentType).IsEqualTo(_message.Header.ContentType); + await Assert.That(result.Header.HandledCount).IsEqualTo(_message.Header.HandledCount); + await Assert.That(result.Header.DataSchema).IsEqualTo(_message.Header.DataSchema); + await Assert.That(result.Header.Subject).IsEqualTo(_message.Header.Subject); + await Assert.That(result.Header.Delayed).IsEqualTo(TimeSpan.Zero); //we clear any delay from the producer, as it represents delay in the pipeline + await Assert.That(result.Header.TraceParent).IsEqualTo(_message.Header.TraceParent); + await Assert.That(result.Header.TraceState).IsEqualTo(_message.Header.TraceState); + await Assert.That(result.Header.Baggage).IsEqualTo(_message.Header.Baggage); } public void Dispose() @@ -131,3 +129,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_posting_a_message_via_the_messaging_gateway_quorum.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_posting_a_message_via_the_messaging_gateway_quorum.cs index 414d4d2653..a34a36c130 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_posting_a_message_via_the_messaging_gateway_quorum.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_posting_a_message_via_the_messaging_gateway_quorum.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2024 Ian Cooper @@ -29,12 +29,10 @@ THE SOFTWARE. */ using Paramore.Brighter.Extensions; using Paramore.Brighter.MessagingGateway.RMQ.Async; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageProducerSendMessageQuorumTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -99,8 +97,8 @@ public RmqMessageProducerSendMessageQuorumTests() } - [Fact] - public void When_posting_a_message_via_the_messaging_gateway_with_quorum_queue() + [Test] + public async Task When_posting_a_message_via_the_messaging_gateway_with_quorum_queue() { //we need to do this to create the queue _messageConsumer.Receive(TimeSpan.FromMilliseconds(100)); @@ -109,30 +107,30 @@ public void When_posting_a_message_via_the_messaging_gateway_with_quorum_queue() _messageProducer.Send(_message); // Give quorum queue a moment to become consistent across replicas - Task.Delay(TimeSpan.FromMilliseconds(500)).Wait(); + await Task.Delay(TimeSpan.FromMilliseconds(500)); var result = _messageConsumer.Receive(TimeSpan.FromMilliseconds(10000)).First(); // Assert message body - Assert.Equal(_message.Body.Value, result.Body.Value); + await Assert.That(result.Body.Value).IsEqualTo(_message.Body.Value); // Assert header values - Assert.Equal(_message.Header.MessageId, result.Header.MessageId); - Assert.Equal(_message.Header.Topic, result.Header.Topic); - Assert.Equal(_message.Header.MessageType, result.Header.MessageType); - Assert.Equal(_message.Header.Source, result.Header.Source); - Assert.Equal(_message.Header.Type, result.Header.Type); - Assert.Equal(_message.Header.TimeStamp, result.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(_message.Header.CorrelationId, result.Header.CorrelationId); - Assert.Equal(_message.Header.ReplyTo, result.Header.ReplyTo); - Assert.Equal(_message.Header.ContentType, result.Header.ContentType); - Assert.Equal(_message.Header.HandledCount, result.Header.HandledCount); - Assert.Equal(_message.Header.DataSchema, result.Header.DataSchema); - Assert.Equal(_message.Header.Subject, result.Header.Subject); - Assert.Equal(TimeSpan.Zero, result.Header.Delayed); //we clear any delay from the producer, as it represents delay in the pipeline - Assert.Equal(_message.Header.TraceParent, result.Header.TraceParent); - Assert.Equal(_message.Header.TraceState, result.Header.TraceState); - Assert.Equal(_message.Header.Baggage, result.Header.Baggage); + await Assert.That(result.Header.MessageId).IsEqualTo(_message.Header.MessageId); + await Assert.That(result.Header.Topic).IsEqualTo(_message.Header.Topic); + await Assert.That(result.Header.MessageType).IsEqualTo(_message.Header.MessageType); + await Assert.That(result.Header.Source).IsEqualTo(_message.Header.Source); + await Assert.That(result.Header.Type).IsEqualTo(_message.Header.Type); + await Assert.That(result.Header.TimeStamp).IsEqualTo(_message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(result.Header.CorrelationId).IsEqualTo(_message.Header.CorrelationId); + await Assert.That(result.Header.ReplyTo).IsEqualTo(_message.Header.ReplyTo); + await Assert.That(result.Header.ContentType).IsEqualTo(_message.Header.ContentType); + await Assert.That(result.Header.HandledCount).IsEqualTo(_message.Header.HandledCount); + await Assert.That(result.Header.DataSchema).IsEqualTo(_message.Header.DataSchema); + await Assert.That(result.Header.Subject).IsEqualTo(_message.Header.Subject); + await Assert.That(result.Header.Delayed).IsEqualTo(TimeSpan.Zero); //we clear any delay from the producer, as it represents delay in the pipeline + await Assert.That(result.Header.TraceParent).IsEqualTo(_message.Header.TraceParent); + await Assert.That(result.Header.TraceState).IsEqualTo(_message.Header.TraceState); + await Assert.That(result.Header.Baggage).IsEqualTo(_message.Header.Baggage); } public void Dispose() @@ -141,3 +139,4 @@ public void Dispose() _messageConsumer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_queue_length_causes_a_message_to_be_rejected.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_queue_length_causes_a_message_to_be_rejected.cs index 634d1a2911..bdf0bccc8e 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_queue_length_causes_a_message_to_be_rejected.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_queue_length_causes_a_message_to_be_rejected.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -25,12 +25,10 @@ THE SOFTWARE. */ using System; using System.Linq; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageProducerQueueLengthTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -73,8 +71,8 @@ public RmqMessageProducerQueueLengthTests() ); } - [Fact] - public void When_rejecting_a_message_due_to_queue_length() + [Test] + public async Task When_rejecting_a_message_due_to_queue_length() { //create the infrastructure _messageConsumer.Receive(TimeSpan.Zero); @@ -92,7 +90,7 @@ public void When_rejecting_a_message_due_to_queue_length() //try to grab the next message var nextMessages = _messageConsumer.Receive(TimeSpan.FromMilliseconds(5000)); message = nextMessages.First(); - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } @@ -101,3 +99,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_reading_a_delayed_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_reading_a_delayed_message_via_the_messaging_gateway.cs index b9f7462f24..04fdd3815c 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_reading_a_delayed_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_reading_a_delayed_message_via_the_messaging_gateway.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -26,12 +26,10 @@ THE SOFTWARE. */ using System.Linq; using System.Net.Mime; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageProducerDelayedMessageTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -64,39 +62,39 @@ public RmqMessageProducerDelayedMessageTests() .GetResult(); } - [Fact] - public void When_reading_a_delayed_message_via_the_messaging_gateway() + [Test] + public async Task When_reading_a_delayed_message_via_the_messaging_gateway() { _messageProducer.SendWithDelay(_message, TimeSpan.FromMilliseconds(3000)); var immediateResult = _messageConsumer.Receive(TimeSpan.Zero).First(); var deliveredWithoutWait = immediateResult.Header.MessageType == MessageType.MT_NONE; - Assert.Equal(0, immediateResult.Header.HandledCount); - Assert.Equal(TimeSpan.Zero, immediateResult.Header.Delayed); + await Assert.That(immediateResult.Header.HandledCount).IsEqualTo(0); + await Assert.That(immediateResult.Header.Delayed).IsEqualTo(TimeSpan.Zero); //_should_have_not_been_able_get_message_before_delay - Assert.True(deliveredWithoutWait); + await Assert.That(deliveredWithoutWait).IsTrue(); var delayedResult = _messageConsumer.Receive(TimeSpan.FromMilliseconds(10000)).First(); //_should_send_a_message_via_rmq_with_the_matching_body - Assert.Equal(_message.Body.Value, delayedResult.Body.Value); - Assert.Equal(MessageType.MT_COMMAND, delayedResult.Header.MessageType); - Assert.Equal(0, delayedResult.Header.HandledCount); - Assert.Equal(TimeSpan.FromMilliseconds(3000), delayedResult.Header.Delayed); + await Assert.That(delayedResult.Body.Value).IsEqualTo(_message.Body.Value); + await Assert.That(delayedResult.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(delayedResult.Header.HandledCount).IsEqualTo(0); + await Assert.That(delayedResult.Header.Delayed).IsEqualTo(TimeSpan.FromMilliseconds(3000)); _messageConsumer.Acknowledge(delayedResult); } - [Fact] - public void When_requeing_a_failed_message_with_delay() + [Test] + public async Task When_requeing_a_failed_message_with_delay() { //send & receive a message _messageProducer.Send(_message); var message = _messageConsumer.Receive(TimeSpan.FromMilliseconds(1000)).Single(); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(TimeSpan.FromMilliseconds(0), message.Header.Delayed); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.FromMilliseconds(0)); _messageConsumer.Acknowledge(message); @@ -106,8 +104,8 @@ public void When_requeing_a_failed_message_with_delay() //receive and assert var message2 = _messageConsumer.Receive(TimeSpan.FromMilliseconds(5000)).Single(); - Assert.Equal(MessageType.MT_COMMAND, message2.Header.MessageType); - Assert.Equal(1, message2.Header.HandledCount); + await Assert.That(message2.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(message2.Header.HandledCount).IsEqualTo(1); _messageConsumer.Acknowledge(message2); } @@ -118,3 +116,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_rejecting_a_message_to_a_dead_letter_queue.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_rejecting_a_message_to_a_dead_letter_queue.cs index 2970615863..5a49bc7235 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_rejecting_a_message_to_a_dead_letter_queue.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_rejecting_a_message_to_a_dead_letter_queue.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -25,12 +25,10 @@ THE SOFTWARE. */ using System; using System.Linq; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageProducerDLQTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -80,9 +78,9 @@ public RmqMessageProducerDLQTests() ); } - [Fact(Skip = "Breaks due to fault in Task Scheduler running after context has closed")] - //[Fact] - public void When_rejecting_a_message_to_a_dead_letter_queue() + [Test, Skip("Breaks due to fault in Task Scheduler running after context has closed")] + //[Test] + public async Task When_rejecting_a_message_to_a_dead_letter_queue() { //create the infrastructure _messageConsumer.Receive(TimeSpan.FromMilliseconds(0)); @@ -97,8 +95,8 @@ public void When_rejecting_a_message_to_a_dead_letter_queue() var dlqMessage = _deadLetterConsumer.Receive(TimeSpan.FromMilliseconds(10000)).First(); //assert this is our message - Assert.Equal(_message.Id, dlqMessage.Id); - Assert.Equal(dlqMessage.Body.Value, message.Body.Value); + await Assert.That(dlqMessage.Id).IsEqualTo(_message.Id); + await Assert.That(message.Body.Value).IsEqualTo(dlqMessage.Body.Value); } public void Dispose() @@ -106,3 +104,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_requeuing_a_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_requeuing_a_message_via_the_messaging_gateway.cs index e27a48b569..88a455401a 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_requeuing_a_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_requeuing_a_message_via_the_messaging_gateway.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -28,12 +28,10 @@ THE SOFTWARE. */ using Paramore.Brighter.MessagingGateway.RMQ.Async; using Paramore.Brighter.Observability; using Paramore.Brighter.RMQ.Async.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageProducerRequeuingMessageTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -105,8 +103,8 @@ public RmqMessageProducerRequeuingMessageTests() .GetResult(); } - [Fact] - public void When_posting_a_message_via_the_messaging_gateway() + [Test] + public async Task When_posting_a_message_via_the_messaging_gateway() { _messageProducer.Send(_message); @@ -116,25 +114,25 @@ public void When_posting_a_message_via_the_messaging_gateway() result = _channel.Receive(TimeSpan.FromMilliseconds(10000)); // Assert message body - Assert.Equal(_message.Body.Value, result.Body.Value); + await Assert.That(result.Body.Value).IsEqualTo(_message.Body.Value); // Assert header values - Assert.Equal(_message.Header.MessageId.ToString(), result.Header.Bag[HeaderNames.ORIGINAL_MESSAGE_ID]); - Assert.Equal(_message.Header.Topic, result.Header.Topic); - Assert.Equal(_message.Header.MessageType, result.Header.MessageType); - Assert.Equal(_message.Header.Source, result.Header.Source); - Assert.Equal(_message.Header.Type, result.Header.Type); - Assert.Equal(_message.Header.TimeStamp, result.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(_message.Header.CorrelationId, result.Header.CorrelationId); - Assert.Equal(_message.Header.ReplyTo, result.Header.ReplyTo); - Assert.Equal(_message.Header.ContentType, result.Header.ContentType); - Assert.Equal(_message.Header.HandledCount, result.Header.HandledCount); - Assert.Equal(_message.Header.DataSchema, result.Header.DataSchema); - Assert.Equal(_message.Header.Subject, result.Header.Subject); - Assert.Equal(TimeSpan.Zero, result.Header.Delayed); //we clear any delay from the producer, as it represents delay in the pipeline - Assert.Equal(_message.Header.TraceParent, result.Header.TraceParent); - Assert.Equal(_message.Header.TraceState, result.Header.TraceState); - Assert.Equal(_message.Header.Baggage, result.Header.Baggage); + await Assert.That(result.Header.Bag[HeaderNames.ORIGINAL_MESSAGE_ID]).IsEqualTo(_message.Header.MessageId.ToString()); + await Assert.That(result.Header.Topic).IsEqualTo(_message.Header.Topic); + await Assert.That(result.Header.MessageType).IsEqualTo(_message.Header.MessageType); + await Assert.That(result.Header.Source).IsEqualTo(_message.Header.Source); + await Assert.That(result.Header.Type).IsEqualTo(_message.Header.Type); + await Assert.That(result.Header.TimeStamp).IsEqualTo(_message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(result.Header.CorrelationId).IsEqualTo(_message.Header.CorrelationId); + await Assert.That(result.Header.ReplyTo).IsEqualTo(_message.Header.ReplyTo); + await Assert.That(result.Header.ContentType).IsEqualTo(_message.Header.ContentType); + await Assert.That(result.Header.HandledCount).IsEqualTo(_message.Header.HandledCount); + await Assert.That(result.Header.DataSchema).IsEqualTo(_message.Header.DataSchema); + await Assert.That(result.Header.Subject).IsEqualTo(_message.Header.Subject); + await Assert.That(result.Header.Delayed).IsEqualTo(TimeSpan.Zero); //we clear any delay from the producer, as it represents delay in the pipeline + await Assert.That(result.Header.TraceParent).IsEqualTo(_message.Header.TraceParent); + await Assert.That(result.Header.TraceState).IsEqualTo(_message.Header.TraceState); + await Assert.That(result.Header.Baggage).IsEqualTo(_message.Header.Baggage); } public void Dispose() @@ -143,3 +141,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_resetting_a_connection_that_does_not_exist.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_resetting_a_connection_that_does_not_exist.cs index 3c49f1442b..7c833718c7 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_resetting_a_connection_that_does_not_exist.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_resetting_a_connection_that_does_not_exist.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -26,17 +26,15 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; using RabbitMQ.Client; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageGatewayConnectionPoolResetConnectionDoesNotExist { private readonly RmqMessageGatewayConnectionPool _connectionPool = new("MyConnectionName", 7); - [Fact] + [Test] public async Task When_resetting_a_connection_that_does_not_exist() { var connectionFactory = new ConnectionFactory {HostName = "invalidhost"}; @@ -51,7 +49,8 @@ public async Task When_resetting_a_connection_that_does_not_exist() resetConnectionExceptionThrown = true; } - Assert.False(resetConnectionExceptionThrown); + await Assert.That(resetConnectionExceptionThrown).IsFalse(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_retry_limits_force_a_message_onto_the_DLQ.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_retry_limits_force_a_message_onto_the_DLQ.cs index 3646119c5e..1794d6801a 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_retry_limits_force_a_message_onto_the_DLQ.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_retry_limits_force_a_message_onto_the_DLQ.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Net.Mime; @@ -10,12 +10,10 @@ using Paramore.Brighter.RMQ.Async.Tests.TestDoubles; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RMQMessageConsumerRetryDLQTests : IDisposable { private readonly IAmAMessagePump _messagePump; @@ -117,8 +115,7 @@ public RMQMessageConsumerRetryDLQTests() ); } - [Fact(Skip = "Breaks due to fault in Task Scheduler running after context has closed")] - [SuppressMessage("Usage", "xUnit1031:Do not use blocking task operations in test method")] + [Test, Skip("Breaks due to fault in Task Scheduler running after context has closed")] public async Task When_retry_limits_force_a_message_onto_the_dlq() { //NOTE: This test is **slow** because it needs to ensure infrastructure and then wait whilst we requeue a message a number of times, @@ -129,7 +126,7 @@ public async Task When_retry_limits_force_a_message_onto_the_dlq() await Task.Delay(20000); //put something on an SNS topic, which will be delivered to our SQS queue - _sender.Send(_message); + await _sender.SendAsync(_message); //Let the message be handled and deferred until it reaches the DLQ await Task.Delay(20000); @@ -144,12 +141,12 @@ public async Task When_retry_limits_force_a_message_onto_the_dlq() await Task.Delay(5000); //inspect the dlq - var dlqMessage = _deadLetterConsumer.Receive(new TimeSpan(10000)).First(); + var dlqMessage = (await _deadLetterConsumer.ReceiveAsync(new TimeSpan(10000))).First(); //assert this is our message - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); - _deadLetterConsumer.Acknowledge(dlqMessage); + await _deadLetterConsumer.AcknowledgeAsync(dlqMessage); } @@ -160,3 +157,4 @@ public void Dispose() } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_rmq_async_consumer_requeues_without_native_delay_should_use_producer.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_rmq_async_consumer_requeues_without_native_delay_should_use_producer.cs index 33ca512e9d..7923055a83 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_rmq_async_consumer_requeues_without_native_delay_should_use_producer.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_rmq_async_consumer_requeues_without_native_delay_should_use_producer.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -26,7 +26,6 @@ THE SOFTWARE. */ using System.Diagnostics; using Paramore.Brighter.MessagingGateway.RMQ.Async; using Paramore.Brighter.RMQ.Async.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; @@ -36,8 +35,7 @@ namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor; /// with Task.Delay. This ensures the pump thread is freed immediately while the scheduler handles /// the delayed redelivery. /// -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageConsumerDelayTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -78,13 +76,13 @@ public RmqMessageConsumerDelayTests() .GetResult(); } - [Fact] - public void When_requeuing_with_delay_should_not_block_pump() + [Test] + public async Task When_requeuing_with_delay_should_not_block_pump() { // Arrange - send and receive a message _messageProducer.Send(_message); var received = _channel.Receive(TimeSpan.FromMilliseconds(10000)); - Assert.NotEqual(MessageType.MT_NONE, received.Header.MessageType); + await Assert.That(received.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); // Act - requeue with a significant delay (5 seconds) var stopwatch = Stopwatch.StartNew(); @@ -92,15 +90,14 @@ public void When_requeuing_with_delay_should_not_block_pump() stopwatch.Stop(); // Assert - requeue should return true - Assert.True(result, "Requeue should succeed"); + await Assert.That(result).IsTrue(); // Assert - requeue should complete quickly, proving Task.Delay is NOT used to block the pump - Assert.True(stopwatch.Elapsed < TimeSpan.FromSeconds(2), - $"Requeue should not block with Task.Delay; took {stopwatch.Elapsed.TotalSeconds:F1}s"); + await Assert.That(stopwatch.Elapsed < TimeSpan.FromSeconds(2)).IsTrue(); // Assert - message should be available on the queue (published via producer through exchange) var requeued = _channel.Receive(TimeSpan.FromMilliseconds(10000)); - Assert.Equal(_message.Body.Value, requeued.Body.Value); + await Assert.That(requeued.Body.Value).IsEqualTo(_message.Body.Value); } public void Dispose() @@ -109,3 +106,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_sending_a_message_should_propagate_context.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_sending_a_message_should_propagate_context.cs index c42c168004..761ccd2757 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_sending_a_message_should_propagate_context.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/Reactor/When_sending_a_message_should_propagate_context.cs @@ -7,13 +7,12 @@ using OpenTelemetry.Trace; using Paramore.Brighter.MessagingGateway.RMQ.Async; using Paramore.Brighter.Observability; -using Xunit; using Baggage = OpenTelemetry.Baggage; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway.Reactor { - [Trait("Category", "RMQ")] - [Collection("RMQ")] + [Category("RMQ")] + [NotInParallel("RMQ")] public class RmqMessageProducerPropagateContextTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -61,8 +60,8 @@ public RmqMessageProducerPropagateContextTests() }; } - [Fact] - public void When_Sending_A_Message_Should_Propagate_Context() + [Test] + public async Task When_Sending_A_Message_Should_Propagate_Context() { //arrange @@ -76,9 +75,9 @@ public void When_Sending_A_Message_Should_Propagate_Context() .SelectMany(a => a.Events) .FirstOrDefault(e => e.Name == $"{_message.Header.Topic} {CommandProcessorSpanOperation.Publish.ToSpanName()}"); - Assert.NotNull(_message.Header.TraceParent); - Assert.Equal("brighter=00f067aa0ba902b7,congo=t61rcWkgMzE", _message.Header.TraceState); - Assert.Equal("key=value,key2=value2", _message.Header.Baggage.ToString()); + await Assert.That(_message.Header.TraceParent).IsNotNull(); + await Assert.That(_message.Header.TraceState).IsEqualTo("brighter=00f067aa0ba902b7,congo=t61rcWkgMzE"); + await Assert.That(_message.Header.Baggage.ToString()).IsEqualTo("key=value,key2=value2"); } public void Dispose() diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/TestHelpers.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/TestHelpers.cs index 312720d3e4..4e98bd5bfe 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/TestHelpers.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/TestHelpers.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -28,9 +28,7 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Async; using RabbitMQ.Client; -using Xunit; -[assembly: CollectionBehavior(DisableTestParallelization = true)] namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway; internal sealed class QueueFactory(RmqMessagingGatewayConnection connection, ChannelName channelName, RoutingKeys routingKeys, bool isDurable = false, QueueType queueType = QueueType.Classic) @@ -69,3 +67,4 @@ await connection1.CreateChannelAsync(new CreateChannelOptions( } } } + diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/When_configuring_mutual_tls_connection.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/When_configuring_mutual_tls_connection.cs index 0593a2fd4a..4dae9c7d4d 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/When_configuring_mutual_tls_connection.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/When_configuring_mutual_tls_connection.cs @@ -5,14 +5,13 @@ using System.Security.Cryptography.X509Certificates; using Paramore.Brighter.MessagingGateway.RMQ.Async; using RabbitMQ.Client; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway; // These tests validate gateway configuration plumbing (ConnectionFactory.Ssl setup) and are // intentionally hand-written rather than generator-based. See ADR 0035 (Generated Tests). -[Trait("Category", "RMQ")] -[Trait("Category", "MutualTLS")] +[Category("RMQ")] +[Category("MutualTLS")] public class RmqMutualTlsConnectionConfigurationTests : IDisposable { private readonly string _tempCertPath; @@ -44,8 +43,8 @@ public void Dispose() File.Delete(_tempCertPath); } - [Fact] - public void When_certificate_is_configured_ssl_is_enabled() + [Test] + public async Task When_certificate_is_configured_ssl_is_enabled() { // Arrange var connection = new RmqMessagingGatewayConnection @@ -60,16 +59,16 @@ public void When_certificate_is_configured_ssl_is_enabled() var factory = gateway.GetConnectionFactory(); // Assert - SSL should be enabled - Assert.NotNull(factory.Ssl); - Assert.True(factory.Ssl.Enabled); - Assert.Equal("localhost", factory.Ssl.ServerName); - Assert.NotNull(factory.Ssl.Certs); - Assert.Single(factory.Ssl.Certs); - Assert.Same(_testCertificate, factory.Ssl.Certs[0]); + await Assert.That(factory.Ssl).IsNotNull(); + await Assert.That(factory.Ssl.Enabled).IsTrue(); + await Assert.That(factory.Ssl.ServerName).IsEqualTo("localhost"); + await Assert.That(factory.Ssl.Certs).IsNotNull(); + await Assert.That(factory.Ssl.Certs!.Count).IsEqualTo(1); + await Assert.That(factory.Ssl.Certs[0]).IsSameReferenceAs(_testCertificate); } - [Fact] - public void When_no_certificate_is_configured_ssl_is_not_configured() + [Test] + public async Task When_no_certificate_is_configured_ssl_is_not_configured() { // Arrange - no certificate configured var connection = new RmqMessagingGatewayConnection @@ -83,12 +82,12 @@ public void When_no_certificate_is_configured_ssl_is_not_configured() var factory = gateway.GetConnectionFactory(); // Assert - SSL should not be enabled (backwards compatibility) - Assert.NotNull(factory.Ssl); - Assert.False(factory.Ssl.Enabled); + await Assert.That(factory.Ssl).IsNotNull(); + await Assert.That(factory.Ssl.Enabled).IsFalse(); } - [Fact] - public void When_certificate_object_and_path_both_set_object_takes_precedence() + [Test] + public async Task When_certificate_object_and_path_both_set_object_takes_precedence() { // Arrange - both certificate object and path set var connection = new RmqMessagingGatewayConnection @@ -104,12 +103,12 @@ public void When_certificate_object_and_path_both_set_object_takes_precedence() var factory = gateway.GetConnectionFactory(); // Assert - Should use the certificate object, not load from path - Assert.True(factory.Ssl.Enabled); - Assert.Same(_testCertificate, factory.Ssl.Certs[0]); + await Assert.That(factory.Ssl.Enabled).IsTrue(); + await Assert.That(factory.Ssl.Certs[0]).IsSameReferenceAs(_testCertificate); } - [Fact] - public void When_certificate_path_is_provided_certificate_is_loaded() + [Test] + public async Task When_certificate_path_is_provided_certificate_is_loaded() { // Arrange var connection = new RmqMessagingGatewayConnection @@ -125,13 +124,13 @@ public void When_certificate_path_is_provided_certificate_is_loaded() var factory = gateway.GetConnectionFactory(); // Assert - Certificate should be loaded from file - Assert.True(factory.Ssl.Enabled); - Assert.Single(factory.Ssl.Certs); - Assert.NotNull(factory.Ssl.Certs[0]); + await Assert.That(factory.Ssl.Enabled).IsTrue(); + await Assert.That(factory.Ssl.Certs!.Count).IsEqualTo(1); + await Assert.That(factory.Ssl.Certs[0]).IsNotNull(); } - [Fact] - public void When_certificate_file_does_not_exist_throws_file_not_found() + [Test] + public async Task When_certificate_file_does_not_exist_throws_file_not_found() { // Arrange var connection = new RmqMessagingGatewayConnection @@ -142,16 +141,16 @@ public void When_certificate_file_does_not_exist_throws_file_not_found() }; // Act & Assert - var ex = Assert.Throws(() => new TestableRmqMessageConsumer(connection)); - Assert.Contains("Client certificate file not found", ex.Message); + var ex = await Assert.That(() => new TestableRmqMessageConsumer(connection)).ThrowsExactly(); + await Assert.That(ex.Message).Contains("Client certificate file not found"); } - [Fact] - public void When_certificate_file_is_invalid_throws_invalid_operation() + [Test] + public async Task When_certificate_file_is_invalid_throws_invalid_operation() { // Arrange - create a temp file with invalid certificate data var invalidCertPath = Path.Combine(Path.GetTempPath(), $"invalid-cert-{Guid.NewGuid()}.pfx"); - File.WriteAllText(invalidCertPath, "not a valid certificate"); + await File.WriteAllTextAsync(invalidCertPath, "not a valid certificate"); try { @@ -163,9 +162,9 @@ public void When_certificate_file_is_invalid_throws_invalid_operation() }; // Act & Assert - var ex = Assert.Throws(() => new TestableRmqMessageConsumer(connection)); - Assert.Contains("Failed to load client certificate", ex.Message); - Assert.Contains("valid .pfx (PKCS#12) certificate", ex.Message); + var ex = await Assert.That(() => new TestableRmqMessageConsumer(connection)).ThrowsExactly(); + await Assert.That(ex.Message).Contains("Failed to load client certificate"); + await Assert.That(ex.Message).Contains("valid .pfx (PKCS#12) certificate"); } finally { @@ -174,8 +173,8 @@ public void When_certificate_file_is_invalid_throws_invalid_operation() } } - [Fact] - public void When_certificate_configuration_is_optional_backwards_compatibility_is_maintained() + [Test] + public async Task When_certificate_configuration_is_optional_backwards_compatibility_is_maintained() { // Arrange - existing code that doesn't use certificates var connection = new RmqMessagingGatewayConnection @@ -187,7 +186,7 @@ public void When_certificate_configuration_is_optional_backwards_compatibility_i // Act & Assert - Should not throw, gateway should initialize normally var gateway = new TestableRmqMessageConsumer(connection); var factory = gateway.GetConnectionFactory(); - Assert.NotNull(factory); + await Assert.That(factory).IsNotNull(); } // Test double to expose ConnectionFactory for verification diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/When_rmq_async_channel_factory_forwards_scheduler_to_consumers.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/When_rmq_async_channel_factory_forwards_scheduler_to_consumers.cs index d461ade7f6..af02eb6813 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/When_rmq_async_channel_factory_forwards_scheduler_to_consumers.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/When_rmq_async_channel_factory_forwards_scheduler_to_consumers.cs @@ -22,7 +22,6 @@ THE SOFTWARE. */ using System; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway; @@ -34,8 +33,8 @@ public class When_rmq_async_channel_factory_forwards_scheduler_to_consumers Exchange = new Exchange("test.exchange") }; - [Fact] - public void Should_forward_scheduler_to_consumer_factory() + [Test] + public async Task Should_forward_scheduler_to_consumer_factory() { // Arrange var consumerFactory = new RmqMessageConsumerFactory(_connection); @@ -46,11 +45,11 @@ public void Should_forward_scheduler_to_consumer_factory() ((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler = scheduler; // Assert — the consumer factory received the scheduler - Assert.Same(scheduler, consumerFactory.Scheduler); + await Assert.That(consumerFactory.Scheduler).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_read_scheduler_from_consumer_factory() + [Test] + public async Task Should_read_scheduler_from_consumer_factory() { // Arrange — consumer factory has a scheduler from construction var scheduler = new StubMessageScheduler(); @@ -58,7 +57,7 @@ public void Should_read_scheduler_from_consumer_factory() var channelFactory = new ChannelFactory(consumerFactory); // Assert — channel factory reads from the consumer factory - Assert.Same(scheduler, ((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler); + await Assert.That(((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler).IsSameReferenceAs(scheduler); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/When_rmq_async_channel_factory_has_scheduler_should_pass_to_consumers.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/When_rmq_async_channel_factory_has_scheduler_should_pass_to_consumers.cs index f500928f8f..1a0257d751 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/When_rmq_async_channel_factory_has_scheduler_should_pass_to_consumers.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/When_rmq_async_channel_factory_has_scheduler_should_pass_to_consumers.cs @@ -1,6 +1,5 @@ using System; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway; @@ -21,19 +20,19 @@ public class When_rmq_async_channel_factory_has_scheduler_should_pass_to_consume makeChannels: OnMissingChannel.Assume ); - [Fact] - public void Should_implement_channel_factory_with_scheduler() + [Test] + public async Task Should_implement_channel_factory_with_scheduler() { // Arrange var consumerFactory = new RmqMessageConsumerFactory(_connection); var channelFactory = new ChannelFactory(consumerFactory); // Assert - Assert.IsAssignableFrom(channelFactory); + await Assert.That(channelFactory).IsAssignableTo(); } - [Fact] - public void Should_create_sync_channel_when_scheduler_set() + [Test] + public async Task Should_create_sync_channel_when_scheduler_set() { // Arrange var scheduler = new StubMessageScheduler(); @@ -45,12 +44,12 @@ public void Should_create_sync_channel_when_scheduler_set() var channel = channelFactory.CreateSyncChannel(_subscription); // Assert - Assert.NotNull(channel); - Assert.IsType(channel); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsTypeOf(); } - [Fact] - public void Should_create_async_channel_when_scheduler_set() + [Test] + public async Task Should_create_async_channel_when_scheduler_set() { // Arrange var scheduler = new StubMessageScheduler(); @@ -59,15 +58,15 @@ public void Should_create_async_channel_when_scheduler_set() ((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler = scheduler; // Act - var channel = channelFactory.CreateAsyncChannel(_subscription); + var channel = await channelFactory.CreateAsyncChannelAsync(_subscription); // Assert - Assert.NotNull(channel); - Assert.IsType(channel); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsTypeOf(); } - [Fact] - public void Should_create_channel_without_scheduler_for_backward_compat() + [Test] + public async Task Should_create_channel_without_scheduler_for_backward_compat() { // Arrange — no scheduler set var consumerFactory = new RmqMessageConsumerFactory(_connection); @@ -77,8 +76,8 @@ public void Should_create_channel_without_scheduler_for_backward_compat() var channel = channelFactory.CreateSyncChannel(_subscription); // Assert - Assert.NotNull(channel); - Assert.IsType(channel); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsTypeOf(); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/When_rmq_async_consumer_factory_creates_consumer_should_pass_scheduler.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/When_rmq_async_consumer_factory_creates_consumer_should_pass_scheduler.cs index cf238dadd3..e41db6f788 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/When_rmq_async_consumer_factory_creates_consumer_should_pass_scheduler.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/When_rmq_async_consumer_factory_creates_consumer_should_pass_scheduler.cs @@ -22,7 +22,6 @@ THE SOFTWARE. */ using System; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway; @@ -43,8 +42,8 @@ public class When_rmq_async_consumer_factory_creates_consumer_should_pass_schedu makeChannels: OnMissingChannel.Assume ); - [Fact] - public void Should_create_sync_consumer_when_scheduler_provided() + [Test] + public async Task Should_create_sync_consumer_when_scheduler_provided() { // Arrange — factory constructed with a scheduler var scheduler = new StubMessageScheduler(); @@ -54,12 +53,12 @@ public void Should_create_sync_consumer_when_scheduler_provided() var consumer = factory.Create(_subscription); // Assert — consumer is created successfully - Assert.NotNull(consumer); - Assert.IsType(consumer); + await Assert.That(consumer).IsNotNull(); + await Assert.That(consumer).IsTypeOf(); } - [Fact] - public void Should_create_async_consumer_when_scheduler_provided() + [Test] + public async Task Should_create_async_consumer_when_scheduler_provided() { // Arrange — factory constructed with a scheduler var scheduler = new StubMessageScheduler(); @@ -69,12 +68,12 @@ public void Should_create_async_consumer_when_scheduler_provided() var consumer = factory.CreateAsync(_subscription); // Assert — consumer is created successfully - Assert.NotNull(consumer); - Assert.IsType(consumer); + await Assert.That(consumer).IsNotNull(); + await Assert.That(consumer).IsTypeOf(); } - [Fact] - public void Should_create_consumer_without_scheduler_for_backward_compat() + [Test] + public async Task Should_create_consumer_without_scheduler_for_backward_compat() { // Arrange — factory constructed without a scheduler (backward compat) var factory = new RmqMessageConsumerFactory(_connection); @@ -83,8 +82,8 @@ public void Should_create_consumer_without_scheduler_for_backward_compat() var consumer = factory.Create(_subscription); // Assert — consumer is created successfully without scheduler - Assert.NotNull(consumer); - Assert.IsType(consumer); + await Assert.That(consumer).IsNotNull(); + await Assert.That(consumer).IsTypeOf(); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/When_rmq_async_consumer_factory_scheduler_set_after_construction.cs b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/When_rmq_async_consumer_factory_scheduler_set_after_construction.cs index 9e8559e77b..1ce485add9 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/When_rmq_async_consumer_factory_scheduler_set_after_construction.cs +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/MessagingGateway/When_rmq_async_consumer_factory_scheduler_set_after_construction.cs @@ -22,7 +22,6 @@ THE SOFTWARE. */ using System; using Paramore.Brighter.MessagingGateway.RMQ.Async; -using Xunit; namespace Paramore.Brighter.RMQ.Async.Tests.MessagingGateway; @@ -34,8 +33,8 @@ public class When_rmq_async_consumer_factory_scheduler_set_after_construction Exchange = new Exchange("test.exchange") }; - [Fact] - public void Should_expose_scheduler_set_after_construction() + [Test] + public async Task Should_expose_scheduler_set_after_construction() { // Arrange — factory constructed without a scheduler var factory = new RmqMessageConsumerFactory(_connection); @@ -45,22 +44,22 @@ public void Should_expose_scheduler_set_after_construction() factory.Scheduler = scheduler; // Assert — scheduler property reflects the updated value - Assert.Same(scheduler, factory.Scheduler); + await Assert.That(factory.Scheduler).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_use_constructor_scheduler_when_property_not_set() + [Test] + public async Task Should_use_constructor_scheduler_when_property_not_set() { // Arrange — factory constructed with a scheduler via constructor var scheduler = new StubMessageScheduler(); var factory = new RmqMessageConsumerFactory(_connection, scheduler); // Assert — scheduler property reflects the constructor value - Assert.Same(scheduler, factory.Scheduler); + await Assert.That(factory.Scheduler).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_override_constructor_scheduler_with_property() + [Test] + public async Task Should_override_constructor_scheduler_with_property() { // Arrange — factory constructed with one scheduler var originalScheduler = new StubMessageScheduler(); @@ -71,8 +70,8 @@ public void Should_override_constructor_scheduler_with_property() factory.Scheduler = overrideScheduler; // Assert — property reflects the override, not the original - Assert.Same(overrideScheduler, factory.Scheduler); - Assert.NotSame(originalScheduler, factory.Scheduler); + await Assert.That(factory.Scheduler).IsSameReferenceAs(overrideScheduler); + await Assert.That(factory.Scheduler).IsNotSameReferenceAs(originalScheduler); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.RMQ.Async.Tests/Paramore.Brighter.RMQ.Async.Tests.csproj b/tests/Paramore.Brighter.RMQ.Async.Tests/Paramore.Brighter.RMQ.Async.Tests.csproj index 8b64f58205..16640eb4f8 100644 --- a/tests/Paramore.Brighter.RMQ.Async.Tests/Paramore.Brighter.RMQ.Async.Tests.csproj +++ b/tests/Paramore.Brighter.RMQ.Async.Tests/Paramore.Brighter.RMQ.Async.Tests.csproj @@ -1,33 +1,17 @@ - - - $(BrighterTestTargetFrameworks) - false - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - + + $(BrighterTestTargetFrameworks) + false + Exe + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessageDispatch/When_building_a_dispatcher.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessageDispatch/When_building_a_dispatcher.cs index b22a2d796d..fd7660b316 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessageDispatch/When_building_a_dispatcher.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessageDispatch/When_building_a_dispatcher.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -9,7 +9,6 @@ using Paramore.Brighter.ServiceActivator; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessageDispatch; @@ -70,15 +69,15 @@ public DispatchBuilderTests() .ConfigureInstrumentation(tracer, instrumentationOptions); } - [Fact] + [Test] public async Task When_Building_A_Dispatcher() { _dispatcher = _builder.Build(); - Assert.NotNull(_dispatcher); - Assert.NotNull(GetConnection("foo")); - Assert.NotNull(GetConnection("bar")); - Assert.Equal(DispatcherState.DS_AWAITING, _dispatcher.State); + await Assert.That(_dispatcher).IsNotNull(); + await Assert.That(GetConnection("foo")).IsNotNull(); + await Assert.That(GetConnection("bar")).IsNotNull(); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_AWAITING); await Task.Delay(1000); @@ -86,11 +85,11 @@ public async Task When_Building_A_Dispatcher() await Task.Delay(1000); - Assert.Equal(DispatcherState.DS_RUNNING, _dispatcher.State); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_RUNNING); await _dispatcher.End(); - Assert.Equal(DispatcherState.DS_STOPPED, _dispatcher.State); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_STOPPED); } private Subscription GetConnection(string name) { diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessageDispatch/When_building_a_dispatcher_with_named_gateway.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessageDispatch/When_building_a_dispatcher_with_named_gateway.cs index 457093deec..6fc9fbe7c7 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessageDispatch/When_building_a_dispatcher_with_named_gateway.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessageDispatch/When_building_a_dispatcher_with_named_gateway.cs @@ -1,4 +1,4 @@ -using System; +using System; using Microsoft.Extensions.DependencyInjection; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.MessagingGateway.RMQ.Sync; @@ -7,7 +7,6 @@ using Paramore.Brighter.ServiceActivator; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessageDispatch; @@ -82,11 +81,11 @@ public DispatchBuilderWithNamedGateway() .ConfigureInstrumentation(tracer, instrumentationOptions); } - [Fact] - public void When_building_a_dispatcher_with_named_gateway() + [Test] + public async Task When_building_a_dispatcher_with_named_gateway() { _dispatcher = _builder.Build(); - Assert.NotNull(_dispatcher); + await Assert.That(_dispatcher).IsNotNull(); } } diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Acceptance/When_publishing_and_receiving_with_mtls.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Acceptance/When_publishing_and_receiving_with_mtls.cs index 858881b993..4c673be72c 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Acceptance/When_publishing_and_receiving_with_mtls.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Acceptance/When_publishing_and_receiving_with_mtls.cs @@ -1,16 +1,15 @@ using System; using System.IO; using Paramore.Brighter.MessagingGateway.RMQ.Sync; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Acceptance; // Acceptance tests verify actual mTLS connections to Docker RabbitMQ // These tests run against the actual transport configured in Docker (per ADR #3946) -[Trait("Category", "RabbitMQ")] -[Trait("Category", "MutualTLS")] -[Trait("Requires", "Docker-mTLS")] -[Collection("RabbitMQ mTLS")] +[Category("RabbitMQ")] +[Category("MutualTLS")] +[Property("Requires", "Docker-mTLS")] +[NotInParallel("RabbitMQ mTLS")] public class RmqMutualTlsAcceptanceTests : IDisposable { private readonly string _clientCertPath; @@ -34,8 +33,8 @@ public void Dispose() // Cleanup if needed } - [Fact] - public void When_connecting_with_client_certificate_can_publish_message_sync() + [Test] + public async Task When_connecting_with_client_certificate_can_publish_message_sync() { // Verify certificate exists if (!File.Exists(_clientCertPath)) @@ -64,14 +63,14 @@ public void When_connecting_with_client_certificate_can_publish_message_sync() // Assert - Should NOT throw TLS handshake exception // Actual TLS handshake occurs when Send() is called - producer.Send(message); + await producer.SendAsync(message); // If we reach here, TLS handshake succeeded - Assert.True(true); + await Assert.That(true).IsTrue(); } - [Fact] - public void When_connecting_with_mtls_can_publish_and_receive_message_sync() + [Test] + public async Task When_connecting_with_mtls_can_publish_and_receive_message_sync() { // Verify certificate exists if (!File.Exists(_clientCertPath)) @@ -104,16 +103,16 @@ public void When_connecting_with_mtls_can_publish_and_receive_message_sync() new MessageHeader(Id.Random(), routingKey, MessageType.MT_EVENT), new MessageBody("Round-trip test over mTLS (sync)") ); - producer.Send(sentMessage); + await producer.SendAsync(sentMessage); // Act - Consume var receivedMessages = consumer.Receive(TimeSpan.FromSeconds(5)); // Assert - Assert.NotNull(receivedMessages); - Assert.NotEmpty(receivedMessages); + await Assert.That(receivedMessages).IsNotNull(); + await Assert.That(receivedMessages).IsNotEmpty(); var receivedMessage = receivedMessages[0]; - Assert.Equal(sentMessage.Id, receivedMessage.Id); - Assert.Equal(sentMessage.Body.Value, receivedMessage.Body.Value); + await Assert.That(receivedMessage.Id).IsEqualTo(sentMessage.Id); + await Assert.That(receivedMessage.Body.Value).IsEqualTo(sentMessage.Body.Value); } } diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Acceptance/When_publishing_with_trace_context_over_mtls.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Acceptance/When_publishing_with_trace_context_over_mtls.cs index 3af988aed2..e8a06d3744 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Acceptance/When_publishing_with_trace_context_over_mtls.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Acceptance/When_publishing_with_trace_context_over_mtls.cs @@ -10,7 +10,6 @@ using OpenTelemetry.Trace; using Paramore.Brighter.MessagingGateway.RMQ.Sync; using Paramore.Brighter.Observability; -using Xunit; using Baggage = OpenTelemetry.Baggage; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Acceptance; @@ -20,11 +19,11 @@ namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Acceptance; /// trace context survive mTLS connections, ensuring compliance with Rules #10-12 of the Critical /// Review Guidelines for RabbitMQ mutual TLS implementation. /// -[Trait("Category", "RMQ")] -[Trait("Category", "MutualTLS")] -[Trait("Category", "Observability")] -[Trait("Requires", "Docker-mTLS")] -[Collection("RabbitMQ mTLS")] +[Category("RMQ")] +[Category("MutualTLS")] +[Category("Observability")] +[Property("Requires", "Docker-mTLS")] +[NotInParallel("RabbitMQ mTLS")] public class RmqMutualTlsObservabilityTests : IDisposable { private readonly string _clientCertPath; @@ -78,8 +77,8 @@ public void Dispose() /// Test 1: Verifies that TraceParent header survives mTLS publish (sync variant). /// This test verifies Rule #10 compliance: W3C Trace Context must flow through all gateways. /// - [Fact] - public void When_publishing_with_traceparent_over_mtls_header_is_preserved_sync() + [Test] + public async Task When_publishing_with_traceparent_over_mtls_header_is_preserved_sync() { // Verify certificate exists if (!File.Exists(_clientCertPath)) @@ -116,20 +115,20 @@ public void When_publishing_with_traceparent_over_mtls_header_is_preserved_sync( try { // Act - messageProducer.Send(message); + await messageProducer.SendAsync(message); _parentActivity?.Stop(); _tracerProvider.ForceFlush(); // Assert - TraceParent must be preserved - Assert.NotNull(message.Header.TraceParent); - Assert.NotEmpty(message.Header.TraceParent.Value); + await Assert.That(message.Header.TraceParent).IsNotNull(); + await Assert.That(message.Header.TraceParent.Value).IsNotEmpty(); // Verify traceparent format (00-{trace-id}-{span-id}-{flags}) - Assert.Matches(@"^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$", message.Header.TraceParent.Value); + await Assert.That(message.Header.TraceParent.Value).Matches(@"^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$"); } finally { - messageProducer.Dispose(); + await messageProducer.DisposeAsync(); } } @@ -137,8 +136,8 @@ public void When_publishing_with_traceparent_over_mtls_header_is_preserved_sync( /// Test 2: Verifies that TraceState and Baggage survive mTLS (sync variant). /// This test verifies Rule #10 compliance: W3C Trace Context (TraceState, Baggage) must flow through all gateways. /// - [Fact] - public void When_publishing_with_tracestate_and_baggage_over_mtls_headers_are_preserved() + [Test] + public async Task When_publishing_with_tracestate_and_baggage_over_mtls_headers_are_preserved() { // Verify certificate exists if (!File.Exists(_clientCertPath)) @@ -175,30 +174,29 @@ public void When_publishing_with_tracestate_and_baggage_over_mtls_headers_are_pr try { // Act - messageProducer.Send(message); + await messageProducer.SendAsync(message); _parentActivity?.Stop(); _tracerProvider.ForceFlush(); // Assert - All W3C trace headers must be preserved - Assert.NotNull(message.Header.TraceParent); - Assert.NotNull(message.Header.TraceState); - Assert.NotNull(message.Header.Baggage); + await Assert.That(message.Header.TraceParent).IsNotNull(); + await Assert.That(message.Header.TraceState).IsNotNull(); + await Assert.That(message.Header.Baggage).IsNotNull(); // Verify TraceState contains expected values - Assert.Contains("brighter=00f067aa0ba902b7", message.Header.TraceState); - Assert.Contains("congo=t61rcWkgMzE", message.Header.TraceState); + await Assert.That(message.Header.TraceState).Contains("brighter=00f067aa0ba902b7"); + await Assert.That(message.Header.TraceState).Contains("congo=t61rcWkgMzE"); // Verify Baggage contains expected values (baggage values may be URL-encoded) var baggageString = message.Header.Baggage.ToString(); - Assert.Contains("userId=alice", baggageString); + await Assert.That(baggageString).Contains("userId=alice"); // Note: Colon in serverNode value is URL-encoded as %3A - Assert.True(baggageString.Contains("serverNode=DF:28") || baggageString.Contains("serverNode=DF%3A28"), - "Baggage should contain serverNode with value DF:28 (possibly URL-encoded)"); - Assert.Contains("isProduction=false", baggageString); + await Assert.That(baggageString.Contains("serverNode=DF:28") || baggageString.Contains("serverNode=DF%3A28")).IsTrue(); + await Assert.That(baggageString).Contains("isProduction=false"); } finally { - messageProducer.Dispose(); + await messageProducer.DisposeAsync(); } } @@ -206,8 +204,8 @@ public void When_publishing_with_tracestate_and_baggage_over_mtls_headers_are_pr /// Test 3: Verifies that BrighterTracer.WriteProducerEvent is called when publishing over mTLS (sync variant). /// This test verifies Rule #11 compliance: BrighterTracer.WriteProducerEvent must be called for all gateway producers. /// - [Fact] - public void When_publishing_with_mtls_brighter_tracer_write_producer_event_is_called() + [Test] + public async Task When_publishing_with_mtls_brighter_tracer_write_producer_event_is_called() { // Verify certificate exists if (!File.Exists(_clientCertPath)) @@ -244,7 +242,7 @@ public void When_publishing_with_mtls_brighter_tracer_write_producer_event_is_ca try { // Act - messageProducer.Send(message); + await messageProducer.SendAsync(message); _parentActivity?.Stop(); _tracerProvider.ForceFlush(); @@ -258,14 +256,13 @@ public void When_publishing_with_mtls_brighter_tracer_write_producer_event_is_ca // If producer event exists, BrighterTracer.WriteProducerEvent was called // Note: This verification depends on the tracer being properly configured // In production scenarios, this ensures observability is maintained with mTLS - Assert.True( - producerEvents.Any() || _exportedActivities.Any(), - "BrighterTracer should record producer events when publishing over mTLS" - ); + await Assert.That( + producerEvents.Any() || _exportedActivities.Any() + ).IsTrue(); } finally { - messageProducer.Dispose(); + await messageProducer.DisposeAsync(); } } @@ -273,8 +270,8 @@ public void When_publishing_with_mtls_brighter_tracer_write_producer_event_is_ca /// Test 4: Verifies that CloudEvents trace context survives serialization over mTLS (sync variant). /// This test verifies Rule #12 compliance: CloudEvents trace context must survive serialization. /// - [Fact] - public void When_publishing_cloudevents_trace_context_survives_mtls_serialization() + [Test] + public async Task When_publishing_cloudevents_trace_context_survives_mtls_serialization() { // Verify certificate exists if (!File.Exists(_clientCertPath)) @@ -312,31 +309,30 @@ public void When_publishing_cloudevents_trace_context_survives_mtls_serializatio try { // Act - Publish (serialization occurs here) - messageProducer.Send(message); + await messageProducer.SendAsync(message); _parentActivity?.Stop(); _tracerProvider.ForceFlush(); // Assert - CloudEvents trace context must survive serialization // The message should contain trace headers that were propagated from the parent activity - Assert.NotNull(message.Header.TraceParent); - Assert.NotNull(message.Header.TraceState); - Assert.NotNull(message.Header.Baggage); + await Assert.That(message.Header.TraceParent).IsNotNull(); + await Assert.That(message.Header.TraceState).IsNotNull(); + await Assert.That(message.Header.Baggage).IsNotNull(); // Verify the trace context is in a format compatible with CloudEvents // CloudEvents uses W3C Trace Context, so the format should be consistent - Assert.Matches(@"^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$", message.Header.TraceParent.Value); + await Assert.That(message.Header.TraceParent.Value).Matches(@"^00-[0-9a-f]{32}-[0-9a-f]{16}-[0-9a-f]{2}$"); // Verify the message headers contain the trace information // This ensures that message creators can extract trace from CloudEvents // and message publishers can write trace to CloudEvents format - Assert.True( - message.Header.Bag.ContainsKey("traceparent") || message.Header.TraceParent != null, - "CloudEvents trace context (traceparent) must survive serialization over mTLS" - ); + await Assert.That( + message.Header.Bag.ContainsKey("traceparent") || message.Header.TraceParent != null + ).IsTrue(); } finally { - messageProducer.Dispose(); + await messageProducer.DisposeAsync(); } } @@ -344,8 +340,8 @@ public void When_publishing_cloudevents_trace_context_survives_mtls_serializatio /// Test 5: Verifies that trace context is preserved when using certificate from file path (sync variant). /// This test ensures observability works with both certificate configuration methods. /// - [Fact] - public void When_publishing_with_certificate_from_file_path_trace_context_is_preserved() + [Test] + public async Task When_publishing_with_certificate_from_file_path_trace_context_is_preserved() { // Verify certificate exists if (!File.Exists(_clientCertPath)) @@ -382,28 +378,27 @@ public void When_publishing_with_certificate_from_file_path_trace_context_is_pre try { // Act - messageProducer.Send(message); + await messageProducer.SendAsync(message); _parentActivity?.Stop(); _tracerProvider.ForceFlush(); // Assert - Trace context must be preserved regardless of certificate configuration method - Assert.NotNull(message.Header.TraceParent); - Assert.NotNull(message.Header.TraceState); - Assert.NotNull(message.Header.Baggage); + await Assert.That(message.Header.TraceParent).IsNotNull(); + await Assert.That(message.Header.TraceState).IsNotNull(); + await Assert.That(message.Header.Baggage).IsNotNull(); // Verify TraceState - Assert.Contains("brighter=00f067aa0ba902b7", message.Header.TraceState); + await Assert.That(message.Header.TraceState).Contains("brighter=00f067aa0ba902b7"); // Verify Baggage (baggage values may be URL-encoded) var baggageString = message.Header.Baggage.ToString(); - Assert.Contains("userId=alice", baggageString); + await Assert.That(baggageString).Contains("userId=alice"); // Note: Colon in serverNode value is URL-encoded as %3A - Assert.True(baggageString.Contains("serverNode=DF:28") || baggageString.Contains("serverNode=DF%3A28"), - "Baggage should contain serverNode with value DF:28 (possibly URL-encoded)"); + await Assert.That(baggageString.Contains("serverNode=DF:28") || baggageString.Contains("serverNode=DF%3A28")).IsTrue(); } finally { - messageProducer.Dispose(); + await messageProducer.DisposeAsync(); } } } diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Acceptance/When_using_mtls_with_quorum_queues.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Acceptance/When_using_mtls_with_quorum_queues.cs index db37b7e543..2f1ded1373 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Acceptance/When_using_mtls_with_quorum_queues.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Acceptance/When_using_mtls_with_quorum_queues.cs @@ -7,7 +7,6 @@ using OpenTelemetry.Resources; using OpenTelemetry.Trace; using Paramore.Brighter.MessagingGateway.RMQ.Sync; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Acceptance; @@ -21,12 +20,12 @@ namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Acceptance; /// Rule #11: BrighterTracer.WriteProducerEvent must be called for all producers /// Rule #12: CloudEvents trace context must survive serialization /// -[Trait("Category", "RabbitMQ")] -[Trait("Category", "MutualTLS")] -[Trait("Category", "Quorum")] -[Trait("Category", "Observability")] -[Trait("Requires", "Docker-mTLS")] -[Collection("RabbitMQ mTLS")] +[Category("RabbitMQ")] +[Category("MutualTLS")] +[Category("Quorum")] +[Category("Observability")] +[Property("Requires", "Docker-mTLS")] +[NotInParallel("RabbitMQ mTLS")] public class RmqMutualTlsQuorumObservabilityTests : IDisposable { private readonly string _clientCertPath; @@ -63,8 +62,8 @@ public RmqMutualTlsQuorumObservabilityTests() .Build(); } - [Fact] - public void When_publishing_with_mtls_and_quorum_trace_context_is_preserved() + [Test] + public async Task When_publishing_with_mtls_and_quorum_trace_context_is_preserved() { // Arrange - mTLS connection var connection = new RmqMessagingGatewayConnection @@ -102,7 +101,7 @@ public void When_publishing_with_mtls_and_quorum_trace_context_is_preserved() new MessageBody("Testing trace context over mTLS + Quorum") ); - producer.Send(message); + await producer.SendAsync(message); // Stop activity and flush to exporter activity?.Stop(); @@ -112,20 +111,20 @@ public void When_publishing_with_mtls_and_quorum_trace_context_is_preserved() var receivedMessages = consumer.Receive(TimeSpan.FromSeconds(5)); // Assert - Verify message was received - Assert.NotEmpty(receivedMessages); + await Assert.That(receivedMessages).IsNotEmpty(); var receivedMessage = receivedMessages.First(); // Assert - Rule #10: TraceParent must be preserved - Assert.NotNull(receivedMessage.Header.TraceParent); - Assert.Contains(activity?.TraceId.ToString() ?? "", receivedMessage.Header.TraceParent.Value); + await Assert.That(receivedMessage.Header.TraceParent).IsNotNull(); + await Assert.That(receivedMessage.Header.TraceParent.Value).Contains(activity?.TraceId.ToString() ?? ""); // Assert - Rule #11: BrighterTracer.WriteProducerEvent was called // The presence of activities in our exporter confirms the tracer is working - Assert.NotEmpty(_exportedActivities); + await Assert.That(_exportedActivities).IsNotEmpty(); } - [Fact] - public void When_publishing_with_mtls_quorum_and_baggage_context_survives() + [Test] + public async Task When_publishing_with_mtls_quorum_and_baggage_context_survives() { // Arrange - mTLS connection var connection = new RmqMessagingGatewayConnection @@ -163,17 +162,17 @@ public void When_publishing_with_mtls_quorum_and_baggage_context_survives() new MessageBody("Testing baggage over mTLS + Quorum") ); - producer.Send(message); + await producer.SendAsync(message); var receivedMessages = consumer.Receive(TimeSpan.FromSeconds(5)); // Assert - Baggage must survive (Rule #12) - Assert.NotEmpty(receivedMessages); + await Assert.That(receivedMessages).IsNotEmpty(); var receivedMessage = receivedMessages.First(); - Assert.NotNull(receivedMessage.Header.Baggage); + await Assert.That(receivedMessage.Header.Baggage).IsNotNull(); var baggageString = receivedMessage.Header.Baggage.ToString(); - Assert.Contains("userId=alice", baggageString); - Assert.Contains("serverNode=node-42", baggageString); + await Assert.That(baggageString).Contains("userId=alice"); + await Assert.That(baggageString).Contains("serverNode=node-42"); } finally { diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/RabbitMQMtlsTestCollection.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/RabbitMQMtlsTestCollection.cs index 0de127460b..abff27914f 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/RabbitMQMtlsTestCollection.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/RabbitMQMtlsTestCollection.cs @@ -22,22 +22,7 @@ THE SOFTWARE. */ #endregion -using Xunit; -namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway; - -/// -/// This collection definition forces all RabbitMQ mTLS tests to run sequentially -/// instead of in parallel. This prevents TLS handshake race conditions that occur -/// when multiple tests rapidly create and destroy mTLS connections simultaneously. -/// -/// Without this, tests can fail with "Connection close forced" errors due to -/// "TLS server: Unexpected Message" alerts from RabbitMQ when connections are -/// opened too rapidly in parallel. -/// -[CollectionDefinition("RabbitMQ mTLS", DisableParallelization = true)] -public class RabbitMQMtlsTestCollection -{ - // This class is never instantiated. It's just a marker for xUnit to identify - // the collection and its parallelization settings. -} +// This file previously contained an xUnit [CollectionDefinition] marker class. +// In TUnit, sequential execution is handled via [NotInParallel("RabbitMQ mTLS")] +// attributes on the test classes themselves, so this marker class is no longer needed. diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_a_message_consumer_reads_multiple_messages.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_a_message_consumer_reads_multiple_messages.cs index 3635c9237f..ac1bba92bf 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_a_message_consumer_reads_multiple_messages.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_a_message_consumer_reads_multiple_messages.cs @@ -1,12 +1,10 @@ -using System; +using System; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Sync; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RMQBufferedConsumerTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -30,8 +28,8 @@ public RMQBufferedConsumerTests() new QueueFactory(rmqConnection, _channelName, new RoutingKeys(_routingKey)).Create(TimeSpan.FromMilliseconds(1000)); } - [Fact] - public void When_a_message_consumer_reads_multiple_messages() + [Test] + public async Task When_a_message_consumer_reads_multiple_messages() { //Post one more than batch size messages var messageOne = new Message(new MessageHeader(Guid.NewGuid().ToString(), _routingKey, MessageType.MT_COMMAND), new MessageBody("test content One")); @@ -50,7 +48,7 @@ public void When_a_message_consumer_reads_multiple_messages() var messages = _messageConsumer.Receive(TimeSpan.FromMilliseconds(1000)); //We should only have three messages - Assert.Equal(3, messages.Length); + await Assert.That(messages.Length).IsEqualTo(3); //ack those to remove from the queue foreach (var message in messages) @@ -65,7 +63,7 @@ public void When_a_message_consumer_reads_multiple_messages() messages = _messageConsumer.Receive(TimeSpan.FromMilliseconds(500)); //This time, just the one message - Assert.Equal(1, messages.Length); + await Assert.That(messages.Length).IsEqualTo(1); } @@ -76,3 +74,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_already_closed_exception_when_connecting.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_already_closed_exception_when_connecting.cs index 762310d890..60cb55ef62 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_already_closed_exception_when_connecting.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_already_closed_exception_when_connecting.cs @@ -2,12 +2,10 @@ using Paramore.Brighter.MessagingGateway.RMQ.Sync; using Paramore.Brighter.RMQ.Sync.Tests.TestDoubles; using RabbitMQ.Client.Exceptions; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageConsumerConnectionClosedTests : IDisposable { private readonly IAmAMessageProducerSync _sender; @@ -38,8 +36,8 @@ public RmqMessageConsumerConnectionClosedTests() } - [Fact] - public void When_a_message_consumer_throws_an_already_closed_exception_when_connecting() + [Test] + public async Task When_a_message_consumer_throws_an_already_closed_exception_when_connecting() { _sender.Send(_sentMessage); @@ -51,10 +49,10 @@ public void When_a_message_consumer_throws_an_already_closed_exception_when_conn catch (ChannelFailureException cfe) { exceptionHappened = true; - Assert.True((cfe.InnerException) is AlreadyClosedException); + await Assert.That((cfe.InnerException) is AlreadyClosedException).IsTrue(); } - Assert.True(exceptionHappened); + await Assert.That(exceptionHappened).IsTrue(); } public void Dispose() @@ -63,3 +61,4 @@ public void Dispose() _receiver.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_not_supported_exception_when_connecting.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_not_supported_exception_when_connecting.cs index 04c11d2561..7191e84231 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_not_supported_exception_when_connecting.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_not_supported_exception_when_connecting.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -25,12 +25,10 @@ THE SOFTWARE. */ using System; using Paramore.Brighter.MessagingGateway.RMQ.Sync; using Paramore.Brighter.RMQ.Sync.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageConsumerChannelFailureTests : IDisposable { private readonly IAmAMessageProducerSync _sender; @@ -58,8 +56,8 @@ public RmqMessageConsumerChannelFailureTests() _sender.Send(sentMessage); } - [Fact] - public void When_a_message_consumer_throws_an_not_supported_exception_when_connecting() + [Test] + public async Task When_a_message_consumer_throws_an_not_supported_exception_when_connecting() { bool exceptionHappened = false; try @@ -69,10 +67,10 @@ public void When_a_message_consumer_throws_an_not_supported_exception_when_conne catch (ChannelFailureException cfe) { exceptionHappened = true; - Assert.True((cfe.InnerException) is NotSupportedException); + await Assert.That((cfe.InnerException) is NotSupportedException).IsTrue(); } - Assert.True(exceptionHappened); + await Assert.That(exceptionHappened).IsTrue(); } public void Dispose() @@ -81,3 +79,4 @@ public void Dispose() _badReceiver.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_operation_interrupted_exception_when_connecting.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_operation_interrupted_exception_when_connecting.cs index 9e227c4f16..779af0762e 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_operation_interrupted_exception_when_connecting.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_an_operation_interrupted_exception_when_connecting.cs @@ -26,12 +26,10 @@ THE SOFTWARE. */ using Paramore.Brighter.MessagingGateway.RMQ.Sync; using Paramore.Brighter.RMQ.Sync.Tests.TestDoubles; using RabbitMQ.Client.Exceptions; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageConsumerOperationInterruptedTests : IDisposable { private readonly IAmAMessageProducerSync _sender; @@ -59,8 +57,8 @@ public RmqMessageConsumerOperationInterruptedTests() _sender.Send(sentMessage); } - [Fact] - public void When_a_message_consumer_throws_an_operation_interrupted_exception_when_connecting() + [Test] + public async Task When_a_message_consumer_throws_an_operation_interrupted_exception_when_connecting() { bool exceptionHappened = false; try @@ -70,10 +68,10 @@ public void When_a_message_consumer_throws_an_operation_interrupted_exception_w catch (ChannelFailureException cfe) { exceptionHappened = true; - Assert.True((cfe.InnerException) is OperationInterruptedException); + await Assert.That((cfe.InnerException) is OperationInterruptedException).IsTrue(); } - Assert.True(exceptionHappened); + await Assert.That(exceptionHappened).IsTrue(); } public void Dispose() @@ -82,3 +80,4 @@ public void Dispose() _receiver.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_binding_a_channel_to_multiple_topics.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_binding_a_channel_to_multiple_topics.cs index e548fd25f1..2457296a74 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_binding_a_channel_to_multiple_topics.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_binding_a_channel_to_multiple_topics.cs @@ -1,13 +1,11 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Sync; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageConsumerMultipleTopicTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -44,8 +42,8 @@ public RmqMessageConsumerMultipleTopicTests() new QueueFactory(rmqConnection, queueName, topics).Create(TimeSpan.FromMilliseconds(1000)); } - [Fact] - public void When_reading_a_message_from_a_channel_with_multiple_topics() + [Test] + public async Task When_reading_a_message_from_a_channel_with_multiple_topics() { _messageProducer.Send(_messageTopic1); _messageProducer.Send(_messageTopic2); @@ -60,12 +58,12 @@ public void When_reading_a_message_from_a_channel_with_multiple_topics() _messageConsumer.Acknowledge(topic2Result); // should_received_a_message_from_test1_with_same_topic_and_body - Assert.Equal(_messageTopic1.Header.Topic, topic1Result.Header.Topic); - Assert.Equivalent(_messageTopic1.Body.Value, topic1Result.Body.Value); + await Assert.That(topic1Result.Header.Topic).IsEqualTo(_messageTopic1.Header.Topic); + await Assert.That(topic1Result.Body.Value).IsEquivalentTo(_messageTopic1.Body.Value); // should_received_a_message_from_test2_with_same_topic_and_body - Assert.Equal(_messageTopic2.Header.Topic, topic2Result.Header.Topic); - Assert.Equivalent(_messageTopic2.Body.Value, topic2Result.Body.Value); + await Assert.That(topic2Result.Header.Topic).IsEqualTo(_messageTopic2.Header.Topic); + await Assert.That(topic2Result.Body.Value).IsEquivalentTo(_messageTopic2.Body.Value); } public void Dispose() @@ -73,3 +71,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_confirming_posting_a_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_confirming_posting_a_message_via_the_messaging_gateway.cs index f5b18da8d8..6ac9195c49 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_confirming_posting_a_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_confirming_posting_a_message_via_the_messaging_gateway.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -25,12 +25,10 @@ THE SOFTWARE. */ using System; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Sync; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageProducerConfirmationsSendMessageTests : IDisposable { private readonly RmqMessageProducer _messageProducer; @@ -56,7 +54,7 @@ public RmqMessageProducerConfirmationsSendMessageTests () { if (success) { - Assert.Equal(_message.Id, guid); + if (guid != _message.Id) throw new InvalidOperationException($"Expected message id {_message.Id} but got {guid}"); _messageWasPublished = true; _messageWasNotPublished = false; } @@ -71,17 +69,17 @@ public RmqMessageProducerConfirmationsSendMessageTests () .Create(TimeSpan.FromMilliseconds(1000)); } - [Fact] + [Test] public async Task When_confirming_posting_a_message_via_the_messaging_gateway() { - _messageProducer.Send(_message); + await _messageProducer.SendAsync(_message); await Task.Delay(500); //if this is true, then possible test failed because of timeout or RMQ issues - Assert.False(_messageWasNotPublished); + await Assert.That(_messageWasNotPublished).IsFalse(); //did we see the message - intent to test logic here - Assert.True(_messageWasPublished); + await Assert.That(_messageWasPublished).IsTrue(); } public void Dispose() @@ -89,3 +87,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_infrastructure_exists_can_assert.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_infrastructure_exists_can_assert.cs index 823a7b4b76..11fe5fb708 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_infrastructure_exists_can_assert.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_infrastructure_exists_can_assert.cs @@ -1,11 +1,9 @@ -using System; +using System; using Paramore.Brighter.MessagingGateway.RMQ.Sync; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqAssumeExistingInfrastructureTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -40,8 +38,8 @@ public RmqAssumeExistingInfrastructureTests() new QueueFactory(rmqConnection, queueName, new RoutingKeys( _message.Header.Topic)).Create(TimeSpan.FromMilliseconds(1000)); } - [Fact] - public void When_infrastructure_exists_can_assume_producer() + [Test] + public async Task When_infrastructure_exists_can_assume_producer() { var exceptionThrown = false; try @@ -55,7 +53,7 @@ public void When_infrastructure_exists_can_assume_producer() exceptionThrown = true; } - Assert.False(exceptionThrown); + await Assert.That(exceptionThrown).IsFalse(); } public void Dispose() @@ -64,3 +62,4 @@ public void Dispose() _messageConsumer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_infrastructure_exists_can_validate.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_infrastructure_exists_can_validate.cs index 661ca42cbf..e2c9fe1ad4 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_infrastructure_exists_can_validate.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_infrastructure_exists_can_validate.cs @@ -1,11 +1,9 @@ -using System; +using System; using Paramore.Brighter.MessagingGateway.RMQ.Sync; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqValidateExistingInfrastructureTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -40,8 +38,8 @@ public RmqValidateExistingInfrastructureTests() new QueueFactory(rmqConnection, queueName, new RoutingKeys(routingKey)).Create(TimeSpan.FromMilliseconds(1000)); } - [Fact] - public void When_infrastructure_exists_can_validate_producer() + [Test] + public async Task When_infrastructure_exists_can_validate_producer() { var exceptionThrown = false; try @@ -55,7 +53,7 @@ public void When_infrastructure_exists_can_validate_producer() exceptionThrown = true; } - Assert.False(exceptionThrown); + await Assert.That(exceptionThrown).IsFalse(); } public void Dispose() @@ -64,3 +62,4 @@ public void Dispose() _messageConsumer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_multiple_threads_try_to_post_a_message_at_the_same_time.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_multiple_threads_try_to_post_a_message_at_the_same_time.cs index f73a62c9f0..e6935fe8a5 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_multiple_threads_try_to_post_a_message_at_the_same_time.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_multiple_threads_try_to_post_a_message_at_the_same_time.cs @@ -2,12 +2,10 @@ using System.Linq; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Sync; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageProducerSupportsMultipleThreadsTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -29,8 +27,8 @@ public RmqMessageProducerSupportsMultipleThreadsTests() _messageProducer = new RmqMessageProducer(rmqConnection); } - [Fact] - public void When_multiple_threads_try_to_post_a_message_at_the_same_time() + [Test] + public async Task When_multiple_threads_try_to_post_a_message_at_the_same_time() { bool exceptionHappened = false; try @@ -46,7 +44,7 @@ public void When_multiple_threads_try_to_post_a_message_at_the_same_time() } //_should_not_throw - Assert.False(exceptionHappened); + await Assert.That(exceptionHappened).IsFalse(); } public void Dispose() @@ -54,3 +52,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_posting_a_message_but_no_broker_created.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_posting_a_message_but_no_broker_created.cs index dfc3c5a89b..9a39006ea9 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_posting_a_message_but_no_broker_created.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_posting_a_message_but_no_broker_created.cs @@ -1,11 +1,9 @@ -using System; +using System; using Paramore.Brighter.MessagingGateway.RMQ.Sync; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqBrokerNotPreCreatedTests : IDisposable { private Message _message; @@ -28,10 +26,10 @@ public RmqBrokerNotPreCreatedTests() } - [Fact] - public void When_posting_a_message_but_no_broker_created() + [Test] + public async Task When_posting_a_message_but_no_broker_created() { - Assert.Throws(() => _messageProducer.Send(_message)); + await Assert.That(() => _messageProducer.Send(_message)).ThrowsExactly(); } public void Dispose() @@ -39,3 +37,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_posting_a_message_to_persist_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_posting_a_message_to_persist_via_the_messaging_gateway.cs index 5cf764422b..36a6f5a54d 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_posting_a_message_to_persist_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_posting_a_message_to_persist_via_the_messaging_gateway.cs @@ -1,12 +1,10 @@ -using System; +using System; using System.Linq; using Paramore.Brighter.MessagingGateway.RMQ.Sync; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageProducerSendPersistentMessageTests : IDisposable { private IAmAMessageProducerSync _messageProducer; @@ -35,8 +33,8 @@ public RmqMessageProducerSendPersistentMessageTests() new QueueFactory(rmqConnection, queueName, new RoutingKeys( _message.Header.Topic)).Create(TimeSpan.FromMilliseconds(1000)); } - [Fact] - public void When_posting_a_message_to_persist_via_the_messaging_gateway() + [Test] + public async Task When_posting_a_message_to_persist_via_the_messaging_gateway() { // arrange _messageProducer.Send(_message); @@ -45,7 +43,7 @@ public void When_posting_a_message_to_persist_via_the_messaging_gateway() var result = _messageConsumer.Receive(TimeSpan.FromMilliseconds(1000)).First(); // assert - Assert.Equal(true, result.Persist); + await Assert.That(result.Persist).IsEqualTo(true); } public void Dispose() @@ -53,3 +51,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_posting_a_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_posting_a_message_via_the_messaging_gateway.cs index 609085263f..55f7729910 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_posting_a_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_posting_a_message_via_the_messaging_gateway.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,12 +27,10 @@ THE SOFTWARE. */ using System.Net.Mime; using Paramore.Brighter.MessagingGateway.RMQ.Sync; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageProducerSendMessageTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -93,33 +91,33 @@ public RmqMessageProducerSendMessageTests() new QueueFactory(rmqConnection, queueName, new RoutingKeys(_message.Header.Topic)).Create(TimeSpan.FromMilliseconds(1000)); } - [Fact] - public void When_posting_a_message_via_the_messaging_gateway() + [Test] + public async Task When_posting_a_message_via_the_messaging_gateway() { _messageProducer.Send(_message); var result = _messageConsumer.Receive(TimeSpan.FromMilliseconds(10000)).First(); // Assert message body - Assert.Equal(_message.Body.Value, result.Body.Value); + await Assert.That(result.Body.Value).IsEqualTo(_message.Body.Value); // Assert header values - Assert.Equal(_message.Header.MessageId, result.Header.MessageId); - Assert.Equal(_message.Header.Topic, result.Header.Topic); - Assert.Equal(_message.Header.MessageType, result.Header.MessageType); - Assert.Equal(_message.Header.Source, result.Header.Source); - Assert.Equal(_message.Header.Type, result.Header.Type); - Assert.Equal(_message.Header.TimeStamp, result.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(_message.Header.CorrelationId, result.Header.CorrelationId); - Assert.Equal(_message.Header.ReplyTo, result.Header.ReplyTo); - Assert.Equal(_message.Header.ContentType, result.Header.ContentType); - Assert.Equal(_message.Header.HandledCount, result.Header.HandledCount); - Assert.Equal(_message.Header.DataSchema, result.Header.DataSchema); - Assert.Equal(_message.Header.Subject, result.Header.Subject); - Assert.Equal(TimeSpan.Zero, result.Header.Delayed); //we clear any delay from the producer, as it represents delay in the pipeline - Assert.Equal(_message.Header.TraceParent, result.Header.TraceParent); - Assert.Equal(_message.Header.TraceState, result.Header.TraceState); - Assert.Equal(_message.Header.Baggage, result.Header.Baggage); + await Assert.That(result.Header.MessageId).IsEqualTo(_message.Header.MessageId); + await Assert.That(result.Header.Topic).IsEqualTo(_message.Header.Topic); + await Assert.That(result.Header.MessageType).IsEqualTo(_message.Header.MessageType); + await Assert.That(result.Header.Source).IsEqualTo(_message.Header.Source); + await Assert.That(result.Header.Type).IsEqualTo(_message.Header.Type); + await Assert.That(result.Header.TimeStamp).IsEqualTo(_message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(result.Header.CorrelationId).IsEqualTo(_message.Header.CorrelationId); + await Assert.That(result.Header.ReplyTo).IsEqualTo(_message.Header.ReplyTo); + await Assert.That(result.Header.ContentType).IsEqualTo(_message.Header.ContentType); + await Assert.That(result.Header.HandledCount).IsEqualTo(_message.Header.HandledCount); + await Assert.That(result.Header.DataSchema).IsEqualTo(_message.Header.DataSchema); + await Assert.That(result.Header.Subject).IsEqualTo(_message.Header.Subject); + await Assert.That(result.Header.Delayed).IsEqualTo(TimeSpan.Zero); //we clear any delay from the producer, as it represents delay in the pipeline + await Assert.That(result.Header.TraceParent).IsEqualTo(_message.Header.TraceParent); + await Assert.That(result.Header.TraceState).IsEqualTo(_message.Header.TraceState); + await Assert.That(result.Header.Baggage).IsEqualTo(_message.Header.Baggage); } public void Dispose() @@ -128,3 +126,4 @@ public void Dispose() } } + diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_queue_length_causes_a_message_to_be_rejected.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_queue_length_causes_a_message_to_be_rejected.cs index 6461fb0c44..8c03d5c814 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_queue_length_causes_a_message_to_be_rejected.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_queue_length_causes_a_message_to_be_rejected.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -25,12 +25,10 @@ THE SOFTWARE. */ using System; using System.Linq; using Paramore.Brighter.MessagingGateway.RMQ.Sync; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageProducerQueueLengthTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -73,8 +71,8 @@ public RmqMessageProducerQueueLengthTests() ); } - [Fact] - public void When_rejecting_a_message_due_to_queue_length() + [Test] + public async Task When_rejecting_a_message_due_to_queue_length() { //create the infrastructure _messageConsumer.Receive(TimeSpan.Zero); @@ -92,7 +90,7 @@ public void When_rejecting_a_message_due_to_queue_length() //try to grab the next message var nextMessages = _messageConsumer.Receive(TimeSpan.FromMilliseconds(5000)); message = nextMessages.First(); - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } @@ -101,3 +99,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_reading_a_delayed_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_reading_a_delayed_message_via_the_messaging_gateway.cs index 14d9f5021b..f2eea472d5 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_reading_a_delayed_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_reading_a_delayed_message_via_the_messaging_gateway.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -26,12 +26,10 @@ THE SOFTWARE. */ using System.Linq; using System.Net.Mime; using Paramore.Brighter.MessagingGateway.RMQ.Sync; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageProducerDelayedMessageTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -61,42 +59,42 @@ public RmqMessageProducerDelayedMessageTests() new QueueFactory(rmqConnection, queueName, new RoutingKeys([routingKey])).Create(TimeSpan.FromMilliseconds(1000)); } - [Fact] - public void When_reading_a_delayed_message_via_the_messaging_gateway() + [Test] + public async Task When_reading_a_delayed_message_via_the_messaging_gateway() { //NOTE: This test will fail if RMQ is not configured to support delay _messageProducer.SendWithDelay(_message, TimeSpan.FromMilliseconds(3000)); var immediateResult = _messageConsumer.Receive(TimeSpan.Zero).First(); var deliveredWithoutWait = immediateResult.Header.MessageType == MessageType.MT_NONE; - Assert.Equal(0, immediateResult.Header.HandledCount); - Assert.Equal(TimeSpan.Zero, immediateResult.Header.Delayed); + await Assert.That(immediateResult.Header.HandledCount).IsEqualTo(0); + await Assert.That(immediateResult.Header.Delayed).IsEqualTo(TimeSpan.Zero); //_should_have_not_been_able_get_message_before_delay - Assert.True(deliveredWithoutWait); + await Assert.That(deliveredWithoutWait).IsTrue(); var delayedResult = _messageConsumer.Receive(TimeSpan.FromMilliseconds(10000)).First(); //_should_send_a_message_via_rmq_with_the_matching_body - Assert.Equal(_message.Body.Value, delayedResult.Body.Value); - Assert.Equal(MessageType.MT_COMMAND, delayedResult.Header.MessageType); - Assert.Equal(0, delayedResult.Header.HandledCount); - Assert.Equal(TimeSpan.FromMilliseconds(3000), delayedResult.Header.Delayed); + await Assert.That(delayedResult.Body.Value).IsEqualTo(_message.Body.Value); + await Assert.That(delayedResult.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(delayedResult.Header.HandledCount).IsEqualTo(0); + await Assert.That(delayedResult.Header.Delayed).IsEqualTo(TimeSpan.FromMilliseconds(3000)); _messageConsumer.Acknowledge(delayedResult); } - [Fact] - public void When_requeing_a_failed_message_with_delay() + [Test] + public async Task When_requeing_a_failed_message_with_delay() { //NOTE: This test will fail if RMQ is not configured to support delay //send & receive a message _messageProducer.Send(_message); var message = _messageConsumer.Receive(TimeSpan.FromMilliseconds(1000)).Single(); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(TimeSpan.FromMilliseconds(0), message.Header.Delayed); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.FromMilliseconds(0)); _messageConsumer.Acknowledge(message); @@ -106,8 +104,8 @@ public void When_requeing_a_failed_message_with_delay() //receive and assert var secondMessage = _messageConsumer.Receive(TimeSpan.FromMilliseconds(5000)).Single(); - Assert.Equal(MessageType.MT_COMMAND, secondMessage.Header.MessageType); - Assert.Equal(1, secondMessage.Header.HandledCount); + await Assert.That(secondMessage.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(secondMessage.Header.HandledCount).IsEqualTo(1); _messageConsumer.Acknowledge(secondMessage); } @@ -118,3 +116,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_rejecting_a_message_to_a_dead_letter_queue.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_rejecting_a_message_to_a_dead_letter_queue.cs index e18e983471..99602e59eb 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_rejecting_a_message_to_a_dead_letter_queue.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_rejecting_a_message_to_a_dead_letter_queue.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -25,12 +25,10 @@ THE SOFTWARE. */ using System; using System.Linq; using Paramore.Brighter.MessagingGateway.RMQ.Sync; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageProducerDLQTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -80,9 +78,9 @@ public RmqMessageProducerDLQTests() ); } - //[Fact(Skip = "Breaks due to fault in Task Scheduler running after context has closed")] - [Fact] - public void When_rejecting_a_message_to_a_dead_letter_queue() + //[Test, Skip("Breaks due to fault in Task Scheduler running after context has closed")] + [Test] + public async Task When_rejecting_a_message_to_a_dead_letter_queue() { //create the infrastructure _messageConsumer.Receive(TimeSpan.FromMilliseconds(0)); @@ -97,8 +95,8 @@ public void When_rejecting_a_message_to_a_dead_letter_queue() var dlqMessage = _deadLetterConsumer.Receive(TimeSpan.FromMilliseconds(10000)).First(); //assert this is our message - Assert.Equal(_message.Id, dlqMessage.Id); - Assert.Equal(dlqMessage.Body.Value, message.Body.Value); + await Assert.That(dlqMessage.Id).IsEqualTo(_message.Id); + await Assert.That(message.Body.Value).IsEqualTo(dlqMessage.Body.Value); } public void Dispose() @@ -106,3 +104,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_requeuing_a_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_requeuing_a_message_via_the_messaging_gateway.cs index f8b5a299f6..02962cf76a 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_requeuing_a_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_requeuing_a_message_via_the_messaging_gateway.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -28,12 +28,10 @@ THE SOFTWARE. */ using Paramore.Brighter.MessagingGateway.RMQ.Sync; using Paramore.Brighter.Observability; using Paramore.Brighter.RMQ.Sync.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageProducerRequeuingMessageTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -103,8 +101,8 @@ public RmqMessageProducerRequeuingMessageTests() .Create(TimeSpan.FromSeconds(1)); } - [Fact] - public void When_posting_a_message_via_the_messaging_gateway() + [Test] + public async Task When_posting_a_message_via_the_messaging_gateway() { _messageProducer.Send(_message); @@ -114,25 +112,25 @@ public void When_posting_a_message_via_the_messaging_gateway() result = _channel.Receive(TimeSpan.FromMilliseconds(10000)); // Assert message body - Assert.Equal(_message.Body.Value, result.Body.Value); + await Assert.That(result.Body.Value).IsEqualTo(_message.Body.Value); // Assert header values - Assert.Equal(_message.Header.MessageId.ToString(), result.Header.Bag[HeaderNames.ORIGINAL_MESSAGE_ID]); - Assert.Equal(_message.Header.Topic, result.Header.Topic); - Assert.Equal(_message.Header.MessageType, result.Header.MessageType); - Assert.Equal(_message.Header.Source, result.Header.Source); - Assert.Equal(_message.Header.Type, result.Header.Type); - Assert.Equal(_message.Header.TimeStamp, result.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(_message.Header.CorrelationId, result.Header.CorrelationId); - Assert.Equal(_message.Header.ReplyTo, result.Header.ReplyTo); - Assert.Equal(_message.Header.ContentType, result.Header.ContentType); - Assert.Equal(_message.Header.HandledCount, result.Header.HandledCount); - Assert.Equal(_message.Header.DataSchema, result.Header.DataSchema); - Assert.Equal(_message.Header.Subject, result.Header.Subject); - Assert.Equal(TimeSpan.Zero, result.Header.Delayed); //we clear any delay from the producer, as it represents delay in the pipeline - Assert.Equal(_message.Header.TraceParent, result.Header.TraceParent); - Assert.Equal(_message.Header.TraceState, result.Header.TraceState); - Assert.Equal(_message.Header.Baggage, result.Header.Baggage); + await Assert.That(result.Header.Bag[HeaderNames.ORIGINAL_MESSAGE_ID]).IsEqualTo(_message.Header.MessageId.ToString()); + await Assert.That(result.Header.Topic).IsEqualTo(_message.Header.Topic); + await Assert.That(result.Header.MessageType).IsEqualTo(_message.Header.MessageType); + await Assert.That(result.Header.Source).IsEqualTo(_message.Header.Source); + await Assert.That(result.Header.Type).IsEqualTo(_message.Header.Type); + await Assert.That(result.Header.TimeStamp).IsEqualTo(_message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(result.Header.CorrelationId).IsEqualTo(_message.Header.CorrelationId); + await Assert.That(result.Header.ReplyTo).IsEqualTo(_message.Header.ReplyTo); + await Assert.That(result.Header.ContentType).IsEqualTo(_message.Header.ContentType); + await Assert.That(result.Header.HandledCount).IsEqualTo(_message.Header.HandledCount); + await Assert.That(result.Header.DataSchema).IsEqualTo(_message.Header.DataSchema); + await Assert.That(result.Header.Subject).IsEqualTo(_message.Header.Subject); + await Assert.That(result.Header.Delayed).IsEqualTo(TimeSpan.Zero); //we clear any delay from the producer, as it represents delay in the pipeline + await Assert.That(result.Header.TraceParent).IsEqualTo(_message.Header.TraceParent); + await Assert.That(result.Header.TraceState).IsEqualTo(_message.Header.TraceState); + await Assert.That(result.Header.Baggage).IsEqualTo(_message.Header.Baggage); } public void Dispose() @@ -141,3 +139,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_resetting_a_connection_that_does_not_exist.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_resetting_a_connection_that_does_not_exist.cs index 56020818e5..4fe3d1a6ef 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_resetting_a_connection_that_does_not_exist.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_resetting_a_connection_that_does_not_exist.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -26,17 +26,15 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Sync; using RabbitMQ.Client; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqMessageGatewayConnectionPoolResetConnectionDoesNotExist { private readonly RmqMessageGatewayConnectionPool _connectionPool = new("MyConnectionName", 7); - [Fact] + [Test] public async Task When_resetting_a_connection_that_does_not_exist() { var connectionFactory = new ConnectionFactory {HostName = "invalidhost"}; @@ -51,7 +49,8 @@ public async Task When_resetting_a_connection_that_does_not_exist() resetConnectionExceptionThrown = true; } - Assert.False(resetConnectionExceptionThrown); + await Assert.That(resetConnectionExceptionThrown).IsFalse(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_retry_limits_force_a_message_onto_the_DLQ.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_retry_limits_force_a_message_onto_the_DLQ.cs index 1317580867..d1f3ec2db0 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_retry_limits_force_a_message_onto_the_DLQ.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_retry_limits_force_a_message_onto_the_DLQ.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Net.Mime; @@ -9,12 +9,10 @@ using Paramore.Brighter.RMQ.Sync.Tests.TestDoubles; using Paramore.Brighter.ServiceActivator; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor; -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RMQMessageConsumerRetryDLQTests : IDisposable { private readonly IAmAMessagePump _messagePump; @@ -116,8 +114,7 @@ public RMQMessageConsumerRetryDLQTests() ); } - [Fact(Skip = "Breaks due to fault in Task Scheduler running after context has closed")] - [SuppressMessage("Usage", "xUnit1031:Do not use blocking task operations in test method")] + [Test, Skip("Breaks due to fault in Task Scheduler running after context has closed")] public async Task When_retry_limits_force_a_message_onto_the_dlq() { //NOTE: This test is **slow** because it needs to ensure infrastructure and then wait whilst we requeue a message a number of times, @@ -128,7 +125,7 @@ public async Task When_retry_limits_force_a_message_onto_the_dlq() await Task.Delay(20000); //put something on an SNS topic, which will be delivered to our SQS queue - _sender.Send(_message); + await _sender.SendAsync(_message); //Let the message be handled and deferred until it reaches the DLQ await Task.Delay(20000); @@ -146,7 +143,7 @@ public async Task When_retry_limits_force_a_message_onto_the_dlq() var dlqMessage = _deadLetterConsumer.Receive(new TimeSpan(10000)).First(); //assert this is our message - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); _deadLetterConsumer.Acknowledge(dlqMessage); @@ -159,3 +156,4 @@ public void Dispose() } } + diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_rmq_sync_consumer_requeues_without_native_delay_should_use_producer.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_rmq_sync_consumer_requeues_without_native_delay_should_use_producer.cs index 46b6a9025d..1feae0b154 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_rmq_sync_consumer_requeues_without_native_delay_should_use_producer.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_rmq_sync_consumer_requeues_without_native_delay_should_use_producer.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ using System.Threading; using Paramore.Brighter.MessagingGateway.RMQ.Sync; using Paramore.Brighter.RMQ.Sync.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor; @@ -36,8 +35,7 @@ namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor; /// it should delegate to the producer's SendWithDelay instead of blocking the message pump /// with Task.Delay().Wait(). This also verifies lazy producer creation and disposal. /// -[Trait("Category", "RMQ")] -[Collection("RMQ")] +[Category("RMQ")] public class RmqSyncConsumerDelayTests : IDisposable { private readonly IAmAMessageProducerSync _sendProducer; @@ -76,13 +74,13 @@ public RmqSyncConsumerDelayTests() .Create(TimeSpan.FromSeconds(1)); } - [Fact] - public void When_requeuing_with_delay_should_not_block_pump() + [Test] + public async Task When_requeuing_with_delay_should_not_block_pump() { // Arrange - send and receive a message _sendProducer.Send(_message); var received = _channel.Receive(TimeSpan.FromMilliseconds(10000)); - Assert.NotEqual(MessageType.MT_NONE, received.Header.MessageType); + await Assert.That(received.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); // Act - requeue with a significant delay (5 seconds) var stopwatch = Stopwatch.StartNew(); @@ -90,24 +88,23 @@ public void When_requeuing_with_delay_should_not_block_pump() stopwatch.Stop(); // Assert - requeue should return true - Assert.True(result, "Requeue should succeed"); + await Assert.That(result).IsTrue(); // Assert - requeue should complete quickly, proving Task.Delay().Wait() is NOT used - Assert.True(stopwatch.Elapsed < TimeSpan.FromSeconds(2), - $"Requeue should not block with Task.Delay().Wait(); took {stopwatch.Elapsed.TotalSeconds:F1}s"); + await Assert.That(stopwatch.Elapsed < TimeSpan.FromSeconds(2)).IsTrue(); // Assert - message should be available on the queue (published via producer through exchange) var requeued = _channel.Receive(TimeSpan.FromMilliseconds(10000)); - Assert.Equal(_message.Body.Value, requeued.Body.Value); + await Assert.That(requeued.Body.Value).IsEqualTo(_message.Body.Value); } - [Fact] - public void When_disposing_should_dispose_lazily_created_producer() + [Test] + public async Task When_disposing_should_dispose_lazily_created_producer() { // Arrange - send, receive, and requeue with delay to trigger producer creation _sendProducer.Send(_message); var received = _channel.Receive(TimeSpan.FromMilliseconds(10000)); - Assert.NotEqual(MessageType.MT_NONE, received.Header.MessageType); + await Assert.That(received.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); //delay before requeue for test connection pool conflicts Thread.Sleep(TimeSpan.FromSeconds(2)); @@ -115,12 +112,11 @@ public void When_disposing_should_dispose_lazily_created_producer() _channel.Requeue(received, TimeSpan.FromSeconds(5)); // Act & Assert - disposing channel (and its consumer) should not throw - var exception = Record.Exception(() => _channel.Dispose()); - Assert.Null(exception); + await Assert.That(() => _channel.Dispose()).ThrowsNothing(); } - [Fact] - public void When_disposing_without_producer_created_should_not_throw() + [Test] + public async Task When_disposing_without_producer_created_should_not_throw() { // Arrange - consumer that never requeued with delay (no producer created) var rmqConnection = new RmqMessagingGatewayConnection @@ -136,8 +132,7 @@ public void When_disposing_without_producer_created_should_not_throw() isDurable: false); // Act & Assert - should not throw - var exception = Record.Exception(() => consumer.Dispose()); - Assert.Null(exception); + await Assert.That(() => consumer.Dispose()).ThrowsNothing(); } public void Dispose() @@ -146,3 +141,4 @@ public void Dispose() _sendProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_sending_a_message_should_propagate_context.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_sending_a_message_should_propagate_context.cs index 1c8d9c00c9..88bdd151db 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_sending_a_message_should_propagate_context.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/Reactor/When_sending_a_message_should_propagate_context.cs @@ -7,13 +7,12 @@ using OpenTelemetry.Trace; using Paramore.Brighter.MessagingGateway.RMQ.Sync; using Paramore.Brighter.Observability; -using Xunit; using Baggage = OpenTelemetry.Baggage; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway.Reactor { - [Trait("Category", "RMQ")] - [Collection("RMQ")] + [Category("RMQ")] + [NotInParallel("RMQ")] public class RmqMessageProducerPropagateContextTests : IDisposable { private readonly IAmAMessageProducerSync _messageProducer; @@ -61,8 +60,8 @@ public RmqMessageProducerPropagateContextTests() }; } - [Fact] - public void When_Sending_A_Message_Should_Propagate_Context() + [Test] + public async Task When_Sending_A_Message_Should_Propagate_Context() { //arrange @@ -76,9 +75,9 @@ public void When_Sending_A_Message_Should_Propagate_Context() .SelectMany(a => a.Events) .FirstOrDefault(e => e.Name == $"{_message.Header.Topic} {CommandProcessorSpanOperation.Publish.ToSpanName()}"); - Assert.NotNull(_message.Header.TraceParent); - Assert.Equal("brighter=00f067aa0ba902b7,congo=t61rcWkgMzE", _message.Header.TraceState); - Assert.Equal("key=value,key2=value2", _message.Header.Baggage.ToString()); + await Assert.That(_message.Header.TraceParent).IsNotNull(); + await Assert.That(_message.Header.TraceState).IsEqualTo("brighter=00f067aa0ba902b7,congo=t61rcWkgMzE"); + await Assert.That(_message.Header.Baggage.ToString()).IsEqualTo("key=value,key2=value2"); } public void Dispose() diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/TestHelpers.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/TestHelpers.cs index 8c31fbddc8..b49015a320 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/TestHelpers.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/TestHelpers.cs @@ -24,6 +24,7 @@ THE SOFTWARE. */ using System; using System.Linq; +using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.RMQ.Sync; using RabbitMQ.Client; @@ -69,7 +70,7 @@ public void Create(TimeSpan timeToDelayForCreation) } //We need to delay to actually create these queues before we send to them - Task.Delay(timeToDelayForCreation).Wait(); + Thread.Sleep(timeToDelayForCreation); } } } diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/When_configuring_mutual_tls_connection.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/When_configuring_mutual_tls_connection.cs index 50255bd8c8..ac440c45eb 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/When_configuring_mutual_tls_connection.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/When_configuring_mutual_tls_connection.cs @@ -5,14 +5,13 @@ using System.Security.Cryptography.X509Certificates; using Paramore.Brighter.MessagingGateway.RMQ.Sync; using RabbitMQ.Client; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway; // These tests validate gateway configuration plumbing (ConnectionFactory.Ssl setup) and are // intentionally hand-written rather than generator-based. See ADR 0035 (Generated Tests). -[Trait("Category", "RMQ")] -[Trait("Category", "MutualTLS")] +[Category("RMQ")] +[Category("MutualTLS")] public class RmqMutualTlsConnectionConfigurationTests : IDisposable { private readonly string _tempCertPath; @@ -44,8 +43,8 @@ public void Dispose() File.Delete(_tempCertPath); } - [Fact] - public void When_certificate_is_configured_ssl_is_enabled() + [Test] + public async Task When_certificate_is_configured_ssl_is_enabled() { // Arrange var connection = new RmqMessagingGatewayConnection @@ -60,16 +59,16 @@ public void When_certificate_is_configured_ssl_is_enabled() var factory = gateway.GetConnectionFactory(); // Assert - SSL should be enabled - Assert.NotNull(factory.Ssl); - Assert.True(factory.Ssl.Enabled); - Assert.Equal("localhost", factory.Ssl.ServerName); - Assert.NotNull(factory.Ssl.Certs); - Assert.Single(factory.Ssl.Certs); - Assert.Same(_testCertificate, factory.Ssl.Certs[0]); + await Assert.That(factory.Ssl).IsNotNull(); + await Assert.That(factory.Ssl.Enabled).IsTrue(); + await Assert.That(factory.Ssl.ServerName).IsEqualTo("localhost"); + await Assert.That(factory.Ssl.Certs).IsNotNull(); + await Assert.That(factory.Ssl.Certs.Count).IsEqualTo(1); + await Assert.That(factory.Ssl.Certs[0]).IsSameReferenceAs(_testCertificate); } - [Fact] - public void When_no_certificate_is_configured_ssl_is_not_configured() + [Test] + public async Task When_no_certificate_is_configured_ssl_is_not_configured() { // Arrange - no certificate configured var connection = new RmqMessagingGatewayConnection @@ -83,12 +82,12 @@ public void When_no_certificate_is_configured_ssl_is_not_configured() var factory = gateway.GetConnectionFactory(); // Assert - SSL should not be enabled (backwards compatibility) - Assert.NotNull(factory.Ssl); - Assert.False(factory.Ssl.Enabled); + await Assert.That(factory.Ssl).IsNotNull(); + await Assert.That(factory.Ssl.Enabled).IsFalse(); } - [Fact] - public void When_certificate_object_and_path_both_set_object_takes_precedence() + [Test] + public async Task When_certificate_object_and_path_both_set_object_takes_precedence() { // Arrange - both certificate object and path set var connection = new RmqMessagingGatewayConnection @@ -104,12 +103,12 @@ public void When_certificate_object_and_path_both_set_object_takes_precedence() var factory = gateway.GetConnectionFactory(); // Assert - Should use the certificate object, not load from path - Assert.True(factory.Ssl.Enabled); - Assert.Same(_testCertificate, factory.Ssl.Certs[0]); + await Assert.That(factory.Ssl.Enabled).IsTrue(); + await Assert.That(factory.Ssl.Certs[0]).IsSameReferenceAs(_testCertificate); } - [Fact] - public void When_certificate_path_is_provided_certificate_is_loaded() + [Test] + public async Task When_certificate_path_is_provided_certificate_is_loaded() { // Arrange var connection = new RmqMessagingGatewayConnection @@ -125,13 +124,13 @@ public void When_certificate_path_is_provided_certificate_is_loaded() var factory = gateway.GetConnectionFactory(); // Assert - Certificate should be loaded from file - Assert.True(factory.Ssl.Enabled); - Assert.Single(factory.Ssl.Certs); - Assert.NotNull(factory.Ssl.Certs[0]); + await Assert.That(factory.Ssl.Enabled).IsTrue(); + await Assert.That(factory.Ssl.Certs.Count).IsEqualTo(1); + await Assert.That(factory.Ssl.Certs[0]).IsNotNull(); } - [Fact] - public void When_certificate_file_does_not_exist_throws_file_not_found() + [Test] + public async Task When_certificate_file_does_not_exist_throws_file_not_found() { // Arrange var connection = new RmqMessagingGatewayConnection @@ -142,16 +141,16 @@ public void When_certificate_file_does_not_exist_throws_file_not_found() }; // Act & Assert - var ex = Assert.Throws(() => new TestableRmqMessageConsumer(connection)); - Assert.Contains("Client certificate file not found", ex.Message); + var ex = await Assert.That(() => new TestableRmqMessageConsumer(connection)).ThrowsExactly(); + await Assert.That(ex.Message).Contains("Client certificate file not found"); } - [Fact] - public void When_certificate_file_is_invalid_throws_invalid_operation() + [Test] + public async Task When_certificate_file_is_invalid_throws_invalid_operation() { // Arrange - create a temp file with invalid certificate data var invalidCertPath = Path.Combine(Path.GetTempPath(), $"invalid-cert-{Guid.NewGuid()}.pfx"); - File.WriteAllText(invalidCertPath, "not a valid certificate"); + await File.WriteAllTextAsync(invalidCertPath, "not a valid certificate"); try { @@ -163,9 +162,9 @@ public void When_certificate_file_is_invalid_throws_invalid_operation() }; // Act & Assert - var ex = Assert.Throws(() => new TestableRmqMessageConsumer(connection)); - Assert.Contains("Failed to load client certificate", ex.Message); - Assert.Contains("valid .pfx (PKCS#12) certificate", ex.Message); + var ex = await Assert.That(() => new TestableRmqMessageConsumer(connection)).ThrowsExactly(); + await Assert.That(ex.Message).Contains("Failed to load client certificate"); + await Assert.That(ex.Message).Contains("valid .pfx (PKCS#12) certificate"); } finally { @@ -174,8 +173,8 @@ public void When_certificate_file_is_invalid_throws_invalid_operation() } } - [Fact] - public void When_certificate_configuration_is_optional_backwards_compatibility_is_maintained() + [Test] + public async Task When_certificate_configuration_is_optional_backwards_compatibility_is_maintained() { // Arrange - existing code that doesn't use certificates var connection = new RmqMessagingGatewayConnection @@ -187,7 +186,7 @@ public void When_certificate_configuration_is_optional_backwards_compatibility_i // Act & Assert - Should not throw, gateway should initialize normally var gateway = new TestableRmqMessageConsumer(connection); var factory = gateway.GetConnectionFactory(); - Assert.NotNull(factory); + await Assert.That(factory).IsNotNull(); } // Test double to expose ConnectionFactory for verification diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/When_rmq_sync_channel_factory_forwards_scheduler_to_consumers.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/When_rmq_sync_channel_factory_forwards_scheduler_to_consumers.cs index d7d127f8b5..0f06835cae 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/When_rmq_sync_channel_factory_forwards_scheduler_to_consumers.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/When_rmq_sync_channel_factory_forwards_scheduler_to_consumers.cs @@ -22,7 +22,6 @@ THE SOFTWARE. */ using System; using Paramore.Brighter.MessagingGateway.RMQ.Sync; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway; @@ -34,8 +33,8 @@ public class When_rmq_sync_channel_factory_forwards_scheduler_to_consumers Exchange = new Exchange("test.exchange") }; - [Fact] - public void Should_forward_scheduler_to_consumer_factory() + [Test] + public async Task Should_forward_scheduler_to_consumer_factory() { // Arrange var consumerFactory = new RmqMessageConsumerFactory(_connection); @@ -46,11 +45,11 @@ public void Should_forward_scheduler_to_consumer_factory() ((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler = scheduler; // Assert — the consumer factory received the scheduler - Assert.Same(scheduler, consumerFactory.Scheduler); + await Assert.That(consumerFactory.Scheduler).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_read_scheduler_from_consumer_factory() + [Test] + public async Task Should_read_scheduler_from_consumer_factory() { // Arrange — consumer factory has a scheduler from construction var scheduler = new StubMessageScheduler(); @@ -58,7 +57,7 @@ public void Should_read_scheduler_from_consumer_factory() var channelFactory = new ChannelFactory(consumerFactory); // Assert — channel factory reads from the consumer factory - Assert.Same(scheduler, ((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler); + await Assert.That(((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler).IsSameReferenceAs(scheduler); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/When_rmq_sync_channel_factory_has_scheduler_should_pass_to_consumers.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/When_rmq_sync_channel_factory_has_scheduler_should_pass_to_consumers.cs index 17bdf06728..1cb7b64e6b 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/When_rmq_sync_channel_factory_has_scheduler_should_pass_to_consumers.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/When_rmq_sync_channel_factory_has_scheduler_should_pass_to_consumers.cs @@ -1,6 +1,5 @@ using System; using Paramore.Brighter.MessagingGateway.RMQ.Sync; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway; @@ -21,19 +20,19 @@ public class When_rmq_sync_channel_factory_has_scheduler_should_pass_to_consumer makeChannels: OnMissingChannel.Assume ); - [Fact] - public void Should_implement_channel_factory_with_scheduler() + [Test] + public async Task Should_implement_channel_factory_with_scheduler() { // Arrange var consumerFactory = new RmqMessageConsumerFactory(_connection); var channelFactory = new ChannelFactory(consumerFactory); // Assert - Assert.IsAssignableFrom(channelFactory); + await Assert.That(channelFactory).IsAssignableTo(); } - [Fact] - public void Should_create_sync_channel_when_scheduler_set() + [Test] + public async Task Should_create_sync_channel_when_scheduler_set() { // Arrange var scheduler = new StubMessageScheduler(); @@ -45,12 +44,12 @@ public void Should_create_sync_channel_when_scheduler_set() var channel = channelFactory.CreateSyncChannel(_subscription); // Assert - Assert.NotNull(channel); - Assert.IsType(channel); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsTypeOf(); } - [Fact] - public void Should_create_channel_without_scheduler_for_backward_compat() + [Test] + public async Task Should_create_channel_without_scheduler_for_backward_compat() { // Arrange — no scheduler set var consumerFactory = new RmqMessageConsumerFactory(_connection); @@ -60,8 +59,8 @@ public void Should_create_channel_without_scheduler_for_backward_compat() var channel = channelFactory.CreateSyncChannel(_subscription); // Assert - Assert.NotNull(channel); - Assert.IsType(channel); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsTypeOf(); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/When_rmq_sync_consumer_factory_creates_consumer_should_pass_scheduler.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/When_rmq_sync_consumer_factory_creates_consumer_should_pass_scheduler.cs index 3ba7fd7221..bc43e18406 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/When_rmq_sync_consumer_factory_creates_consumer_should_pass_scheduler.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/When_rmq_sync_consumer_factory_creates_consumer_should_pass_scheduler.cs @@ -22,7 +22,6 @@ THE SOFTWARE. */ using System; using Paramore.Brighter.MessagingGateway.RMQ.Sync; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway; @@ -43,8 +42,8 @@ public class When_rmq_sync_consumer_factory_creates_consumer_should_pass_schedul makeChannels: OnMissingChannel.Assume ); - [Fact] - public void Should_create_sync_consumer_when_scheduler_provided() + [Test] + public async Task Should_create_sync_consumer_when_scheduler_provided() { // Arrange — factory constructed with a scheduler var scheduler = new StubMessageScheduler(); @@ -54,12 +53,12 @@ public void Should_create_sync_consumer_when_scheduler_provided() var consumer = factory.Create(_subscription); // Assert — consumer is created successfully - Assert.NotNull(consumer); - Assert.IsType(consumer); + await Assert.That(consumer).IsNotNull(); + await Assert.That(consumer).IsTypeOf(); } - [Fact] - public void Should_create_consumer_without_scheduler_for_backward_compat() + [Test] + public async Task Should_create_consumer_without_scheduler_for_backward_compat() { // Arrange — factory constructed without a scheduler (backward compat) var factory = new RmqMessageConsumerFactory(_connection); @@ -68,8 +67,8 @@ public void Should_create_consumer_without_scheduler_for_backward_compat() var consumer = factory.Create(_subscription); // Assert — consumer is created successfully without scheduler - Assert.NotNull(consumer); - Assert.IsType(consumer); + await Assert.That(consumer).IsNotNull(); + await Assert.That(consumer).IsTypeOf(); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/When_rmq_sync_consumer_factory_scheduler_set_after_construction.cs b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/When_rmq_sync_consumer_factory_scheduler_set_after_construction.cs index 5976a901e9..dfc3d1e04c 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/When_rmq_sync_consumer_factory_scheduler_set_after_construction.cs +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/MessagingGateway/When_rmq_sync_consumer_factory_scheduler_set_after_construction.cs @@ -22,7 +22,6 @@ THE SOFTWARE. */ using System; using Paramore.Brighter.MessagingGateway.RMQ.Sync; -using Xunit; namespace Paramore.Brighter.RMQ.Sync.Tests.MessagingGateway; @@ -34,8 +33,8 @@ public class When_rmq_sync_consumer_factory_scheduler_set_after_construction Exchange = new Exchange("test.exchange") }; - [Fact] - public void Should_expose_scheduler_set_after_construction() + [Test] + public async Task Should_expose_scheduler_set_after_construction() { // Arrange — factory constructed without a scheduler var factory = new RmqMessageConsumerFactory(_connection); @@ -45,22 +44,22 @@ public void Should_expose_scheduler_set_after_construction() factory.Scheduler = scheduler; // Assert — scheduler property reflects the updated value - Assert.Same(scheduler, factory.Scheduler); + await Assert.That(factory.Scheduler).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_use_constructor_scheduler_when_property_not_set() + [Test] + public async Task Should_use_constructor_scheduler_when_property_not_set() { // Arrange — factory constructed with a scheduler via constructor var scheduler = new StubMessageScheduler(); var factory = new RmqMessageConsumerFactory(_connection, scheduler); // Assert — scheduler property reflects the constructor value - Assert.Same(scheduler, factory.Scheduler); + await Assert.That(factory.Scheduler).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_override_constructor_scheduler_with_property() + [Test] + public async Task Should_override_constructor_scheduler_with_property() { // Arrange — factory constructed with one scheduler var originalScheduler = new StubMessageScheduler(); @@ -71,8 +70,8 @@ public void Should_override_constructor_scheduler_with_property() factory.Scheduler = overrideScheduler; // Assert — property reflects the override, not the original - Assert.Same(overrideScheduler, factory.Scheduler); - Assert.NotSame(originalScheduler, factory.Scheduler); + await Assert.That(factory.Scheduler).IsSameReferenceAs(overrideScheduler); + await Assert.That(factory.Scheduler).IsNotSameReferenceAs(originalScheduler); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.RMQ.Sync.Tests/Paramore.Brighter.RMQ.Sync.Tests.csproj b/tests/Paramore.Brighter.RMQ.Sync.Tests/Paramore.Brighter.RMQ.Sync.Tests.csproj index 7a5833a817..bb399b9c49 100644 --- a/tests/Paramore.Brighter.RMQ.Sync.Tests/Paramore.Brighter.RMQ.Sync.Tests.csproj +++ b/tests/Paramore.Brighter.RMQ.Sync.Tests/Paramore.Brighter.RMQ.Sync.Tests.csproj @@ -1,33 +1,17 @@ - - + $(BrighterTestTargetFrameworks) false + Exe - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - + - - \ No newline at end of file diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_a_message_consumer_throws_a_socket_exception_when_connecting_to_the_server_async.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_a_message_consumer_throws_a_socket_exception_when_connecting_to_the_server_async.cs index db1ddb0728..89dbb0f009 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_a_message_consumer_throws_a_socket_exception_when_connecting_to_the_server_async.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_a_message_consumer_throws_a_socket_exception_when_connecting_to_the_server_async.cs @@ -1,14 +1,12 @@ -using System; +using System; using System.Threading.Tasks; -using Xunit; using Paramore.Brighter.MessagingGateway.Redis; using Paramore.Brighter.Redis.Tests.TestDoubles; using ServiceStack.Redis; namespace Paramore.Brighter.Redis.Tests.MessagingGateway.Proactor; -[Collection("Redis Shared Pool")] //shared connection pool so run sequentially -[Trait("Category", "Redis")] +[Category("Redis")] public class RedisMessageConsumerRedisNotAvailableTestsAsync { private readonly ChannelName _queueName = new ChannelName("test"); @@ -23,14 +21,15 @@ public RedisMessageConsumerRedisNotAvailableTestsAsync() _messageConsumer = new RedisMessageConsumerSocketErrorOnGetClient(configuration, _queueName, _topic); } - [Fact] + [Test] public async Task When_a_message_consumer_throws_a_socket_exception_when_connecting_to_the_server_async() { _exception = await Catch.ExceptionAsync(() => _messageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))); - Assert.IsType(_exception); - Assert.IsType(_exception?.InnerException); + await Assert.That(_exception).IsTypeOf(); + await Assert.That(_exception?.InnerException).IsTypeOf(); } //Do not dispose of fake client } + diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_a_message_consumer_throws_a_timeout_exception_when_connecting_to_the_pool_async.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_a_message_consumer_throws_a_timeout_exception_when_connecting_to_the_pool_async.cs index 44fe8f189c..c3610f4eba 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_a_message_consumer_throws_a_timeout_exception_when_connecting_to_the_pool_async.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_a_message_consumer_throws_a_timeout_exception_when_connecting_to_the_pool_async.cs @@ -1,13 +1,11 @@ -using System; +using System; using System.Threading.Tasks; -using Xunit; using Paramore.Brighter.MessagingGateway.Redis; using Paramore.Brighter.Redis.Tests.TestDoubles; namespace Paramore.Brighter.Redis.Tests.MessagingGateway.Proactor; -[Collection("Redis Shared Pool")] //shared connection pool so run sequentially -[Trait("Category", "Redis")] +[Category("Redis")] public class RedisMessageConsumerOperationInterruptedTestsAsync { private readonly ChannelName _queueName = new("test"); @@ -22,14 +20,15 @@ public RedisMessageConsumerOperationInterruptedTestsAsync() _messageConsumer = new RedisMessageConsumerTimeoutOnGetClient(configuration, _queueName, _topic); } - [Fact] + [Test] public async Task When_a_message_consumer_throws_a_timeout_exception_when_getting_a_client_from_the_pool_async() { _exception = await Catch.ExceptionAsync(() => _messageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))); - Assert.IsType(_exception); - Assert.IsType(_exception?.InnerException); + await Assert.That(_exception).IsTypeOf(); + await Assert.That(_exception?.InnerException).IsTypeOf(); } //do not dispose a fake client } + diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs index 681d6134ef..827668100b 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs @@ -1,13 +1,12 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway.Proactor; -[Collection("Redis Shared Pool")] //shared connection pool so run sequentially -[Trait("Category", "Redis")] -public class RedisMessageProducerSendTestsAsync : IClassFixture +[Category("Redis")] +[ClassDataSource(Shared = SharedType.PerClass)] + public class RedisMessageProducerSendTestsAsync { private readonly RedisFixture _redisFixture; private readonly Message _message; @@ -21,7 +20,7 @@ public RedisMessageProducerSendTestsAsync(RedisFixture redisFixture) ); } - [Fact] + [Test] public async Task When_posting_a_message_via_the_messaging_gateway_async() { await _redisFixture.MessageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); //Need to receive to subscribe to feed, before we send a message. This returns an empty message we discard @@ -30,6 +29,7 @@ public async Task When_posting_a_message_via_the_messaging_gateway_async() var messageBody = sentMessage.Body.Value; await _redisFixture.MessageConsumer.AcknowledgeAsync(sentMessage); - Assert.Equal(_message.Body.Value, messageBody); + await Assert.That(messageBody).IsEqualTo(_message.Body.Value); } } + diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_posting_multiple_messages_via_the_messaging_gateway_async.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_posting_multiple_messages_via_the_messaging_gateway_async.cs index 38f1d3a37b..5516cc9979 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_posting_multiple_messages_via_the_messaging_gateway_async.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_posting_multiple_messages_via_the_messaging_gateway_async.cs @@ -1,13 +1,12 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway.Proactor; -[Collection("Redis Shared Pool")] //shared connection pool so run sequentially -[Trait("Category", "Redis")] -public class RedisMessageProducerMultipleSendTestsAsync : IClassFixture +[Category("Redis")] +[ClassDataSource(Shared = SharedType.PerClass)] + public class RedisMessageProducerMultipleSendTestsAsync { private readonly RedisFixture _redisFixture; private readonly Message _messageOne; @@ -29,7 +28,7 @@ public RedisMessageProducerMultipleSendTestsAsync(RedisFixture redisFixture) ); } - [Fact] + [Test] public async Task When_posting_multiple_messages_via_the_messaging_gateway_async() { // Need to receive to subscribe to feed, before we send a message. This returns an empty message we discard @@ -49,7 +48,8 @@ public async Task When_posting_multiple_messages_via_the_messaging_gateway_async await _redisFixture.MessageConsumer.AcknowledgeAsync(sentMessageTwo); // _should_send_a_message_via_restms_with_the_matching_body - Assert.Equal(_messageOne.Body.Value, messageBodyOne); - Assert.Equal(_messageTwo.Body.Value, messageBodyTwo); + await Assert.That(messageBodyOne).IsEqualTo(_messageOne.Body.Value); + await Assert.That(messageBodyTwo).IsEqualTo(_messageTwo.Body.Value); } } + diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs index f2b62ca57c..9638ac9ce4 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs @@ -26,13 +26,11 @@ THE SOFTWARE. */ using System.Linq; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.Redis; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway.Proactor; -[Collection("Redis Shared Pool")] -[Trait("Category", "Redis")] -[Trait("Fragile", "CI")] +[Category("Redis")] +[Property("Fragile", "CI")] public class RedisMessageConsumerDeliveryErrorDlqAsyncTests : IAsyncDisposable { private readonly RedisMessageProducer _messageProducer; @@ -62,7 +60,7 @@ public RedisMessageConsumerDeliveryErrorDlqAsyncTests() new MessageBody("test content")); } - [Fact] + [Test] public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq_async() { //Arrange - subscribe then send @@ -79,19 +77,17 @@ await _consumer.RejectAsync(receivedMessage, //Assert - message should appear on DLQ var dlqMessage = (await _dlqConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(3000))).Single(); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); // Verify rejection metadata - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(originalTopic, dlqMessage.Header.Bag["originalTopic"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.DeliveryError.ToString(), - dlqMessage.Header.Bag["rejectionReason"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal(MessageType.MT_COMMAND.ToString(), - dlqMessage.Header.Bag["originalMessageType"].ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalTopic"].ToString()).IsEqualTo(originalTopic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.DeliveryError.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalMessageType"].ToString()).IsEqualTo(MessageType.MT_COMMAND.ToString()); } public async ValueTask DisposeAsync() @@ -103,3 +99,4 @@ public async ValueTask DisposeAsync() await _messageProducer.DisposeAsync(); } } + diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_requeing_a_failed_message_async.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_requeing_a_failed_message_async.cs index 8a5ae62f31..c619c76354 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_requeing_a_failed_message_async.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Proactor/When_requeing_a_failed_message_async.cs @@ -1,13 +1,12 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway.Proactor; -[Collection("Redis Shared Pool")] //shared connection pool so run sequentially -[Trait("Category", "Redis")] -public class RedisRequeueMessageTestsAsync : IClassFixture, IAsyncDisposable +[Category("Redis")] +[ClassDataSource(Shared = SharedType.PerClass)] + public class RedisRequeueMessageTestsAsync : IAsyncDisposable { private readonly RedisFixture _redisFixture; private readonly Message _messageOne; @@ -29,7 +28,7 @@ public RedisRequeueMessageTestsAsync(RedisFixture redisFixture) ); } - [Fact] + [Test] public async Task When_requeing_a_failed_message_async() { // Need to receive to subscribe to feed, before we send a message. This returns an empty message we discard @@ -55,8 +54,8 @@ public async Task When_requeing_a_failed_message_async() await _redisFixture.MessageConsumer.AcknowledgeAsync(sentMessageOne); // _should_send_a_message_via_restms_with_the_matching_body - Assert.Equal(_messageOne.Body.Value, messageBodyOne); - Assert.Equal(_messageTwo.Body.Value, messageBodyTwo); + await Assert.That(messageBodyOne).IsEqualTo(_messageOne.Body.Value); + await Assert.That(messageBodyTwo).IsEqualTo(_messageTwo.Body.Value); } public async ValueTask DisposeAsync() @@ -65,3 +64,4 @@ public async ValueTask DisposeAsync() await _redisFixture.MessageProducer.DisposeAsync(); } } + diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_a_socket_exception_when_connecting_to_the_server.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_a_socket_exception_when_connecting_to_the_server.cs index 132e034d72..2bc0c9235a 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_a_socket_exception_when_connecting_to_the_server.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_a_socket_exception_when_connecting_to_the_server.cs @@ -1,13 +1,11 @@ -using System; +using System; using Paramore.Brighter.MessagingGateway.Redis; using Paramore.Brighter.Redis.Tests.TestDoubles; using ServiceStack.Redis; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway.Reactor; -[Collection("Redis Shared Pool")] //shared connection pool so run sequentially -[Trait("Category", "Redis")] +[Category("Redis")] public class RedisMessageConsumerRedisNotAvailableTests { private readonly ChannelName _queueName = new ChannelName("test"); @@ -23,14 +21,15 @@ public RedisMessageConsumerRedisNotAvailableTests() } - [Fact] - public void When_a_message_consumer_throws_a_socket_exception_when_connecting_to_the_server() + [Test] + public async Task When_a_message_consumer_throws_a_socket_exception_when_connecting_to_the_server() { _exception = Catch.Exception(() => _messageConsumer.Receive(TimeSpan.FromMilliseconds(1000))); - Assert.IsType(_exception); - Assert.IsType(_exception?.InnerException); + await Assert.That(_exception).IsTypeOf(); + await Assert.That(_exception?.InnerException).IsTypeOf(); } //Do not dispose a fake client } + diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_a_timeout_exception_when_connecting_to_the_pool.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_a_timeout_exception_when_connecting_to_the_pool.cs index 0079b4454f..e8043efaf2 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_a_timeout_exception_when_connecting_to_the_pool.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_a_message_consumer_throws_a_timeout_exception_when_connecting_to_the_pool.cs @@ -1,12 +1,10 @@ -using System; -using Xunit; +using System; using Paramore.Brighter.MessagingGateway.Redis; using Paramore.Brighter.Redis.Tests.TestDoubles; namespace Paramore.Brighter.Redis.Tests.MessagingGateway.Reactor; -[Collection("Redis Shared Pool")] //shared connection pool so run sequentially -[Trait("Category", "Redis")] +[Category("Redis")] public class RedisMessageConsumerOperationInterruptedTests { private readonly ChannelName _queueName = new("test"); @@ -21,14 +19,15 @@ public RedisMessageConsumerOperationInterruptedTests() _messageConsumer = new RedisMessageConsumerTimeoutOnGetClient(configuration, _queueName, _topic); } - [Fact] - public void When_a_message_consumer_throws_a_timeout_exception_when_getting_a_client_from_the_pool() + [Test] + public async Task When_a_message_consumer_throws_a_timeout_exception_when_getting_a_client_from_the_pool() { _exception = Catch.Exception(() => _messageConsumer.Receive(TimeSpan.FromMilliseconds(1000))); - Assert.IsType(_exception); - Assert.IsType(_exception?.InnerException); + await Assert.That(_exception).IsTypeOf(); + await Assert.That(_exception?.InnerException).IsTypeOf(); } //don't try to dispose, not a real client } + diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_posting_a_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_posting_a_message_via_the_messaging_gateway.cs index 99d1728d0b..2229ca8511 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_posting_a_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_posting_a_message_via_the_messaging_gateway.cs @@ -1,14 +1,13 @@ -using System; +using System; using System.Linq; using System.Net.Mime; using Paramore.Brighter.Observability; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway.Reactor; -[Collection("Redis Shared Pool")] //shared connection pool so run sequentially -[Trait("Category", "Redis")] -public class RedisMessageProducerSendTests : IClassFixture +[Category("Redis")] +[ClassDataSource(Shared = SharedType.PerClass)] + public class RedisMessageProducerSendTests { private readonly RedisFixture _redisFixture; private readonly Message _message; @@ -67,35 +66,36 @@ public RedisMessageProducerSendTests(RedisFixture redisFixture) _message = new Message(header, new MessageBody("test content")); } - [Fact] - public void When_posting_a_message_via_the_messaging_gateway() + [Test] + public async Task When_posting_a_message_via_the_messaging_gateway() { //Need to receive to subscribe to feed, before we send a message. This returns an empty message we discard - _redisFixture.MessageConsumer.Receive(TimeSpan.FromMilliseconds(1000)); + await _redisFixture.MessageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); - _redisFixture.MessageProducer.Send(_message); - var sentMessage = _redisFixture.MessageConsumer.Receive(TimeSpan.FromMilliseconds(1000)).Single(); - _redisFixture.MessageConsumer.Acknowledge(sentMessage); + await _redisFixture.MessageProducer.SendAsync(_message); + var sentMessage = (await _redisFixture.MessageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))).Single(); + await _redisFixture.MessageConsumer.AcknowledgeAsync(sentMessage); // Assert message body - Assert.Equal(_message.Body.Value, sentMessage.Body.Value); + await Assert.That(sentMessage.Body.Value).IsEqualTo(_message.Body.Value); // Assert header properties - Assert.Equal(_messageId, sentMessage.Header.MessageId); - Assert.Equal(_topic, sentMessage.Header.Topic); - Assert.Equal(MessageType.MT_COMMAND, sentMessage.Header.MessageType); - Assert.Equal(_timestamp, sentMessage.Header.TimeStamp, TimeSpan.FromSeconds(5)); - Assert.Equal(_correlationId, sentMessage.Header.CorrelationId); - Assert.Equal(_replyTo, sentMessage.Header.ReplyTo); - Assert.Equal(MediaTypeNames.Application.Json, sentMessage.Header.ContentType!.ToString()); - Assert.Equal("custom-value", sentMessage.Header.Bag["custom-header"]); - Assert.Equal(_source, sentMessage.Header.Source); - Assert.Equal(_type, sentMessage.Header.Type); - Assert.Equal(_dataSchema, sentMessage.Header.DataSchema); - Assert.Equal(_subject, sentMessage.Header.Subject); - Assert.Equal(MessageHeader.DefaultSpecVersion, sentMessage.Header.SpecVersion); - Assert.Equal(_traceParent, sentMessage.Header.TraceParent); - Assert.Equal(_traceState, sentMessage.Header.TraceState); - Assert.Equal(_baggage, sentMessage.Header.Baggage); + await Assert.That(sentMessage.Header.MessageId).IsEqualTo(_messageId); + await Assert.That(sentMessage.Header.Topic).IsEqualTo(_topic); + await Assert.That(sentMessage.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(sentMessage.Header.TimeStamp).IsEqualTo(_timestamp).Within(TimeSpan.FromSeconds(5)); + await Assert.That(sentMessage.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(sentMessage.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(sentMessage.Header.ContentType!.ToString()).IsEqualTo(MediaTypeNames.Application.Json); + await Assert.That(sentMessage.Header.Bag["custom-header"]).IsEqualTo("custom-value"); + await Assert.That(sentMessage.Header.Source).IsEqualTo(_source); + await Assert.That(sentMessage.Header.Type).IsEqualTo(_type); + await Assert.That(sentMessage.Header.DataSchema).IsEqualTo(_dataSchema); + await Assert.That(sentMessage.Header.Subject).IsEqualTo(_subject); + await Assert.That(sentMessage.Header.SpecVersion).IsEqualTo(MessageHeader.DefaultSpecVersion); + await Assert.That(sentMessage.Header.TraceParent).IsEqualTo(_traceParent); + await Assert.That(sentMessage.Header.TraceState).IsEqualTo(_traceState); + await Assert.That(sentMessage.Header.Baggage).IsEqualTo(_baggage); } } + diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_posting_multiple_messages_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_posting_multiple_messages_via_the_messaging_gateway.cs index 2037033536..6a370d7783 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_posting_multiple_messages_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_posting_multiple_messages_via_the_messaging_gateway.cs @@ -1,12 +1,11 @@ -using System; +using System; using System.Linq; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway.Reactor; -[Collection("Redis Shared Pool")] //shared connection pool so run sequentially -[Trait("Category", "Redis")] -public class RedisMessageProducerMultipleSendTests : IClassFixture +[Category("Redis")] +[ClassDataSource(Shared = SharedType.PerClass)] + public class RedisMessageProducerMultipleSendTests { private readonly RedisFixture _redisFixture; private readonly Message _messageOne; @@ -28,27 +27,28 @@ public RedisMessageProducerMultipleSendTests(RedisFixture redisFixture) ); } - [Fact] - public void When_posting_a_message_via_the_messaging_gateway() + [Test] + public async Task When_posting_a_message_via_the_messaging_gateway() { //Need to receive to subscribe to feed, before we send a message. This returns an empty message we discard - _redisFixture.MessageConsumer.Receive(TimeSpan.FromMilliseconds(1000)); + await _redisFixture.MessageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); //Send a sequence of messages, we want to check that ordering is preserved - _redisFixture.MessageProducer.Send(_messageOne); - _redisFixture.MessageProducer.Send(_messageTwo); + await _redisFixture.MessageProducer.SendAsync(_messageOne); + await _redisFixture.MessageProducer.SendAsync(_messageTwo); //Now receive, and confirm order off is order on - var sentMessageOne = _redisFixture.MessageConsumer.Receive(TimeSpan.FromMilliseconds(1000)).Single(); + var sentMessageOne = (await _redisFixture.MessageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))).Single(); var messageBodyOne = sentMessageOne.Body.Value; - _redisFixture.MessageConsumer.Acknowledge(sentMessageOne); + await _redisFixture.MessageConsumer.AcknowledgeAsync(sentMessageOne); - var sentMessageTwo = _redisFixture.MessageConsumer.Receive(TimeSpan.FromMilliseconds(1000)).Single(); + var sentMessageTwo = (await _redisFixture.MessageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))).Single(); var messageBodyTwo = sentMessageTwo.Body.Value; - _redisFixture.MessageConsumer.Acknowledge(sentMessageTwo); + await _redisFixture.MessageConsumer.AcknowledgeAsync(sentMessageTwo); //_should_send_a_message_via_restms_with_the_matching_body - Assert.Equal(_messageOne.Body.Value, messageBodyOne); - Assert.Equal(_messageTwo.Body.Value, messageBodyTwo); + await Assert.That(messageBodyOne).IsEqualTo(_messageOne.Body.Value); + await Assert.That(messageBodyTwo).IsEqualTo(_messageTwo.Body.Value); } } + diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs index a5ab401f11..25d86ba9b1 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs @@ -25,13 +25,11 @@ THE SOFTWARE. */ using System; using System.Linq; using Paramore.Brighter.MessagingGateway.Redis; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway.Reactor; -[Collection("Redis Shared Pool")] -[Trait("Category", "Redis")] -[Trait("Fragile", "CI")] +[Category("Redis")] +[Property("Fragile", "CI")] public class RedisMessageConsumerDeliveryErrorDlqTests : IDisposable { private readonly RedisMessageProducer _messageProducer; @@ -61,36 +59,34 @@ public RedisMessageConsumerDeliveryErrorDlqTests() new MessageBody("test content")); } - [Fact] - public void When_rejecting_message_with_delivery_error_should_send_to_dlq() + [Test] + public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq() { //Arrange - subscribe then send - _consumer.Receive(TimeSpan.FromMilliseconds(1000)); - _dlqConsumer.Receive(TimeSpan.FromMilliseconds(1000)); - _messageProducer.Send(_message); - var receivedMessage = _consumer.Receive(TimeSpan.FromMilliseconds(1000)).Single(); + await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); + await _dlqConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); + await _messageProducer.SendAsync(_message); + var receivedMessage = (await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))).Single(); //Act var originalTopic = receivedMessage.Header.Topic.Value; - _consumer.Reject(receivedMessage, + await _consumer.RejectAsync(receivedMessage, new MessageRejectionReason(RejectionReason.DeliveryError, "Test delivery error")); //Assert - message should appear on DLQ - var dlqMessage = _dlqConsumer.Receive(TimeSpan.FromMilliseconds(3000)).Single(); + var dlqMessage = (await _dlqConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(3000))).Single(); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); // Verify rejection metadata - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(originalTopic, dlqMessage.Header.Bag["originalTopic"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.DeliveryError.ToString(), - dlqMessage.Header.Bag["rejectionReason"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal(MessageType.MT_COMMAND.ToString(), - dlqMessage.Header.Bag["originalMessageType"].ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalTopic"].ToString()).IsEqualTo(originalTopic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.DeliveryError.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalMessageType"].ToString()).IsEqualTo(MessageType.MT_COMMAND.ToString()); } public void Dispose() @@ -102,3 +98,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_rejecting_message_with_no_channels_configured_should_remove_from_inflight.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_rejecting_message_with_no_channels_configured_should_remove_from_inflight.cs index d314a18925..70748c284a 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_rejecting_message_with_no_channels_configured_should_remove_from_inflight.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_rejecting_message_with_no_channels_configured_should_remove_from_inflight.cs @@ -25,13 +25,11 @@ THE SOFTWARE. */ using System; using System.Linq; using Paramore.Brighter.MessagingGateway.Redis; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway.Reactor; -[Collection("Redis Shared Pool")] -[Trait("Category", "Redis")] -[Trait("Fragile", "CI")] +[Category("Redis")] +[Property("Fragile", "CI")] public class RedisMessageConsumerNoChannelsRejectTests : IDisposable { private readonly RedisMessageProducer _messageProducer; @@ -56,25 +54,25 @@ public RedisMessageConsumerNoChannelsRejectTests() new MessageBody("test content")); } - [Fact] - public void When_rejecting_message_with_no_channels_configured_should_remove_from_inflight() + [Test] + public async Task When_rejecting_message_with_no_channels_configured_should_remove_from_inflight() { //Arrange - subscribe then send - _consumer.Receive(TimeSpan.FromMilliseconds(1000)); - _messageProducer.Send(_message); - var receivedMessage = _consumer.Receive(TimeSpan.FromMilliseconds(1000)).Single(); + await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); + await _messageProducer.SendAsync(_message); + var receivedMessage = (await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))).Single(); //Act - reject with DeliveryError, but no channels configured - var result = _consumer.Reject(receivedMessage, + var result = await _consumer.RejectAsync(receivedMessage, new MessageRejectionReason(RejectionReason.DeliveryError, "Test delivery error")); //Assert - reject returns true and consumer can receive again without "unacked message" error - Assert.True(result); + await Assert.That(result).IsTrue(); // This would throw ChannelFailureException("Unacked message still in flight...") // if reject didn't remove from inflight - var nextMessages = _consumer.Receive(TimeSpan.FromMilliseconds(1000)); - Assert.Empty(nextMessages); + var nextMessages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); + await Assert.That(nextMessages).IsEmpty(); } public void Dispose() @@ -84,3 +82,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs index 708fc8a050..11bd868cb9 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs @@ -25,13 +25,11 @@ THE SOFTWARE. */ using System; using System.Linq; using Paramore.Brighter.MessagingGateway.Redis; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway.Reactor; -[Collection("Redis Shared Pool")] -[Trait("Category", "Redis")] -[Trait("Fragile", "CI")] +[Category("Redis")] +[Property("Fragile", "CI")] public class RedisMessageConsumerUnacceptableFallbackToDlqTests : IDisposable { private readonly RedisMessageProducer _messageProducer; @@ -62,26 +60,25 @@ public RedisMessageConsumerUnacceptableFallbackToDlqTests() new MessageBody("test content")); } - [Fact] - public void When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq() + [Test] + public async Task When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq() { //Arrange - subscribe then send - _consumer.Receive(TimeSpan.FromMilliseconds(1000)); - _dlqConsumer.Receive(TimeSpan.FromMilliseconds(1000)); - _messageProducer.Send(_message); - var receivedMessage = _consumer.Receive(TimeSpan.FromMilliseconds(1000)).Single(); + await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); + await _dlqConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); + await _messageProducer.SendAsync(_message); + var receivedMessage = (await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))).Single(); //Act - reject with Unacceptable, but no invalid channel configured - _consumer.Reject(receivedMessage, + await _consumer.RejectAsync(receivedMessage, new MessageRejectionReason(RejectionReason.Unacceptable, "Bad message format")); //Assert - message should fall back to DLQ - var dlqMessage = _dlqConsumer.Receive(TimeSpan.FromMilliseconds(3000)).Single(); + var dlqMessage = (await _dlqConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(3000))).Single(); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); - Assert.Equal(RejectionReason.Unacceptable.ToString(), - dlqMessage.Header.Bag["rejectionReason"].ToString()); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.Unacceptable.ToString()); } public void Dispose() @@ -93,3 +90,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs index 41cd8ece58..1eb2c0b86f 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs @@ -25,13 +25,11 @@ THE SOFTWARE. */ using System; using System.Linq; using Paramore.Brighter.MessagingGateway.Redis; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway.Reactor; -[Collection("Redis Shared Pool")] -[Trait("Category", "Redis")] -[Trait("Fragile", "CI")] +[Category("Redis")] +[Property("Fragile", "CI")] public class RedisMessageConsumerUnacceptableInvalidChannelTests : IDisposable { private readonly RedisMessageProducer _messageProducer; @@ -66,31 +64,30 @@ public RedisMessageConsumerUnacceptableInvalidChannelTests() new MessageBody("test content")); } - [Fact] - public void When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel() + [Test] + public async Task When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel() { //Arrange - subscribe then send - _consumer.Receive(TimeSpan.FromMilliseconds(1000)); - _dlqConsumer.Receive(TimeSpan.FromMilliseconds(1000)); - _invalidConsumer.Receive(TimeSpan.FromMilliseconds(1000)); - _messageProducer.Send(_message); - var receivedMessage = _consumer.Receive(TimeSpan.FromMilliseconds(1000)).Single(); + await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); + await _dlqConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); + await _invalidConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); + await _messageProducer.SendAsync(_message); + var receivedMessage = (await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))).Single(); //Act - _consumer.Reject(receivedMessage, + await _consumer.RejectAsync(receivedMessage, new MessageRejectionReason(RejectionReason.Unacceptable, "Bad message format")); //Assert - message should appear on invalid channel, not on DLQ - var invalidMessage = _invalidConsumer.Receive(TimeSpan.FromMilliseconds(3000)).Single(); + var invalidMessage = (await _invalidConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(3000))).Single(); - Assert.NotEqual(MessageType.MT_NONE, invalidMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, invalidMessage.Body.Value); - Assert.Equal(RejectionReason.Unacceptable.ToString(), - invalidMessage.Header.Bag["rejectionReason"].ToString()); + await Assert.That(invalidMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(invalidMessage.Body.Value).IsEqualTo(_message.Body.Value); + await Assert.That(invalidMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.Unacceptable.ToString()); // DLQ should be empty - var dlqMessages = _dlqConsumer.Receive(TimeSpan.FromMilliseconds(1000)); - Assert.Empty(dlqMessages); + var dlqMessages = await _dlqConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); + await Assert.That(dlqMessages).IsEmpty(); } public void Dispose() @@ -104,3 +101,4 @@ public void Dispose() _messageProducer.Dispose(); } } + diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_requeing_a_failed_message.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_requeing_a_failed_message.cs index 836d71fe0f..c48aadccae 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_requeing_a_failed_message.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/Reactor/When_requeing_a_failed_message.cs @@ -1,12 +1,11 @@ -using System; +using System; using System.Linq; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway.Reactor; -[Collection("Redis Shared Pool")] //shared connection pool so run sequentially -[Trait("Category", "Redis")] -public class RedisRequeueMessageTests : IClassFixture +[Category("Redis")] +[ClassDataSource(Shared = SharedType.PerClass)] + public class RedisRequeueMessageTests { private readonly RedisFixture _redisFixture; private readonly Message _messageOne; @@ -28,32 +27,33 @@ public RedisRequeueMessageTests(RedisFixture redisFixture) ); } - [Fact] - public void When_requeing_a_failed_message() + [Test] + public async Task When_requeing_a_failed_message() { //Need to receive to subscribe to feed, before we send a message. This returns an empty message we discard - _redisFixture.MessageConsumer.Receive(TimeSpan.FromMilliseconds(1000)); + await _redisFixture.MessageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); //Send a sequence of messages, we want to check that ordering is preserved - _redisFixture.MessageProducer.Send(_messageOne); - _redisFixture.MessageProducer.Send(_messageTwo); + await _redisFixture.MessageProducer.SendAsync(_messageOne); + await _redisFixture.MessageProducer.SendAsync(_messageTwo); //Now receive, the first message - var sentMessageOne = _redisFixture.MessageConsumer.Receive(TimeSpan.FromMilliseconds(1000)).Single(); + var sentMessageOne = (await _redisFixture.MessageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))).Single(); //now requeue the first message - _redisFixture.MessageConsumer.Requeue(_messageOne); + await _redisFixture.MessageConsumer.RequeueAsync(_messageOne); //try receiving again; messageTwo should come first - var sentMessageTwo = _redisFixture.MessageConsumer.Receive(TimeSpan.FromMilliseconds(1000)).Single(); + var sentMessageTwo = (await _redisFixture.MessageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))).Single(); var messageBodyTwo = sentMessageTwo.Body.Value; - _redisFixture.MessageConsumer.Acknowledge(sentMessageTwo); + await _redisFixture.MessageConsumer.AcknowledgeAsync(sentMessageTwo); - sentMessageOne = _redisFixture.MessageConsumer.Receive(TimeSpan.FromMilliseconds(1000)).Single(); + sentMessageOne = (await _redisFixture.MessageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000))).Single(); var messageBodyOne = sentMessageOne.Body.Value; - _redisFixture.MessageConsumer.Acknowledge(sentMessageOne); + await _redisFixture.MessageConsumer.AcknowledgeAsync(sentMessageOne); - Assert.Equal(_messageOne.Body.Value, messageBodyOne); - Assert.Equal(_messageTwo.Body.Value, messageBodyTwo); + await Assert.That(messageBodyOne).IsEqualTo(_messageOne.Body.Value); + await Assert.That(messageBodyTwo).IsEqualTo(_messageTwo.Body.Value); } } + diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/RedisFixture.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/RedisFixture.cs index 35e35986bc..686551e3ef 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/RedisFixture.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/RedisFixture.cs @@ -4,7 +4,7 @@ namespace Paramore.Brighter.Redis.Tests.MessagingGateway { - public class RedisFixture : IAsyncDisposable, IDisposable + public class RedisFixture : IAsyncDisposable { public readonly RoutingKey Topic; public readonly RedisMessageProducer MessageProducer; @@ -34,11 +34,12 @@ public static RedisMessagingGatewayConfiguration RedisMessagingGatewayConfigurat return configuration; } - public void Dispose() + [After(Test)] + public async Task Cleanup() { - MessageConsumer.Purge(); - MessageConsumer.Dispose(); - MessageProducer.Dispose(); + await MessageConsumer.PurgeAsync(); + await MessageConsumer.DisposeAsync(); + await MessageProducer.DisposeAsync(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_creating_redis_consumer_with_dlq_subscription_should_pass_routing_keys.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_creating_redis_consumer_with_dlq_subscription_should_pass_routing_keys.cs index 866b32f1d7..1ed55d7fb5 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_creating_redis_consumer_with_dlq_subscription_should_pass_routing_keys.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_creating_redis_consumer_with_dlq_subscription_should_pass_routing_keys.cs @@ -26,7 +26,6 @@ THE SOFTWARE. */ using System.Reflection; using Paramore.Brighter.MessagingGateway.Redis; using Paramore.Brighter.Redis.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway; @@ -42,8 +41,8 @@ public RedisMessageConsumerFactoryDlqTests() _factory = new RedisMessageConsumerFactory(configuration); } - [Fact] - public void When_creating_redis_consumer_with_dlq_subscription_should_pass_routing_keys() + [Test] + public async Task When_creating_redis_consumer_with_dlq_subscription_should_pass_routing_keys() { //Arrange var dlqRoutingKey = new RoutingKey("orders-dlq"); @@ -61,7 +60,7 @@ public void When_creating_redis_consumer_with_dlq_subscription_should_pass_routi _consumer = _factory.Create(subscription); //Assert - verify the factory passed routing keys to the consumer - Assert.NotNull(_consumer); + await Assert.That(_consumer).IsNotNull(); var consumerType = _consumer.GetType(); var dlqField = consumerType.GetField("_deadLetterRoutingKey", @@ -69,17 +68,17 @@ public void When_creating_redis_consumer_with_dlq_subscription_should_pass_routi var invalidField = consumerType.GetField("_invalidMessageRoutingKey", BindingFlags.NonPublic | BindingFlags.Instance); - Assert.NotNull(dlqField); - Assert.NotNull(invalidField); + await Assert.That(dlqField).IsNotNull(); + await Assert.That(invalidField).IsNotNull(); var actualDlq = dlqField.GetValue(_consumer) as RoutingKey; var actualInvalid = invalidField.GetValue(_consumer) as RoutingKey; - Assert.NotNull(actualDlq); - Assert.Equal("orders-dlq", actualDlq.Value); + await Assert.That(actualDlq).IsNotNull(); + await Assert.That(actualDlq.Value).IsEqualTo("orders-dlq"); - Assert.NotNull(actualInvalid); - Assert.Equal("orders-invalid", actualInvalid.Value); + await Assert.That(actualInvalid).IsNotNull(); + await Assert.That(actualInvalid.Value).IsEqualTo("orders-invalid"); } public void Dispose() diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_creating_redis_subscription_with_dlq_routing_keys_should_expose_properties.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_creating_redis_subscription_with_dlq_routing_keys_should_expose_properties.cs index a6321a0df0..a01b0d99fc 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_creating_redis_subscription_with_dlq_routing_keys_should_expose_properties.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_creating_redis_subscription_with_dlq_routing_keys_should_expose_properties.cs @@ -24,14 +24,13 @@ THE SOFTWARE. */ using Paramore.Brighter.MessagingGateway.Redis; using Paramore.Brighter.Redis.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway; public class RedisSubscriptionDlqRoutingKeyTests { - [Fact] - public void When_creating_redis_subscription_with_dlq_routing_keys_should_expose_properties() + [Test] + public async Task When_creating_redis_subscription_with_dlq_routing_keys_should_expose_properties() { //Arrange var deadLetterRoutingKey = new RoutingKey("orders-dlq"); @@ -47,17 +46,17 @@ public void When_creating_redis_subscription_with_dlq_routing_keys_should_expose ); //Assert - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var dlqSupport = (IUseBrighterDeadLetterSupport)subscription; - Assert.Equal(deadLetterRoutingKey, dlqSupport.DeadLetterRoutingKey); + await Assert.That(dlqSupport.DeadLetterRoutingKey).IsEqualTo(deadLetterRoutingKey); - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var invalidSupport = (IUseBrighterInvalidMessageSupport)subscription; - Assert.Equal(invalidMessageRoutingKey, invalidSupport.InvalidMessageRoutingKey); + await Assert.That(invalidSupport.InvalidMessageRoutingKey).IsEqualTo(invalidMessageRoutingKey); } - [Fact] - public void When_creating_redis_subscription_without_dlq_routing_keys_should_default_to_null() + [Test] + public async Task When_creating_redis_subscription_without_dlq_routing_keys_should_default_to_null() { //Arrange & Act var subscription = new RedisSubscription( @@ -67,12 +66,12 @@ public void When_creating_redis_subscription_without_dlq_routing_keys_should_def ); //Assert - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var dlqSupport = (IUseBrighterDeadLetterSupport)subscription; - Assert.Null(dlqSupport.DeadLetterRoutingKey); + await Assert.That(dlqSupport.DeadLetterRoutingKey).IsNull(); - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var invalidSupport = (IUseBrighterInvalidMessageSupport)subscription; - Assert.Null(invalidSupport.InvalidMessageRoutingKey); + await Assert.That(invalidSupport.InvalidMessageRoutingKey).IsNull(); } } diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_overriding_client_configuration_via_the_gateway.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_overriding_client_configuration_via_the_gateway.cs index d53624ebd1..46d4689c3c 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_overriding_client_configuration_via_the_gateway.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_overriding_client_configuration_via_the_gateway.cs @@ -1,17 +1,15 @@ -using System; -using Xunit; +using System; using Paramore.Brighter.MessagingGateway.Redis; using Paramore.Brighter.Redis.Tests.TestDoubles; using ServiceStack.Redis; namespace Paramore.Brighter.Redis.Tests.MessagingGateway; -[Collection("Redis Shared Pool")] //shared connection pool so run sequentially -[Trait("Category", "Redis")] +[Category("Redis")] public class RedisGatewayConfigurationTests { - [Fact] - public void When_overriding_client_configuration_via_the_gateway() + [Test] + public async Task When_overriding_client_configuration_via_the_gateway() { var configuration = new RedisMessagingGatewayConfiguration { @@ -32,17 +30,18 @@ public void When_overriding_client_configuration_via_the_gateway() using var gateway = new TestRedisGateway(configuration, RoutingKey.Empty); //Redis Config is static, so we can just look at the values we should have initialized - Assert.Equal(configuration.BackoffMultiplier.Value, RedisConfig.BackOffMultiplier); - Assert.Equal(configuration.BackoffMultiplier.Value, RedisConfig.BackOffMultiplier); - Assert.Equal(configuration.DeactivatedClientsExpiry.Value, RedisConfig.DeactivatedClientsExpiry); - Assert.Equal(configuration.DefaultConnectTimeout.Value, RedisConfig.DefaultConnectTimeout); - Assert.Equal(configuration.DefaultIdleTimeOutSecs.Value, RedisConfig.DefaultIdleTimeOutSecs); - Assert.Equal(configuration.DefaultReceiveTimeout.Value, RedisConfig.DefaultReceiveTimeout); - Assert.Equal(configuration.DefaultSendTimeout.Value, RedisConfig.DefaultSendTimeout); - Assert.Equal(!configuration.DisableVerboseLogging.Value, RedisConfig.EnableVerboseLogging); - Assert.Equal(configuration.HostLookupTimeoutMs.Value, RedisConfig.HostLookupTimeoutMs); - Assert.Equal(configuration.MaxPoolSize.Value, RedisConfig.DefaultMaxPoolSize); - Assert.Equal(configuration.MessageTimeToLive.Value, gateway.MessageTimeToLive); - Assert.Equal(configuration.VerifyMasterConnections.Value, RedisConfig.VerifyMasterConnections); + await Assert.That(RedisConfig.BackOffMultiplier).IsEqualTo(configuration.BackoffMultiplier.Value); + await Assert.That(RedisConfig.BackOffMultiplier).IsEqualTo(configuration.BackoffMultiplier.Value); + await Assert.That(RedisConfig.DeactivatedClientsExpiry).IsEqualTo(configuration.DeactivatedClientsExpiry.Value); + await Assert.That(RedisConfig.DefaultConnectTimeout).IsEqualTo(configuration.DefaultConnectTimeout.Value); + await Assert.That(RedisConfig.DefaultIdleTimeOutSecs).IsEqualTo(configuration.DefaultIdleTimeOutSecs.Value); + await Assert.That(RedisConfig.DefaultReceiveTimeout).IsEqualTo(configuration.DefaultReceiveTimeout.Value); + await Assert.That(RedisConfig.DefaultSendTimeout).IsEqualTo(configuration.DefaultSendTimeout.Value); + await Assert.That(RedisConfig.EnableVerboseLogging).IsEqualTo(!configuration.DisableVerboseLogging.Value); + await Assert.That(RedisConfig.HostLookupTimeoutMs).IsEqualTo(configuration.HostLookupTimeoutMs.Value); + await Assert.That(RedisConfig.DefaultMaxPoolSize).IsEqualTo(configuration.MaxPoolSize.Value); + await Assert.That(gateway.MessageTimeToLive).IsEqualTo(configuration.MessageTimeToLive.Value); + await Assert.That(RedisConfig.VerifyMasterConnections).IsEqualTo(configuration.VerifyMasterConnections.Value); } } + diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_parsing_a_good_redis_message_to_brighter.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_parsing_a_good_redis_message_to_brighter.cs index 9803217839..2e9cae54a9 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_parsing_a_good_redis_message_to_brighter.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_parsing_a_good_redis_message_to_brighter.cs @@ -1,45 +1,44 @@ -using System; +using System; using System.Collections.Generic; -using Xunit; using Paramore.Brighter.MessagingGateway.Redis; using Paramore.Brighter.Observability; namespace Paramore.Brighter.Redis.Tests.MessagingGateway; -[Collection("Redis Shared Pool")] //shared connection pool so run sequentially -[Trait("Category", "Redis")] +[Category("Redis")] public class RedisGoodMessageParsingTests { private const string GoodMessage = "\n"; - [Fact] - public void When_parsing_a_good_redis_message_to_brighter() + [Test] + public async Task When_parsing_a_good_redis_message_to_brighter() { Message message = RedisMessageCreator.CreateMessage(GoodMessage); // Assert existing properties - Assert.Equal(DateTime.Parse("2018-02-07T09:38:36Z"), message.Header.TimeStamp); - Assert.Equal("test", message.Header.Topic.Value); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); - Assert.Equal(3, message.Header.HandledCount); - Assert.Equal(TimeSpan.FromMilliseconds(200), message.Header.Delayed); - Assert.Equal("0AF88BBC-07FD-4FC3-9CA7-BF68415A2535", message.Header.CorrelationId); - Assert.Equal("text/plain", message.Header.ContentType!.ToString()); - Assert.Equal("reply.queue", message.Header.ReplyTo!.ToString()); + await Assert.That(message.Header.TimeStamp).IsEqualTo(DateTime.Parse("2018-02-07T09:38:36Z")); + await Assert.That(message.Header.Topic.Value).IsEqualTo("test"); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); + await Assert.That(message.Header.HandledCount).IsEqualTo(3); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.FromMilliseconds(200)); + await Assert.That(message.Header.CorrelationId).IsEqualTo("0AF88BBC-07FD-4FC3-9CA7-BF68415A2535"); + await Assert.That(message.Header.ContentType!.ToString()).IsEqualTo("text/plain"); + await Assert.That(message.Header.ReplyTo!.ToString()).IsEqualTo("reply.queue"); // Assert new Cloud Events properties - Assert.Equal(new Uri("http://goparamore.io"), message.Header.Source); - Assert.Equal("goparamore.io.Paramore.Brighter.Message", message.Header.Type); - Assert.Equal(new Uri("http://schema.example.com/test"), message.Header.DataSchema); - Assert.Equal("test-subject", message.Header.Subject); + await Assert.That(message.Header.Source).IsEqualTo(new Uri("http://goparamore.io")); + await Assert.That(message.Header.Type).IsEqualTo("goparamore.io.Paramore.Brighter.Message"); + await Assert.That(message.Header.DataSchema).IsEqualTo(new Uri("http://schema.example.com/test")); + await Assert.That(message.Header.Subject).IsEqualTo("test-subject"); // Assert W3C Trace Context properties - Assert.Equal(new TraceParent("00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01"), message.Header.TraceParent); - Assert.Equal(new TraceState("congo=t61rcWkgMzE"), message.Header.TraceState); - Assert.Contains(new KeyValuePair("userId", "alice"), message.Header.Baggage); + await Assert.That(message.Header.TraceParent).IsEqualTo(new TraceParent("00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01")); + await Assert.That(message.Header.TraceState).IsEqualTo(new TraceState("congo=t61rcWkgMzE")); + await Assert.That(message.Header.Baggage).Contains(new KeyValuePair("userId", "alice")); // Assert message body - Assert.Equal("more test content", message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo("more test content"); } } + diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_channel_factory_forwards_scheduler_to_consumers.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_channel_factory_forwards_scheduler_to_consumers.cs index 59729b37af..0faff2a47d 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_channel_factory_forwards_scheduler_to_consumers.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_channel_factory_forwards_scheduler_to_consumers.cs @@ -21,7 +21,6 @@ THE SOFTWARE. */ #endregion using Paramore.Brighter.MessagingGateway.Redis; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway; @@ -33,8 +32,8 @@ public class When_redis_channel_factory_forwards_scheduler_to_consumers MaxPoolSize = 10 }; - [Fact] - public void Should_forward_scheduler_to_consumer_factory() + [Test] + public async Task Should_forward_scheduler_to_consumer_factory() { // Arrange var consumerFactory = new RedisMessageConsumerFactory(_configuration); @@ -45,11 +44,11 @@ public void Should_forward_scheduler_to_consumer_factory() ((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler = scheduler; // Assert — the consumer factory received the scheduler - Assert.Same(scheduler, consumerFactory.Scheduler); + await Assert.That(consumerFactory.Scheduler).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_read_scheduler_from_consumer_factory() + [Test] + public async Task Should_read_scheduler_from_consumer_factory() { // Arrange — consumer factory has a scheduler from construction var scheduler = new StubMessageScheduler(); @@ -57,7 +56,7 @@ public void Should_read_scheduler_from_consumer_factory() var channelFactory = new ChannelFactory(consumerFactory); // Assert — channel factory reads from the consumer factory - Assert.Same(scheduler, ((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler); + await Assert.That(((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler).IsSameReferenceAs(scheduler); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_channel_factory_has_scheduler_should_pass_to_consumers.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_channel_factory_has_scheduler_should_pass_to_consumers.cs index 2d609d3809..49f9ee41c6 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_channel_factory_has_scheduler_should_pass_to_consumers.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_channel_factory_has_scheduler_should_pass_to_consumers.cs @@ -1,5 +1,4 @@ using Paramore.Brighter.MessagingGateway.Redis; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway; @@ -19,19 +18,19 @@ public class When_redis_channel_factory_has_scheduler_should_pass_to_consumers messagePumpType: MessagePumpType.Reactor ); - [Fact] - public void Should_implement_channel_factory_with_scheduler() + [Test] + public async Task Should_implement_channel_factory_with_scheduler() { // Arrange var consumerFactory = new RedisMessageConsumerFactory(_configuration); var channelFactory = new ChannelFactory(consumerFactory); // Assert - Assert.IsAssignableFrom(channelFactory); + await Assert.That(channelFactory).IsAssignableTo(); } - [Fact] - public void Should_create_sync_channel_when_scheduler_set() + [Test] + public async Task Should_create_sync_channel_when_scheduler_set() { // Arrange var scheduler = new StubMessageScheduler(); @@ -43,12 +42,12 @@ public void Should_create_sync_channel_when_scheduler_set() var channel = channelFactory.CreateSyncChannel(_subscription); // Assert - Assert.NotNull(channel); - Assert.IsType(channel); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsTypeOf(); } - [Fact] - public void Should_create_async_channel_when_scheduler_set() + [Test] + public async Task Should_create_async_channel_when_scheduler_set() { // Arrange var scheduler = new StubMessageScheduler(); @@ -57,15 +56,15 @@ public void Should_create_async_channel_when_scheduler_set() ((IAmAChannelFactoryWithScheduler)channelFactory).Scheduler = scheduler; // Act - var channel = channelFactory.CreateAsyncChannel(_subscription); + var channel = await channelFactory.CreateAsyncChannelAsync(_subscription); // Assert - Assert.NotNull(channel); - Assert.IsType(channel); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsTypeOf(); } - [Fact] - public void Should_create_channel_without_scheduler_for_backward_compat() + [Test] + public async Task Should_create_channel_without_scheduler_for_backward_compat() { // Arrange — no scheduler set var consumerFactory = new RedisMessageConsumerFactory(_configuration); @@ -75,8 +74,8 @@ public void Should_create_channel_without_scheduler_for_backward_compat() var channel = channelFactory.CreateSyncChannel(_subscription); // Assert - Assert.NotNull(channel); - Assert.IsType(channel); + await Assert.That(channel).IsNotNull(); + await Assert.That(channel).IsTypeOf(); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_creates_producer_should_configure_and_dispose_correctly.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_creates_producer_should_configure_and_dispose_correctly.cs index 9303250b98..a1d80032eb 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_creates_producer_should_configure_and_dispose_correctly.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_creates_producer_should_configure_and_dispose_correctly.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2024 Ian Cooper @@ -25,7 +25,6 @@ THE SOFTWARE. */ using System; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.Redis; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway; @@ -34,12 +33,11 @@ namespace Paramore.Brighter.Redis.Tests.MessagingGateway; /// lazily-created requeue producer, and that disposal works in all cases. /// Uses a non-zero delay to exercise the full scheduler path (lesson from Kafka/MQTT). /// -[Collection("Redis Shared Pool")] //shared connection pool so run sequentially -[Trait("Category", "Redis")] +[Category("Redis")] public class When_redis_consumer_creates_producer_should_configure_and_dispose_correctly { - [Fact] - public void When_requeuing_with_delay_should_wire_scheduler_to_producer() + [Test] + public async Task When_requeuing_with_delay_should_wire_scheduler_to_producer() { // Arrange var configuration = RedisFixture.RedisMessagingGatewayConfiguration(); @@ -55,19 +53,19 @@ public void When_requeuing_with_delay_should_wire_scheduler_to_producer() new MessageBody("test scheduler wiring")); // Act - requeue with non-zero delay to exercise the scheduler path - consumer.Requeue(message, TimeSpan.FromSeconds(5)); + await consumer.RequeueAsync(message, TimeSpan.FromSeconds(5)); // Assert - scheduler was called, proving it was wired through to the producer - Assert.True(scheduler.ScheduleCalled); - Assert.Equal(message.Body.Value, scheduler.ScheduledMessage?.Body.Value); - Assert.Equal(TimeSpan.FromSeconds(5), scheduler.ScheduledDelay); + await Assert.That(scheduler.ScheduleCalled).IsTrue(); + await Assert.That(scheduler.ScheduledMessage?.Body.Value).IsEqualTo(message.Body.Value); + await Assert.That(scheduler.ScheduledDelay).IsEqualTo(TimeSpan.FromSeconds(5)); // Cleanup - consumer.Dispose(); + await consumer.DisposeAsync(); } - [Fact] - public void When_disposing_after_requeue_should_not_throw() + [Test] + public async Task When_disposing_after_requeue_should_not_throw() { // Arrange var configuration = RedisFixture.RedisMessagingGatewayConfiguration(); @@ -82,15 +80,14 @@ public void When_disposing_after_requeue_should_not_throw() new MessageHeader(Guid.NewGuid().ToString(), topic, MessageType.MT_COMMAND), new MessageBody("test dispose after requeue")); - consumer.Requeue(message, TimeSpan.FromSeconds(5)); + await consumer.RequeueAsync(message, TimeSpan.FromSeconds(5)); // Act & Assert - dispose after producer was created should not throw - var exception = Record.Exception(() => consumer.Dispose()); - Assert.Null(exception); + await Assert.That(() => consumer.Dispose()).ThrowsNothing(); } - [Fact] - public void When_disposing_without_requeue_should_not_throw() + [Test] + public async Task When_disposing_without_requeue_should_not_throw() { // Arrange - create consumer but never requeue (producer never created) var configuration = RedisFixture.RedisMessagingGatewayConfiguration(); @@ -102,11 +99,10 @@ public void When_disposing_without_requeue_should_not_throw() var consumer = new RedisMessageConsumer(configuration, queueName, topic, scheduler); // Act & Assert - dispose without producer creation should not throw - var exception = Record.Exception(() => consumer.Dispose()); - Assert.Null(exception); + await Assert.That(() => consumer.Dispose()).ThrowsNothing(); } - [Fact] + [Test] public async Task When_disposing_async_after_requeue_should_not_throw() { // Arrange @@ -122,11 +118,10 @@ public async Task When_disposing_async_after_requeue_should_not_throw() new MessageHeader(Guid.NewGuid().ToString(), topic, MessageType.MT_COMMAND), new MessageBody("test async dispose after requeue")); - consumer.Requeue(message, TimeSpan.FromSeconds(5)); + await consumer.RequeueAsync(message, TimeSpan.FromSeconds(5)); // Act & Assert - async dispose after producer was created should not throw - var exception = await Record.ExceptionAsync(async () => await consumer.DisposeAsync()); - Assert.Null(exception); + await Assert.That(async () => await consumer.DisposeAsync()).ThrowsNothing(); } private sealed class SpySchedulerSync : IAmAMessageSchedulerSync @@ -155,3 +150,4 @@ public string Schedule(Message message, TimeSpan delay) public void Cancel(string id) { } } } + diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_factory_creates_consumer_should_pass_scheduler.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_factory_creates_consumer_should_pass_scheduler.cs index 7f25b8d0e0..613c2fddc1 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_factory_creates_consumer_should_pass_scheduler.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_factory_creates_consumer_should_pass_scheduler.cs @@ -21,7 +21,6 @@ THE SOFTWARE. */ #endregion using Paramore.Brighter.MessagingGateway.Redis; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway; @@ -41,8 +40,8 @@ public class When_redis_consumer_factory_creates_consumer_should_pass_scheduler messagePumpType: MessagePumpType.Reactor ); - [Fact] - public void Should_create_sync_consumer_when_scheduler_provided() + [Test] + public async Task Should_create_sync_consumer_when_scheduler_provided() { // Arrange — factory constructed with a scheduler var scheduler = new StubMessageScheduler(); @@ -52,12 +51,12 @@ public void Should_create_sync_consumer_when_scheduler_provided() var consumer = factory.Create(_subscription); // Assert — consumer is created successfully - Assert.NotNull(consumer); - Assert.IsType(consumer); + await Assert.That(consumer).IsNotNull(); + await Assert.That(consumer).IsTypeOf(); } - [Fact] - public void Should_create_async_consumer_when_scheduler_provided() + [Test] + public async Task Should_create_async_consumer_when_scheduler_provided() { // Arrange — factory constructed with a scheduler var scheduler = new StubMessageScheduler(); @@ -67,12 +66,12 @@ public void Should_create_async_consumer_when_scheduler_provided() var consumer = factory.CreateAsync(_subscription); // Assert — consumer is created successfully - Assert.NotNull(consumer); - Assert.IsType(consumer); + await Assert.That(consumer).IsNotNull(); + await Assert.That(consumer).IsTypeOf(); } - [Fact] - public void Should_create_consumer_without_scheduler_for_backward_compat() + [Test] + public async Task Should_create_consumer_without_scheduler_for_backward_compat() { // Arrange — factory constructed without a scheduler (backward compat) var factory = new RedisMessageConsumerFactory(_configuration); @@ -81,8 +80,8 @@ public void Should_create_consumer_without_scheduler_for_backward_compat() var consumer = factory.Create(_subscription); // Assert — consumer is created successfully without scheduler - Assert.NotNull(consumer); - Assert.IsType(consumer); + await Assert.That(consumer).IsNotNull(); + await Assert.That(consumer).IsTypeOf(); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_factory_scheduler_set_after_construction.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_factory_scheduler_set_after_construction.cs index 1cc64df606..d8fdf5e7fb 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_factory_scheduler_set_after_construction.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_factory_scheduler_set_after_construction.cs @@ -21,7 +21,6 @@ THE SOFTWARE. */ #endregion using Paramore.Brighter.MessagingGateway.Redis; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway; @@ -33,8 +32,8 @@ public class When_redis_consumer_factory_scheduler_set_after_construction MaxPoolSize = 10 }; - [Fact] - public void Should_expose_scheduler_set_after_construction() + [Test] + public async Task Should_expose_scheduler_set_after_construction() { // Arrange — factory constructed without a scheduler var factory = new RedisMessageConsumerFactory(_configuration); @@ -44,22 +43,22 @@ public void Should_expose_scheduler_set_after_construction() factory.Scheduler = scheduler; // Assert — scheduler property reflects the updated value - Assert.Same(scheduler, factory.Scheduler); + await Assert.That(factory.Scheduler).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_use_constructor_scheduler_when_property_not_set() + [Test] + public async Task Should_use_constructor_scheduler_when_property_not_set() { // Arrange — factory constructed with a scheduler via constructor var scheduler = new StubMessageScheduler(); var factory = new RedisMessageConsumerFactory(_configuration, scheduler); // Assert — scheduler property reflects the constructor value - Assert.Same(scheduler, factory.Scheduler); + await Assert.That(factory.Scheduler).IsSameReferenceAs(scheduler); } - [Fact] - public void Should_override_constructor_scheduler_with_property() + [Test] + public async Task Should_override_constructor_scheduler_with_property() { // Arrange — factory constructed with one scheduler var originalScheduler = new StubMessageScheduler(); @@ -70,8 +69,8 @@ public void Should_override_constructor_scheduler_with_property() factory.Scheduler = overrideScheduler; // Assert — property reflects the override, not the original - Assert.Same(overrideScheduler, factory.Scheduler); - Assert.NotSame(originalScheduler, factory.Scheduler); + await Assert.That(factory.Scheduler).IsSameReferenceAs(overrideScheduler); + await Assert.That(factory.Scheduler).IsNotSameReferenceAs(originalScheduler); } private class StubMessageScheduler : IAmAMessageScheduler; diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_requeues_async_with_delay_should_use_producer.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_requeues_async_with_delay_should_use_producer.cs index af0ffb83d3..8021731776 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_requeues_async_with_delay_should_use_producer.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_requeues_async_with_delay_should_use_producer.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2024 Ian Cooper @@ -26,7 +26,6 @@ THE SOFTWARE. */ using System.Threading; using System.Threading.Tasks; using Paramore.Brighter.MessagingGateway.Redis; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway; @@ -35,8 +34,7 @@ namespace Paramore.Brighter.Redis.Tests.MessagingGateway; /// it should delegate to the lazily-created producer's SendWithDelayAsync rather than /// adding it back to the list immediately. /// -[Collection("Redis Shared Pool")] //shared connection pool so run sequentially -[Trait("Category", "Redis")] +[Category("Redis")] public class When_redis_consumer_requeues_async_with_delay_should_use_producer : IAsyncDisposable { private readonly RedisMessageConsumer _consumer; @@ -59,19 +57,19 @@ public When_redis_consumer_requeues_async_with_delay_should_use_producer() new MessageBody("test content for async delayed requeue")); } - [Fact] + [Test] public async Task When_requeuing_async_with_delay_should_use_producer() { // Act - requeue with non-zero delay var result = await _consumer.RequeueAsync(_message, TimeSpan.FromSeconds(5)); // Assert - should return true - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - async scheduler should have been called via the producer path - Assert.True(_scheduler.ScheduleAsyncCalled); - Assert.Equal(_message.Body.Value, _scheduler.ScheduledMessage?.Body.Value); - Assert.Equal(TimeSpan.FromSeconds(5), _scheduler.ScheduledDelay); + await Assert.That(_scheduler.ScheduleAsyncCalled).IsTrue(); + await Assert.That(_scheduler.ScheduledMessage?.Body.Value).IsEqualTo(_message.Body.Value); + await Assert.That(_scheduler.ScheduledDelay).IsEqualTo(TimeSpan.FromSeconds(5)); } public ValueTask DisposeAsync() @@ -110,3 +108,4 @@ public Task CancelAsync(string id, CancellationToken cancellationToken = default => Task.CompletedTask; } } + diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_requeues_with_delay_should_use_producer.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_requeues_with_delay_should_use_producer.cs index a477e29495..86d524083d 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_requeues_with_delay_should_use_producer.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_requeues_with_delay_should_use_producer.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2024 Ian Cooper @@ -24,7 +24,6 @@ THE SOFTWARE. */ using System; using Paramore.Brighter.MessagingGateway.Redis; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway; @@ -33,8 +32,7 @@ namespace Paramore.Brighter.Redis.Tests.MessagingGateway; /// to a lazily-created producer's SendWithDelay rather than adding it back to the list immediately. /// This ensures the delay is respected via the scheduler instead of being ignored. /// -[Collection("Redis Shared Pool")] //shared connection pool so run sequentially -[Trait("Category", "Redis")] +[Category("Redis")] public class When_redis_consumer_requeues_with_delay_should_use_producer : IDisposable { private readonly RedisMessageConsumer _consumer; @@ -57,19 +55,19 @@ public When_redis_consumer_requeues_with_delay_should_use_producer() new MessageBody("test content for delayed requeue")); } - [Fact] - public void When_requeuing_with_delay_should_use_producer() + [Test] + public async Task When_requeuing_with_delay_should_use_producer() { // Act - requeue with non-zero delay - var result = _consumer.Requeue(_message, TimeSpan.FromSeconds(5)); + var result = await _consumer.RequeueAsync(_message, TimeSpan.FromSeconds(5)); // Assert - should return true - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - scheduler should have been called via the producer path - Assert.True(_scheduler.ScheduleCalled); - Assert.Equal(_message.Body.Value, _scheduler.ScheduledMessage?.Body.Value); - Assert.Equal(TimeSpan.FromSeconds(5), _scheduler.ScheduledDelay); + await Assert.That(_scheduler.ScheduleCalled).IsTrue(); + await Assert.That(_scheduler.ScheduledMessage?.Body.Value).IsEqualTo(_message.Body.Value); + await Assert.That(_scheduler.ScheduledDelay).IsEqualTo(TimeSpan.FromSeconds(5)); } public void Dispose() @@ -103,3 +101,4 @@ public string Schedule(Message message, TimeSpan delay) public void Cancel(string id) { } } } + diff --git a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_requeues_with_zero_delay_should_use_direct_list.cs b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_requeues_with_zero_delay_should_use_direct_list.cs index c06a64f9ea..ff48d9b7c5 100644 --- a/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_requeues_with_zero_delay_should_use_direct_list.cs +++ b/tests/Paramore.Brighter.Redis.Tests/MessagingGateway/When_redis_consumer_requeues_with_zero_delay_should_use_direct_list.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2024 Ian Cooper @@ -24,7 +24,6 @@ THE SOFTWARE. */ using System; using Paramore.Brighter.MessagingGateway.Redis; -using Xunit; namespace Paramore.Brighter.Redis.Tests.MessagingGateway; @@ -33,8 +32,7 @@ namespace Paramore.Brighter.Redis.Tests.MessagingGateway; /// direct Redis list operations rather than creating a producer. This preserves existing /// behavior and ensures immediate requeue without scheduler overhead. /// -[Collection("Redis Shared Pool")] //shared connection pool so run sequentially -[Trait("Category", "Redis")] +[Category("Redis")] public class When_redis_consumer_requeues_with_zero_delay_should_use_direct_list : IDisposable { private readonly RedisMessageConsumer _consumer; @@ -57,25 +55,25 @@ public When_redis_consumer_requeues_with_zero_delay_should_use_direct_list() new MessageBody("test content for zero delay requeue")); } - [Fact] - public void When_requeuing_with_zero_delay_should_not_use_scheduler() + [Test] + public async Task When_requeuing_with_zero_delay_should_not_use_scheduler() { // Act - requeue with zero delay; the direct Redis list path will be attempted // which may fail without Redis, but the scheduler must NOT be called - Record.Exception(() => _consumer.Requeue(_message, TimeSpan.Zero)); + await _consumer.RequeueAsync(_message, TimeSpan.Zero); // Assert - scheduler should NOT have been called - Assert.False(_scheduler.ScheduleCalled); + await Assert.That(_scheduler.ScheduleCalled).IsFalse(); } - [Fact] - public void When_requeuing_with_null_delay_should_not_use_scheduler() + [Test] + public async Task When_requeuing_with_null_delay_should_not_use_scheduler() { // Act - requeue with null delay (defaults to zero) - Record.Exception(() => _consumer.Requeue(_message)); + await _consumer.RequeueAsync(_message); // Assert - scheduler should NOT have been called - Assert.False(_scheduler.ScheduleCalled); + await Assert.That(_scheduler.ScheduleCalled).IsFalse(); } public void Dispose() @@ -104,3 +102,4 @@ public string Schedule(Message message, TimeSpan delay) public void Cancel(string id) { } } } + diff --git a/tests/Paramore.Brighter.Redis.Tests/Paramore.Brighter.Redis.Tests.csproj b/tests/Paramore.Brighter.Redis.Tests/Paramore.Brighter.Redis.Tests.csproj index 7a00207b22..b6ee8a6e57 100644 --- a/tests/Paramore.Brighter.Redis.Tests/Paramore.Brighter.Redis.Tests.csproj +++ b/tests/Paramore.Brighter.Redis.Tests/Paramore.Brighter.Redis.Tests.csproj @@ -1,29 +1,12 @@ - - - $(BrighterTestTargetFrameworks) - false - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - + + $(BrighterTestTargetFrameworks) + false + Exe + + + + + + + \ No newline at end of file diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessageDispatch/When_building_a_dispatcher.cs b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessageDispatch/When_building_a_dispatcher.cs index 30c085aaf7..f552721faa 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessageDispatch/When_building_a_dispatcher.cs +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessageDispatch/When_building_a_dispatcher.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Org.Apache.Rocketmq; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.MessagingGateway.RocketMQ; @@ -8,7 +8,6 @@ using Paramore.Brighter.ServiceActivator; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.RocketMQ.Tests.MessageDispatch; @@ -65,15 +64,15 @@ public DispatchBuilderTests() .ConfigureInstrumentation(tracer); } - [Fact] - public void When_Building_A_Dispatcher() + [Test] + public async Task When_Building_A_Dispatcher() { _dispatcher = _builder.Build(); - Assert.NotNull(_dispatcher); - Assert.NotNull(GetConnection("foo")); - Assert.NotNull(GetConnection("bar")); - Assert.Equal(DispatcherState.DS_AWAITING, _dispatcher.State); + await Assert.That(_dispatcher).IsNotNull(); + await Assert.That(GetConnection("foo")).IsNotNull(); + await Assert.That(GetConnection("bar")).IsNotNull(); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_AWAITING); Thread.Sleep(1000); @@ -81,11 +80,11 @@ public void When_Building_A_Dispatcher() Thread.Sleep(1000); - Assert.Equal(DispatcherState.DS_RUNNING, _dispatcher.State); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_RUNNING); - _dispatcher.End().GetAwaiter().GetResult(); + await _dispatcher.End(); - Assert.Equal(DispatcherState.DS_STOPPED, _dispatcher.State); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_STOPPED); } private Subscription? GetConnection(string name) { diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessageDispatch/When_building_a_dispatcher_async.cs b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessageDispatch/When_building_a_dispatcher_async.cs index d7ffe39de4..03c6a2e04f 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessageDispatch/When_building_a_dispatcher_async.cs +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessageDispatch/When_building_a_dispatcher_async.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Org.Apache.Rocketmq; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.MessagingGateway.RocketMQ; @@ -8,7 +8,6 @@ using Paramore.Brighter.ServiceActivator; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.RocketMQ.Tests.MessageDispatch; @@ -66,16 +65,16 @@ public DispatchBuilderTestsAsync() .ConfigureInstrumentation(tracer, instrumentationOptions); } - [Fact] + [Test] public async Task When_Building_A_Dispatcher_With_Async() { _dispatcher = _builder.Build(); - Assert.NotNull(_dispatcher); - Assert.NotNull(GetConnection("foo")); - Assert.NotNull(GetConnection("bar")); + await Assert.That(_dispatcher).IsNotNull(); + await Assert.That(GetConnection("foo")).IsNotNull(); + await Assert.That(GetConnection("bar")).IsNotNull(); - Assert.Equal(DispatcherState.DS_AWAITING, _dispatcher.State); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_AWAITING); await Task.Delay(1000); @@ -83,7 +82,7 @@ public async Task When_Building_A_Dispatcher_With_Async() await Task.Delay(1000); - Assert.Equal(DispatcherState.DS_RUNNING, _dispatcher.State); + await Assert.That(_dispatcher.State).IsEqualTo(DispatcherState.DS_RUNNING); await _dispatcher.End(); } diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessageDispatch/When_building_a_dispatcher_with_named_gateway.cs b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessageDispatch/When_building_a_dispatcher_with_named_gateway.cs index b0fc392328..965f337730 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessageDispatch/When_building_a_dispatcher_with_named_gateway.cs +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessageDispatch/When_building_a_dispatcher_with_named_gateway.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Org.Apache.Rocketmq; using Paramore.Brighter.Extensions.DependencyInjection; using Paramore.Brighter.MessagingGateway.RocketMQ; @@ -8,7 +8,6 @@ using Paramore.Brighter.ServiceActivator; using Polly; using Polly.Registry; -using Xunit; namespace Paramore.Brighter.RocketMQ.Tests.MessageDispatch; @@ -79,10 +78,10 @@ public DispatchBuilderWithNamedGateway() .ConfigureInstrumentation(tracer, instrumentationOptions); } - [Fact] - public void When_building_a_dispatcher_with_named_gateway() + [Test] + public async Task When_building_a_dispatcher_with_named_gateway() { _dispatcher = _builder.Build(); - Assert.NotNull(_dispatcher); + await Assert.That(_dispatcher).IsNotNull(); } } diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_a_message_consumer_a_cloud_events_async.cs b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_a_message_consumer_a_cloud_events_async.cs index dbdd2be6cf..50a805f19c 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_a_message_consumer_a_cloud_events_async.cs +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_a_message_consumer_a_cloud_events_async.cs @@ -1,29 +1,29 @@ -using Paramore.Brighter.MessagingGateway.RocketMQ; +using Paramore.Brighter.MessagingGateway.RocketMQ; using Paramore.Brighter.RocketMQ.Tests.Utils; -using Xunit; namespace Paramore.Brighter.RocketMQ.Tests.MessagingGateway.Proactor; -[Trait("Category", "RocketMQ")] +[Category("RocketMQ")] public class BufferedConsumerCloudEventsTestsAsync : IAsyncDisposable { private readonly RoutingKey _routingKey = new(Guid.NewGuid().ToString()); - private readonly IAmAMessageConsumerAsync _consumer; - private readonly IAmAMessageProducerAsync _producer; + private IAmAMessageConsumerAsync _consumer; + private IAmAMessageProducerAsync _producer; private const int BatchSize = 3; - public BufferedConsumerCloudEventsTestsAsync() + [Before(Test)] + public async Task Setup() { - var connection = GatewayFactory.CreateConnection(); + var connection = GatewayFactory.CreateConnection(); var publication = new RocketMqPublication { Topic = "bt_mc_cloudevents_async" }; - var consumer = GatewayFactory.CreateSimpleConsumer(connection, publication).GetAwaiter().GetResult(); - var producer = GatewayFactory.CreateProducer(connection, publication).GetAwaiter().GetResult(); + var consumer = await GatewayFactory.CreateSimpleConsumer(connection, publication); + var producer = await GatewayFactory.CreateProducer(connection, publication); _consumer = new RocketMessageConsumer(consumer, BatchSize, TimeSpan.FromSeconds(30)); _producer = new RocketMqMessageProducer(connection, producer, publication); } - [Fact] + [Test] public async Task When_uses_cloud_events_async() { await _consumer.PurgeAsync(); @@ -46,13 +46,13 @@ public async Task When_uses_cloud_events_async() var messages = await _consumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); //We should only have three messages - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); - Assert.Equal(messageOne.Header.MessageId, messages[0].Header.MessageId); - Assert.Equal(messageOne.Header.Subject, messages[0].Header.Subject); - Assert.Equal(messageOne.Header.Type, messages[0].Header.Type); - Assert.Equal(messageOne.Header.Source, messages[0].Header.Source); - Assert.Equal(messageOne.Header.DataSchema, messages[0].Header.DataSchema); + await Assert.That(messages[0].Header.MessageId).IsEqualTo(messageOne.Header.MessageId); + await Assert.That(messages[0].Header.Subject).IsEqualTo(messageOne.Header.Subject); + await Assert.That(messages[0].Header.Type).IsEqualTo(messageOne.Header.Type); + await Assert.That(messages[0].Header.Source).IsEqualTo(messageOne.Header.Source); + await Assert.That(messages[0].Header.DataSchema).IsEqualTo(messageOne.Header.DataSchema); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs index 5f6ccd8834..4b810de7e9 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_a_message_consumer_reads_multiple_messages_async.cs @@ -1,29 +1,29 @@ -using Paramore.Brighter.MessagingGateway.RocketMQ; +using Paramore.Brighter.MessagingGateway.RocketMQ; using Paramore.Brighter.RocketMQ.Tests.Utils; -using Xunit; namespace Paramore.Brighter.RocketMQ.Tests.MessagingGateway.Proactor; -[Trait("Category", "RocketMQ")] +[Category("RocketMQ")] public class BufferedConsumerTestsAsync : IAsyncDisposable { - private readonly IAmAMessageProducerAsync _messageProducer; - private readonly IAmAMessageConsumerAsync _messageConsumer; + private IAmAMessageProducerAsync _messageProducer; + private IAmAMessageConsumerAsync _messageConsumer; private readonly RoutingKey _routingKey = new(Guid.NewGuid().ToString()); private const int BatchSize = 3; - public BufferedConsumerTestsAsync() + [Before(Test)] + public async Task Setup() { - var connection = GatewayFactory.CreateConnection(); + var connection = GatewayFactory.CreateConnection(); var publication = new RocketMqPublication { Topic = "bt_mc_rmm_async" }; - var consumer = GatewayFactory.CreateSimpleConsumer(connection, publication).GetAwaiter().GetResult(); - var producer = GatewayFactory.CreateProducer(connection, publication).GetAwaiter().GetResult(); + var consumer = await GatewayFactory.CreateSimpleConsumer(connection, publication); + var producer = await GatewayFactory.CreateProducer(connection, publication); _messageConsumer = new RocketMessageConsumer(consumer, BatchSize, TimeSpan.FromSeconds(30)); _messageProducer = new RocketMqMessageProducer(connection, producer, publication); } - [Fact] + [Test] public async Task When_a_message_consumer_reads_multiple_messages_async() { await _messageConsumer.PurgeAsync(); @@ -45,7 +45,7 @@ public async Task When_a_message_consumer_reads_multiple_messages_async() var messages = await _messageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(1000)); //We should only have three messages - Assert.Equal(3, messages.Length); + await Assert.That(messages.Length).IsEqualTo(3); //ack those to remove from the queue foreach (var message in messages) @@ -60,7 +60,7 @@ public async Task When_a_message_consumer_reads_multiple_messages_async() messages = await _messageConsumer.ReceiveAsync(TimeSpan.FromMilliseconds(500)); //This time, just the one message - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs index b4326b4ee9..02a29ce8cf 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_posting_a_message_via_the_messaging_gateway_async.cs @@ -1,24 +1,24 @@ -using System.Net.Mime; +using System.Net.Mime; using System.Text.Json; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.RocketMQ; using Paramore.Brighter.RocketMQ.Tests.TestDoubles; using Paramore.Brighter.RocketMQ.Tests.Utils; -using Xunit; namespace Paramore.Brighter.RocketMQ.Tests.MessagingGateway.Proactor; -[Trait("Category", "RocketMQ")] +[Category("RocketMQ")] public class MessageProducerSendAsyncTests : IAsyncDisposable { - private readonly Message _message; - private readonly IAmAChannelAsync _channel; - private readonly IAmAMessageProducerAsync _messageProducer; - private readonly MyCommand _myCommand; - private readonly Id _correlationId; - private readonly RoutingKey _replyTo; + private Message _message; + private IAmAChannelAsync _channel; + private IAmAMessageProducerAsync _messageProducer; + private MyCommand _myCommand; + private Id _correlationId; + private RoutingKey _replyTo; - public MessageProducerSendAsyncTests() + [Before(Test)] + public async Task Setup() { _myCommand = new MyCommand { Value = "Test" }; _correlationId = Id.Random(); @@ -43,14 +43,14 @@ public MessageProducerSendAsyncTests() var connection = GatewayFactory.CreateConnection(); var channelFactory = new RocketMqChannelFactory(new RocketMessageConsumerFactory(connection)); - _channel = channelFactory.CreateAsyncChannel(mqSubscription); + _channel = await channelFactory.CreateAsyncChannelAsync(mqSubscription); _messageProducer = new RocketMqMessageProducer( - connection, - GatewayFactory.CreateProducer(connection, publication).GetAwaiter().GetResult(), + connection, + await GatewayFactory.CreateProducer(connection, publication), publication); } - [Fact] + [Test] public async Task When_posting_a_message_via_the_producer_async() { // arrange @@ -67,21 +67,21 @@ public async Task When_posting_a_message_via_the_producer_async() await _channel.AcknowledgeAsync(message); // should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_messageProducer.Publication.Topic!.Value, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_messageProducer.Publication.Topic!.Value); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); // allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); // {"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); } public async ValueTask DisposeAsync() diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs index b959fd237a..528db8d6d4 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_rejecting_message_with_delivery_error_should_send_to_dlq_async.cs @@ -31,19 +31,19 @@ THE SOFTWARE. */ using Paramore.Brighter.MessagingGateway.RocketMQ; using Paramore.Brighter.RocketMQ.Tests.TestDoubles; using Paramore.Brighter.RocketMQ.Tests.Utils; -using Xunit; namespace Paramore.Brighter.RocketMQ.Tests.MessagingGateway.Proactor; -[Trait("Category", "RocketMQ")] +[Category("RocketMQ")] public class RocketMqDeliveryErrorDlqAsyncTests : IAsyncDisposable { - private readonly RocketMqMessageProducer _producer; - private readonly IAmAMessageConsumerAsync _consumer; - private readonly IAmAMessageConsumerAsync _dlqConsumer; - private readonly Message _message; + private RocketMqMessageProducer _producer; + private IAmAMessageConsumerAsync _consumer; + private IAmAMessageConsumerAsync _dlqConsumer; + private Message _message; - public RocketMqDeliveryErrorDlqAsyncTests() + [Before(Test)] + public async Task Setup() { var sourceTopic = new RoutingKey("rmq_dlq_source"); var dlqTopic = new RoutingKey("rmq_dlq_target"); @@ -54,7 +54,7 @@ public RocketMqDeliveryErrorDlqAsyncTests() var publication = new RocketMqPublication { Topic = sourceTopic }; _producer = new RocketMqMessageProducer( connection, - GatewayFactory.CreateProducer(connection, publication).GetAwaiter().GetResult(), + await GatewayFactory.CreateProducer(connection, publication), publication); // Source topic consumer with DLQ routing key (async/Proactor) @@ -86,7 +86,7 @@ public RocketMqDeliveryErrorDlqAsyncTests() (object)new MyCommand { Value = "Test Async DLQ" }, JsonSerialisationOptions.Options))); } - [Fact] + [Test] public async Task When_rejecting_message_async_with_delivery_error_should_send_to_dlq() { // Arrange - send a message and consume it from the source topic @@ -101,23 +101,21 @@ public async Task When_rejecting_message_async_with_delivery_error_should_send_t new MessageRejectionReason(RejectionReason.DeliveryError, "Test async delivery error")); // Assert - reject returns true - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - message should appear on DLQ var dlqMessage = await ConsumeMessageAsync(_dlqConsumer); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); // Assert - rejection metadata present in header bag - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(originalTopic, dlqMessage.Header.Bag["originalTopic"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.DeliveryError.ToString(), - dlqMessage.Header.Bag["rejectionReason"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal(MessageType.MT_COMMAND.ToString(), - dlqMessage.Header.Bag["originalMessageType"].ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalTopic"].ToString()).IsEqualTo(originalTopic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.DeliveryError.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalMessageType"].ToString()).IsEqualTo(MessageType.MT_COMMAND.ToString()); } private static async Task ConsumeMessageAsync(IAmAMessageConsumerAsync consumer) @@ -141,6 +139,6 @@ public async ValueTask DisposeAsync() await _consumer.DisposeAsync(); await _dlqConsumer.PurgeAsync(); await _dlqConsumer.DisposeAsync(); - _producer.Dispose(); + await _producer.DisposeAsync(); } } diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_requeueing_a_message_async.cs b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_requeueing_a_message_async.cs index 7be4d78e20..19c9f7d482 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_requeueing_a_message_async.cs +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_requeueing_a_message_async.cs @@ -1,23 +1,23 @@ -using System.Net.Mime; +using System.Net.Mime; using System.Text.Json; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.RocketMQ; using Paramore.Brighter.RocketMQ.Tests.TestDoubles; using Paramore.Brighter.RocketMQ.Tests.Utils; -using Xunit; namespace Paramore.Brighter.RocketMQ.Tests.MessagingGateway.Proactor; -[Trait("Category", "RocketMQ")] +[Category("RocketMQ")] public class MessageProducerRequeueTestsAsync { - private readonly IAmAMessageProducerAsync _sender; + private IAmAMessageProducerAsync _sender; private Message? _requeuedMessage; private Message? _receivedMessage; - private readonly IAmAChannelAsync _channel; - private readonly Message _message; + private IAmAChannelAsync _channel; + private Message _message; - public MessageProducerRequeueTestsAsync() + [Before(Test)] + public async Task Setup() { const string replyTo = "http:\\queueUrl"; MyCommand myCommand = new() { Value = "Test" }; @@ -45,13 +45,13 @@ public MessageProducerRequeueTestsAsync() RocketMqChannelFactory channelFactory = new(new RocketMessageConsumerFactory(connection)); var publication = new RocketMqPublication { Topic = routingKey }; - _sender = new RocketMqMessageProducer(connection, - GatewayFactory.CreateProducer(connection, publication).GetAwaiter().GetResult(), + _sender = new RocketMqMessageProducer(connection, + await GatewayFactory.CreateProducer(connection, publication), publication); - _channel = channelFactory.CreateAsyncChannel(subscription); + _channel = await channelFactory.CreateAsyncChannelAsync(subscription); } - [Fact] + [Test] public async Task When_requeueing_a_message_async() { await _channel.PurgeAsync(); @@ -72,6 +72,6 @@ public async Task When_requeueing_a_message_async() break; } - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } } diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_requeueing_redrives_to_the_dlq_async.cs b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_requeueing_redrives_to_the_dlq_async.cs index f8544f302a..57d0b51ce4 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_requeueing_redrives_to_the_dlq_async.cs +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Proactor/When_requeueing_redrives_to_the_dlq_async.cs @@ -1,31 +1,31 @@ -using System.Net.Mime; +using System.Net.Mime; using System.Text.Json; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.RocketMQ; using Paramore.Brighter.RocketMQ.Tests.TestDoubles; using Paramore.Brighter.RocketMQ.Tests.Utils; -using Xunit; namespace Paramore.Brighter.RocketMQ.Tests.MessagingGateway.Proactor; -[Trait("Category", "RocketMQ")] -[Trait("Fragile", "CI")] +[Category("RocketMQ")] +[Property("Fragile", "CI")] public class MessageProducerDlqTestsAsync { - private readonly RocketMqMessageProducer _sender; - private readonly IAmAChannelAsync _channel; - private readonly Message _message; + private RocketMqMessageProducer _sender; + private IAmAChannelAsync _channel; + private Message _message; - public MessageProducerDlqTestsAsync() + [Before(Test)] + public async Task Setup() { MyCommand myCommand = new() { Value = "Test" }; string correlationId = Guid.NewGuid().ToString(); const string replyTo = "http:\\queueUrl"; - var contentType = new ContentType(MediaTypeNames.Text.Plain); + var contentType = new ContentType(MediaTypeNames.Text.Plain); var queueName = Guid.NewGuid().ToString(); var routingKey = new RoutingKey("rmq_dead_letter_async"); var channelName = new ChannelName(queueName); - + var subscription = new RocketMqSubscription( subscriptionName: new SubscriptionName(queueName), channelName: channelName, @@ -44,15 +44,15 @@ public MessageProducerDlqTestsAsync() var connection = GatewayFactory.CreateConnection(); var publication = new RocketMqPublication { Topic = routingKey }; - _sender = new RocketMqMessageProducer(connection, - GatewayFactory.CreateProducer(connection, publication).GetAwaiter().GetResult(), + _sender = new RocketMqMessageProducer(connection, + await GatewayFactory.CreateProducer(connection, publication), publication); RocketMqChannelFactory channelFactory = new(new RocketMessageConsumerFactory(connection)); - _channel = channelFactory.CreateAsyncChannel(subscription); + _channel = await channelFactory.CreateAsyncChannelAsync(subscription); } - [Fact] + [Test] public async Task When_requeueing_redrives_to_the_queue_async() { await _channel.PurgeAsync(); @@ -70,6 +70,6 @@ public async Task When_requeueing_redrives_to_the_queue_async() } receivedMessage = await _channel.ReceiveAsync(TimeSpan.FromSeconds(1)); - Assert.Equal(MessageType.MT_NONE, receivedMessage.Header.MessageType); + await Assert.That(receivedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_a_message_consumer_a_cloud_events.cs b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_a_message_consumer_a_cloud_events.cs index 27365b167f..20b4c330d3 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_a_message_consumer_a_cloud_events.cs +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_a_message_consumer_a_cloud_events.cs @@ -1,30 +1,30 @@ -using Paramore.Brighter.MessagingGateway.RocketMQ; +using Paramore.Brighter.MessagingGateway.RocketMQ; using Paramore.Brighter.RocketMQ.Tests.Utils; -using Xunit; namespace Paramore.Brighter.RocketMQ.Tests.MessagingGateway.Reactor; -[Trait("Category", "RocketMQ")] +[Category("RocketMQ")] public class BufferedConsumerCloudEventsTests : IDisposable { private readonly RoutingKey _routingKey = new(Guid.NewGuid().ToString()); - private readonly IAmAMessageConsumerSync _consumer; - private readonly IAmAMessageProducerSync _producer; + private IAmAMessageConsumerSync _consumer; + private IAmAMessageProducerSync _producer; private const int BatchSize = 3; - public BufferedConsumerCloudEventsTests() + [Before(Test)] + public async Task Setup() { - var connection = GatewayFactory.CreateConnection(); + var connection = GatewayFactory.CreateConnection(); var publication = new RocketMqPublication { Topic = "bt_mc_cloudevents" }; - var consumer = GatewayFactory.CreateSimpleConsumer(connection, publication).GetAwaiter().GetResult(); - var producer = GatewayFactory.CreateProducer(connection, publication).GetAwaiter().GetResult(); + var consumer = await GatewayFactory.CreateSimpleConsumer(connection, publication); + var producer = await GatewayFactory.CreateProducer(connection, publication); _consumer = new RocketMessageConsumer(consumer, BatchSize, TimeSpan.FromSeconds(30)); _producer = new RocketMqMessageProducer(connection, producer, publication); } - [Fact] - public void When_uses_cloud_events() + [Test] + public async Task When_uses_cloud_events() { _consumer.Purge(); @@ -47,13 +47,13 @@ public void When_uses_cloud_events() var messages = _consumer.Receive(TimeSpan.FromMilliseconds(1000)); //We should only have three messages - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); - Assert.Equal(messageOne.Header.MessageId, messages[0].Header.MessageId); - Assert.Equal(messageOne.Header.Subject, messages[0].Header.Subject); - Assert.Equal(messageOne.Header.Type, messages[0].Header.Type); - Assert.Equal(messageOne.Header.Source, messages[0].Header.Source); - Assert.Equal(messageOne.Header.DataSchema, messages[0].Header.DataSchema); + await Assert.That(messages[0].Header.MessageId).IsEqualTo(messageOne.Header.MessageId); + await Assert.That(messages[0].Header.Subject).IsEqualTo(messageOne.Header.Subject); + await Assert.That(messages[0].Header.Type).IsEqualTo(messageOne.Header.Type); + await Assert.That(messages[0].Header.Source).IsEqualTo(messageOne.Header.Source); + await Assert.That(messages[0].Header.DataSchema).IsEqualTo(messageOne.Header.DataSchema); } public void Dispose() diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_a_message_consumer_reads_multiple_messages.cs b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_a_message_consumer_reads_multiple_messages.cs index a2d52a0c27..c98e055f79 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_a_message_consumer_reads_multiple_messages.cs +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_a_message_consumer_reads_multiple_messages.cs @@ -1,30 +1,30 @@ -using Paramore.Brighter.MessagingGateway.RocketMQ; +using Paramore.Brighter.MessagingGateway.RocketMQ; using Paramore.Brighter.RocketMQ.Tests.Utils; -using Xunit; namespace Paramore.Brighter.RocketMQ.Tests.MessagingGateway.Reactor; -[Trait("Category", "RocketMQ")] +[Category("RocketMQ")] public class BufferedConsumerTests : IDisposable { - private readonly IAmAMessageProducerSync _messageProducer; - private readonly IAmAMessageConsumerSync _messageConsumer; + private IAmAMessageProducerSync _messageProducer; + private IAmAMessageConsumerSync _messageConsumer; private readonly RoutingKey _routingKey = new(Guid.NewGuid().ToString()); private const int BatchSize = 3; - public BufferedConsumerTests() + [Before(Test)] + public async Task Setup() { - var connection = GatewayFactory.CreateConnection(); + var connection = GatewayFactory.CreateConnection(); var publication = new RocketMqPublication { Topic = "bt_mc_rmm" }; - var consumer = GatewayFactory.CreateSimpleConsumer(connection, publication).GetAwaiter().GetResult(); - var producer = GatewayFactory.CreateProducer(connection, publication).GetAwaiter().GetResult(); + var consumer = await GatewayFactory.CreateSimpleConsumer(connection, publication); + var producer = await GatewayFactory.CreateProducer(connection, publication); _messageConsumer = new RocketMessageConsumer(consumer, BatchSize, TimeSpan.FromSeconds(30)); _messageProducer = new RocketMqMessageProducer(connection, producer, publication); } - [Fact] - public void When_a_message_consumer_reads_multiple_messages() + [Test] + public async Task When_a_message_consumer_reads_multiple_messages() { _messageConsumer.Purge(); //Post one more than batch size messages @@ -44,7 +44,7 @@ public void When_a_message_consumer_reads_multiple_messages() var messages = _messageConsumer.Receive(TimeSpan.FromMilliseconds(1000)); //We should only have three messages - Assert.Equal(3, messages.Length); + await Assert.That(messages.Length).IsEqualTo(3); //ack those to remove from the queue foreach (var message in messages) @@ -59,7 +59,7 @@ public void When_a_message_consumer_reads_multiple_messages() messages = _messageConsumer.Receive(TimeSpan.FromMilliseconds(500)); //This time, just the one message - Assert.Single(messages); + await Assert.That(messages).HasSingleItem(); } public void Dispose() diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_posting_a_message_via_the_messaging_gateway.cs b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_posting_a_message_via_the_messaging_gateway.cs index ef1de82bca..37b216cdd1 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_posting_a_message_via_the_messaging_gateway.cs +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_posting_a_message_via_the_messaging_gateway.cs @@ -1,24 +1,24 @@ -using System.Net.Mime; +using System.Net.Mime; using System.Text.Json; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.RocketMQ; using Paramore.Brighter.RocketMQ.Tests.TestDoubles; using Paramore.Brighter.RocketMQ.Tests.Utils; -using Xunit; namespace Paramore.Brighter.RocketMQ.Tests.MessagingGateway.Reactor; -[Trait("Category", "RocketMQ")] +[Category("RocketMQ")] public class MessageProducerSendTests : IDisposable { - private readonly Message _message; - private readonly IAmAChannelSync _channel; - private readonly IAmAMessageProducerSync _messageProducer; - private readonly MyCommand _myCommand; - private readonly Id _correlationId; - private readonly RoutingKey _replyTo; + private Message _message; + private IAmAChannelSync _channel; + private IAmAMessageProducerSync _messageProducer; + private MyCommand _myCommand; + private Id _correlationId; + private RoutingKey _replyTo; - public MessageProducerSendTests() + [Before(Test)] + public async Task Setup() { _myCommand = new MyCommand { Value = "Test" }; _correlationId = Id.Random(); @@ -45,13 +45,13 @@ public MessageProducerSendTests() var channelFactory = new RocketMqChannelFactory(new RocketMessageConsumerFactory(connection)); _channel = channelFactory.CreateSyncChannel(mqSubscription); _messageProducer = new RocketMqMessageProducer( - connection, - GatewayFactory.CreateProducer(connection, publication).GetAwaiter().GetResult(), + connection, + await GatewayFactory.CreateProducer(connection, publication), publication); } - [Fact] - public void When_posting_a_message_via_the_producer_async() + [Test] + public async Task When_posting_a_message_via_the_producer_async() { _channel.Purge(); @@ -67,21 +67,21 @@ public void When_posting_a_message_via_the_producer_async() _channel.Acknowledge(message); // should_send_the_message_to_aws_sqs - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); - Assert.Equal(_myCommand.Id, message.Id); - Assert.False(message.Redelivered); - Assert.Equal(_myCommand.Id, message.Header.MessageId); - Assert.Contains(_messageProducer.Publication.Topic!.Value, message.Header.Topic.Value); - Assert.Equal(_correlationId, message.Header.CorrelationId); - Assert.Equal(_replyTo, message.Header.ReplyTo); - Assert.Equal(0, message.Header.HandledCount); - Assert.Equal(_message.Header.Subject, message.Header.Subject); + await Assert.That(message.Id).IsEqualTo(_myCommand.Id); + await Assert.That(message.Redelivered).IsFalse(); + await Assert.That(message.Header.MessageId).IsEqualTo(_myCommand.Id); + await Assert.That(message.Header.Topic.Value).Contains(_messageProducer.Publication.Topic!.Value); + await Assert.That(message.Header.CorrelationId).IsEqualTo(_correlationId); + await Assert.That(message.Header.ReplyTo).IsEqualTo(_replyTo); + await Assert.That(message.Header.HandledCount).IsEqualTo(0); + await Assert.That(message.Header.Subject).IsEqualTo(_message.Header.Subject); // allow for clock drift in the following test, more important to have a contemporary timestamp than anything - Assert.True((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))); - Assert.Equal(TimeSpan.Zero, message.Header.Delayed); + await Assert.That((message.Header.TimeStamp) > (RoundToSeconds(DateTime.UtcNow.AddMinutes(-1)))).IsTrue(); + await Assert.That(message.Header.Delayed).IsEqualTo(TimeSpan.Zero); // {"Id":"cd581ced-c066-4322-aeaf-d40944de8edd","Value":"Test","WasCancelled":false,"TaskCompleted":false} - Assert.Equal(_message.Body.Value, message.Body.Value); + await Assert.That(message.Body.Value).IsEqualTo(_message.Body.Value); } public void Dispose() diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs index f381f6d866..b69e996e3c 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_rejecting_message_with_delivery_error_should_send_to_dlq.cs @@ -30,19 +30,19 @@ THE SOFTWARE. */ using Paramore.Brighter.MessagingGateway.RocketMQ; using Paramore.Brighter.RocketMQ.Tests.TestDoubles; using Paramore.Brighter.RocketMQ.Tests.Utils; -using Xunit; namespace Paramore.Brighter.RocketMQ.Tests.MessagingGateway.Reactor; -[Trait("Category", "RocketMQ")] +[Category("RocketMQ")] public class RocketMqDeliveryErrorDlqTests : IDisposable { - private readonly RocketMqMessageProducer _producer; - private readonly IAmAMessageConsumerSync _consumer; - private readonly IAmAMessageConsumerSync _dlqConsumer; - private readonly Message _message; + private RocketMqMessageProducer _producer; + private IAmAMessageConsumerSync _consumer; + private IAmAMessageConsumerSync _dlqConsumer; + private Message _message; - public RocketMqDeliveryErrorDlqTests() + [Before(Test)] + public async Task Setup() { var sourceTopic = new RoutingKey("rmq_dlq_source"); var dlqTopic = new RoutingKey("rmq_dlq_target"); @@ -53,7 +53,7 @@ public RocketMqDeliveryErrorDlqTests() var publication = new RocketMqPublication { Topic = sourceTopic }; _producer = new RocketMqMessageProducer( connection, - GatewayFactory.CreateProducer(connection, publication).GetAwaiter().GetResult(), + await GatewayFactory.CreateProducer(connection, publication), publication); // Source topic consumer with DLQ routing key @@ -85,13 +85,13 @@ public RocketMqDeliveryErrorDlqTests() (object)new MyCommand { Value = "Test DLQ" }, JsonSerialisationOptions.Options))); } - [Fact] - public void When_rejecting_message_with_delivery_error_should_send_to_dlq() + [Test] + public async Task When_rejecting_message_with_delivery_error_should_send_to_dlq() { // Arrange - send a message and consume it from the source topic _consumer.Purge(); _dlqConsumer.Purge(); - _producer.Send(_message); + await _producer.SendAsync(_message); var receivedMessage = ConsumeMessage(_consumer); var originalTopic = receivedMessage.Header.Topic.Value; @@ -100,23 +100,21 @@ public void When_rejecting_message_with_delivery_error_should_send_to_dlq() new MessageRejectionReason(RejectionReason.DeliveryError, "Test delivery error")); // Assert - reject returns true - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - message should appear on DLQ var dlqMessage = ConsumeMessage(_dlqConsumer); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); // Assert - rejection metadata present in header bag - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.Equal(originalTopic, dlqMessage.Header.Bag["originalTopic"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.DeliveryError.ToString(), - dlqMessage.Header.Bag["rejectionReason"].ToString()); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")); - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalMessageType")); - Assert.Equal(MessageType.MT_COMMAND.ToString(), - dlqMessage.Header.Bag["originalMessageType"].ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalTopic"].ToString()).IsEqualTo(originalTopic); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.DeliveryError.ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionTimestamp")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalMessageType")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["originalMessageType"].ToString()).IsEqualTo(MessageType.MT_COMMAND.ToString()); } private static Message ConsumeMessage(IAmAMessageConsumerSync consumer) diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_rejecting_message_with_no_channels_configured_should_ack_and_log_warning.cs b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_rejecting_message_with_no_channels_configured_should_ack_and_log_warning.cs index e2c8bdb43d..038c2a043d 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_rejecting_message_with_no_channels_configured_should_ack_and_log_warning.cs +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_rejecting_message_with_no_channels_configured_should_ack_and_log_warning.cs @@ -30,18 +30,18 @@ THE SOFTWARE. */ using Paramore.Brighter.MessagingGateway.RocketMQ; using Paramore.Brighter.RocketMQ.Tests.TestDoubles; using Paramore.Brighter.RocketMQ.Tests.Utils; -using Xunit; namespace Paramore.Brighter.RocketMQ.Tests.MessagingGateway.Reactor; -[Trait("Category", "RocketMQ")] +[Category("RocketMQ")] public class RocketMqNoChannelsConfiguredTests : IDisposable { - private readonly RocketMqMessageProducer _producer; - private readonly IAmAMessageConsumerSync _consumer; - private readonly Message _message; + private RocketMqMessageProducer _producer; + private IAmAMessageConsumerSync _consumer; + private Message _message; - public RocketMqNoChannelsConfiguredTests() + [Before(Test)] + public async Task Setup() { var sourceTopic = new RoutingKey("rmq_dlq_source"); @@ -51,7 +51,7 @@ public RocketMqNoChannelsConfiguredTests() var publication = new RocketMqPublication { Topic = sourceTopic }; _producer = new RocketMqMessageProducer( connection, - GatewayFactory.CreateProducer(connection, publication).GetAwaiter().GetResult(), + await GatewayFactory.CreateProducer(connection, publication), publication); // Source topic consumer with NO DLQ or invalid routing keys @@ -72,12 +72,12 @@ public RocketMqNoChannelsConfiguredTests() (object)new MyCommand { Value = "Test No Channels" }, JsonSerialisationOptions.Options))); } - [Fact] - public void When_rejecting_message_with_no_channels_configured_should_ack_and_return_true() + [Test] + public async Task When_rejecting_message_with_no_channels_configured_should_ack_and_return_true() { // Arrange - send a message and consume it from the source topic _consumer.Purge(); - _producer.Send(_message); + await _producer.SendAsync(_message); var receivedMessage = ConsumeMessage(_consumer); // Act - reject with DeliveryError (no channels configured) @@ -85,7 +85,7 @@ public void When_rejecting_message_with_no_channels_configured_should_ack_and_re new MessageRejectionReason(RejectionReason.DeliveryError, "Test delivery error")); // Assert - reject returns true (source Ack'd, breaking requeue loop) - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - consumer can continue to receive subsequent messages (not stuck in requeue loop) var followUpMessage = new Message( @@ -94,10 +94,10 @@ public void When_rejecting_message_with_no_channels_configured_should_ack_and_re new MessageBody(JsonSerializer.Serialize( (object)new MyCommand { Value = "Follow-up" }, JsonSerialisationOptions.Options))); - _producer.Send(followUpMessage); + await _producer.SendAsync(followUpMessage); var nextMessage = ConsumeMessage(_consumer); - Assert.NotEqual(MessageType.MT_NONE, nextMessage.Header.MessageType); - Assert.Equal(followUpMessage.Body.Value, nextMessage.Body.Value); + await Assert.That(nextMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(nextMessage.Body.Value).IsEqualTo(followUpMessage.Body.Value); } private static Message ConsumeMessage(IAmAMessageConsumerSync consumer) diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs index ef8bfdedcc..c1ef513af6 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq.cs @@ -30,19 +30,19 @@ THE SOFTWARE. */ using Paramore.Brighter.MessagingGateway.RocketMQ; using Paramore.Brighter.RocketMQ.Tests.TestDoubles; using Paramore.Brighter.RocketMQ.Tests.Utils; -using Xunit; namespace Paramore.Brighter.RocketMQ.Tests.MessagingGateway.Reactor; -[Trait("Category", "RocketMQ")] +[Category("RocketMQ")] public class RocketMqUnacceptableFallbackToDlqTests : IDisposable { - private readonly RocketMqMessageProducer _producer; - private readonly IAmAMessageConsumerSync _consumer; - private readonly IAmAMessageConsumerSync _dlqConsumer; - private readonly Message _message; + private RocketMqMessageProducer _producer; + private IAmAMessageConsumerSync _consumer; + private IAmAMessageConsumerSync _dlqConsumer; + private Message _message; - public RocketMqUnacceptableFallbackToDlqTests() + [Before(Test)] + public async Task Setup() { var sourceTopic = new RoutingKey("rmq_dlq_source"); var dlqTopic = new RoutingKey("rmq_dlq_target"); @@ -53,7 +53,7 @@ public RocketMqUnacceptableFallbackToDlqTests() var publication = new RocketMqPublication { Topic = sourceTopic }; _producer = new RocketMqMessageProducer( connection, - GatewayFactory.CreateProducer(connection, publication).GetAwaiter().GetResult(), + await GatewayFactory.CreateProducer(connection, publication), publication); // Source topic consumer with DLQ only (no invalid message routing key) @@ -85,13 +85,13 @@ public RocketMqUnacceptableFallbackToDlqTests() (object)new MyCommand { Value = "Test Fallback" }, JsonSerialisationOptions.Options))); } - [Fact] - public void When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq() + [Test] + public async Task When_rejecting_message_with_unacceptable_and_no_invalid_channel_should_fallback_to_dlq() { // Arrange - send a message and consume it from the source topic _consumer.Purge(); _dlqConsumer.Purge(); - _producer.Send(_message); + await _producer.SendAsync(_message); var receivedMessage = ConsumeMessage(_consumer); // Act - reject with Unacceptable reason (no invalid channel configured, should fall back to DLQ) @@ -99,18 +99,17 @@ public void When_rejecting_message_with_unacceptable_and_no_invalid_channel_shou new MessageRejectionReason(RejectionReason.Unacceptable, "Message failed validation")); // Assert - reject returns true - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - message should appear on DLQ (fallback) var dlqMessage = ConsumeMessage(_dlqConsumer); - Assert.NotEqual(MessageType.MT_NONE, dlqMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, dlqMessage.Body.Value); + await Assert.That(dlqMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(dlqMessage.Body.Value).IsEqualTo(_message.Body.Value); // Assert - rejection metadata present - Assert.True(dlqMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.True(dlqMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.Unacceptable.ToString(), - dlqMessage.Header.Bag["rejectionReason"].ToString()); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(dlqMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.Unacceptable.ToString()); } private static Message ConsumeMessage(IAmAMessageConsumerSync consumer) diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs index d01352eabe..c6377524bc 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel.cs @@ -30,20 +30,20 @@ THE SOFTWARE. */ using Paramore.Brighter.MessagingGateway.RocketMQ; using Paramore.Brighter.RocketMQ.Tests.TestDoubles; using Paramore.Brighter.RocketMQ.Tests.Utils; -using Xunit; namespace Paramore.Brighter.RocketMQ.Tests.MessagingGateway.Reactor; -[Trait("Category", "RocketMQ")] +[Category("RocketMQ")] public class RocketMqUnacceptableInvalidChannelTests : IDisposable { - private readonly RocketMqMessageProducer _producer; - private readonly IAmAMessageConsumerSync _consumer; - private readonly IAmAMessageConsumerSync _invalidConsumer; - private readonly IAmAMessageConsumerSync _dlqConsumer; - private readonly Message _message; - - public RocketMqUnacceptableInvalidChannelTests() + private RocketMqMessageProducer _producer; + private IAmAMessageConsumerSync _consumer; + private IAmAMessageConsumerSync _invalidConsumer; + private IAmAMessageConsumerSync _dlqConsumer; + private Message _message; + + [Before(Test)] + public async Task Setup() { var sourceTopic = new RoutingKey("rmq_dlq_source"); var dlqTopic = new RoutingKey("rmq_dlq_target"); @@ -55,7 +55,7 @@ public RocketMqUnacceptableInvalidChannelTests() var publication = new RocketMqPublication { Topic = sourceTopic }; _producer = new RocketMqMessageProducer( connection, - GatewayFactory.CreateProducer(connection, publication).GetAwaiter().GetResult(), + await GatewayFactory.CreateProducer(connection, publication), publication); // Source topic consumer with both DLQ and invalid message routing keys @@ -98,14 +98,14 @@ public RocketMqUnacceptableInvalidChannelTests() (object)new MyCommand { Value = "Test Invalid" }, JsonSerialisationOptions.Options))); } - [Fact] - public void When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel() + [Test] + public async Task When_rejecting_message_with_unacceptable_reason_should_send_to_invalid_channel() { // Arrange - send a message and consume it from the source topic _consumer.Purge(); _invalidConsumer.Purge(); _dlqConsumer.Purge(); - _producer.Send(_message); + await _producer.SendAsync(_message); var receivedMessage = ConsumeMessage(_consumer); // Act - reject with Unacceptable reason @@ -113,22 +113,21 @@ public void When_rejecting_message_with_unacceptable_reason_should_send_to_inval new MessageRejectionReason(RejectionReason.Unacceptable, "Message failed validation")); // Assert - reject returns true - Assert.True(result); + await Assert.That(result).IsTrue(); // Assert - message should appear on the invalid message channel var invalidMessage = ConsumeMessage(_invalidConsumer); - Assert.NotEqual(MessageType.MT_NONE, invalidMessage.Header.MessageType); - Assert.Equal(_message.Body.Value, invalidMessage.Body.Value); + await Assert.That(invalidMessage.Header.MessageType).IsNotEqualTo(MessageType.MT_NONE); + await Assert.That(invalidMessage.Body.Value).IsEqualTo(_message.Body.Value); // Assert - rejection metadata present - Assert.True(invalidMessage.Header.Bag.ContainsKey("originalTopic")); - Assert.True(invalidMessage.Header.Bag.ContainsKey("rejectionReason")); - Assert.Equal(RejectionReason.Unacceptable.ToString(), - invalidMessage.Header.Bag["rejectionReason"].ToString()); + await Assert.That(invalidMessage.Header.Bag.ContainsKey("originalTopic")).IsTrue(); + await Assert.That(invalidMessage.Header.Bag.ContainsKey("rejectionReason")).IsTrue(); + await Assert.That(invalidMessage.Header.Bag["rejectionReason"].ToString()).IsEqualTo(RejectionReason.Unacceptable.ToString()); // Assert - DLQ should be empty (message went to invalid, not DLQ) var dlqMessage = ConsumeMessage(_dlqConsumer); - Assert.Equal(MessageType.MT_NONE, dlqMessage.Header.MessageType); + await Assert.That(dlqMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } private static Message ConsumeMessage(IAmAMessageConsumerSync consumer) diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_requeueing_a_message.cs b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_requeueing_a_message.cs index 23fe4cca1c..d7c232daa0 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_requeueing_a_message.cs +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_requeueing_a_message.cs @@ -1,23 +1,23 @@ -using System.Net.Mime; +using System.Net.Mime; using System.Text.Json; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.RocketMQ; using Paramore.Brighter.RocketMQ.Tests.TestDoubles; using Paramore.Brighter.RocketMQ.Tests.Utils; -using Xunit; namespace Paramore.Brighter.RocketMQ.Tests.MessagingGateway.Reactor; -[Trait("Category", "RocketMQ")] +[Category("RocketMQ")] public class MessageProducerRequeueTests { - private readonly IAmAMessageProducerSync _sender; + private IAmAMessageProducerSync _sender; private Message? _requeuedMessage; private Message? _receivedMessage; - private readonly IAmAChannelSync _channel; - private readonly Message _message; + private IAmAChannelSync _channel; + private Message _message; - public MessageProducerRequeueTests() + [Before(Test)] + public async Task Setup() { const string replyTo = "http:\\queueUrl"; MyCommand myCommand = new() { Value = "Test" }; @@ -45,14 +45,14 @@ public MessageProducerRequeueTests() RocketMqChannelFactory channelFactory = new(new RocketMessageConsumerFactory(connection)); var publication = new RocketMqPublication { Topic = routingKey }; - _sender = new RocketMqMessageProducer(connection, - GatewayFactory.CreateProducer(connection, publication).GetAwaiter().GetResult(), + _sender = new RocketMqMessageProducer(connection, + await GatewayFactory.CreateProducer(connection, publication), publication); _channel = channelFactory.CreateSyncChannel(subscription); } - [Fact] - public void When_requeueing_a_message_async() + [Test] + public async Task When_requeueing_a_message_async() { _channel.Purge(); _sender.Send(_message); @@ -72,6 +72,6 @@ public void When_requeueing_a_message_async() break; } - Assert.Equal(_receivedMessage.Body.Value, _requeuedMessage.Body.Value); + await Assert.That(_requeuedMessage.Body.Value).IsEqualTo(_receivedMessage.Body.Value); } } diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_requeueing_redrives_to_the_dlq.cs b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_requeueing_redrives_to_the_dlq.cs index 36e903593b..b2b403b69f 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_requeueing_redrives_to_the_dlq.cs +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/Reactor/When_requeueing_redrives_to_the_dlq.cs @@ -1,31 +1,31 @@ -using System.Net.Mime; +using System.Net.Mime; using System.Text.Json; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.MessagingGateway.RocketMQ; using Paramore.Brighter.RocketMQ.Tests.TestDoubles; using Paramore.Brighter.RocketMQ.Tests.Utils; -using Xunit; namespace Paramore.Brighter.RocketMQ.Tests.MessagingGateway.Reactor; -[Trait("Category", "RocketMQ")] -[Trait("Fragile", "CI")] +[Category("RocketMQ")] +[Property("Fragile", "CI")] public class MessageProducerDlqTests { - private readonly RocketMqMessageProducer _sender; - private readonly IAmAChannelSync _channel; - private readonly Message _message; + private RocketMqMessageProducer _sender; + private IAmAChannelSync _channel; + private Message _message; - public MessageProducerDlqTests() + [Before(Test)] + public async Task Setup() { MyCommand myCommand = new() { Value = "Test" }; string correlationId = Guid.NewGuid().ToString(); const string replyTo = "http:\\queueUrl"; - var contentType = new ContentType(MediaTypeNames.Text.Plain); + var contentType = new ContentType(MediaTypeNames.Text.Plain); var queueName = Guid.NewGuid().ToString(); var routingKey = new RoutingKey("rmq_dead_letter"); var channelName = new ChannelName(queueName); - + var subscription = new RocketMqSubscription( subscriptionName: new SubscriptionName(queueName), channelName: channelName, @@ -43,19 +43,19 @@ public MessageProducerDlqTests() var connection = GatewayFactory.CreateConnection(); var publication = new RocketMqPublication { Topic = routingKey }; - _sender = new RocketMqMessageProducer(connection, - GatewayFactory.CreateProducer(connection, publication).GetAwaiter().GetResult(), + _sender = new RocketMqMessageProducer(connection, + await GatewayFactory.CreateProducer(connection, publication), publication); RocketMqChannelFactory channelFactory = new(new RocketMessageConsumerFactory(connection)); _channel = channelFactory.CreateSyncChannel(subscription); } - [Fact] - public void When_requeueing_redrives_to_the_queue() + [Test] + public async Task When_requeueing_redrives_to_the_queue() { _channel.Purge(); - _sender.Send(_message); + await _sender.SendAsync(_message); Message receivedMessage; for (var i = 0; i < 32; i++) { @@ -69,6 +69,6 @@ public void When_requeueing_redrives_to_the_queue() } receivedMessage = _channel.Receive(TimeSpan.FromMilliseconds(5000)); - Assert.Equal(MessageType.MT_NONE, receivedMessage.Header.MessageType); + await Assert.That(receivedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/When_creating_rocket_consumer_with_dlq_subscription_should_pass_routing_keys.cs b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/When_creating_rocket_consumer_with_dlq_subscription_should_pass_routing_keys.cs index 3bdd9e0997..3fa62cb911 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/When_creating_rocket_consumer_with_dlq_subscription_should_pass_routing_keys.cs +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/When_creating_rocket_consumer_with_dlq_subscription_should_pass_routing_keys.cs @@ -27,11 +27,10 @@ THE SOFTWARE. */ using Paramore.Brighter.MessagingGateway.RocketMQ; using Paramore.Brighter.RocketMQ.Tests.TestDoubles; using Paramore.Brighter.RocketMQ.Tests.Utils; -using Xunit; namespace Paramore.Brighter.RocketMQ.Tests.MessagingGateway; -[Trait("Category", "RocketMQ")] +[Category("RocketMQ")] public class RocketConsumerFactoryDlqTests : IDisposable { private readonly RocketMessageConsumerFactory _factory; @@ -44,8 +43,8 @@ public RocketConsumerFactoryDlqTests() _factory = new RocketMessageConsumerFactory(_connection); } - [Fact] - public void When_creating_rocket_consumer_with_dlq_subscription_should_pass_routing_keys() + [Test] + public async Task When_creating_rocket_consumer_with_dlq_subscription_should_pass_routing_keys() { // Arrange var dlqRoutingKey = new RoutingKey("orders-dlq"); @@ -64,7 +63,7 @@ public void When_creating_rocket_consumer_with_dlq_subscription_should_pass_rout _consumer = _factory.Create(subscription); // Assert - verify the factory passed routing keys to the consumer - Assert.NotNull(_consumer); + await Assert.That(_consumer).IsNotNull(); var consumerType = _consumer.GetType(); var dlqField = consumerType.GetField("_deadLetterRoutingKey", @@ -74,21 +73,21 @@ public void When_creating_rocket_consumer_with_dlq_subscription_should_pass_rout var connectionField = consumerType.GetField("_connection", BindingFlags.NonPublic | BindingFlags.Instance); - Assert.NotNull(dlqField); - Assert.NotNull(invalidField); - Assert.NotNull(connectionField); + await Assert.That(dlqField).IsNotNull(); + await Assert.That(invalidField).IsNotNull(); + await Assert.That(connectionField).IsNotNull(); var actualDlq = dlqField.GetValue(_consumer) as RoutingKey; var actualInvalid = invalidField.GetValue(_consumer) as RoutingKey; var actualConnection = connectionField.GetValue(_consumer); - Assert.NotNull(actualDlq); - Assert.Equal("orders-dlq", actualDlq.Value); + await Assert.That(actualDlq).IsNotNull(); + await Assert.That(actualDlq.Value).IsEqualTo("orders-dlq"); - Assert.NotNull(actualInvalid); - Assert.Equal("orders-invalid", actualInvalid.Value); + await Assert.That(actualInvalid).IsNotNull(); + await Assert.That(actualInvalid.Value).IsEqualTo("orders-invalid"); - Assert.NotNull(actualConnection); + await Assert.That(actualConnection).IsNotNull(); } public void Dispose() diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/When_creating_rocket_subscription_with_dlq_routing_keys_should_expose_properties.cs b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/When_creating_rocket_subscription_with_dlq_routing_keys_should_expose_properties.cs index 3ca2e1f55d..b0190266a1 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/When_creating_rocket_subscription_with_dlq_routing_keys_should_expose_properties.cs +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/MessagingGateway/When_creating_rocket_subscription_with_dlq_routing_keys_should_expose_properties.cs @@ -24,14 +24,13 @@ THE SOFTWARE. */ using Paramore.Brighter.MessagingGateway.RocketMQ; using Paramore.Brighter.RocketMQ.Tests.TestDoubles; -using Xunit; namespace Paramore.Brighter.RocketMQ.Tests.MessagingGateway; public class RocketSubscriptionDlqRoutingKeyTests { - [Fact] - public void When_creating_rocket_subscription_with_dlq_routing_keys_should_expose_properties() + [Test] + public async Task When_creating_rocket_subscription_with_dlq_routing_keys_should_expose_properties() { // Arrange var deadLetterRoutingKey = new RoutingKey("orders-dlq"); @@ -48,17 +47,17 @@ public void When_creating_rocket_subscription_with_dlq_routing_keys_should_expos ); // Assert - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var dlqSupport = (IUseBrighterDeadLetterSupport)subscription; - Assert.Equal(deadLetterRoutingKey, dlqSupport.DeadLetterRoutingKey); + await Assert.That(dlqSupport.DeadLetterRoutingKey).IsEqualTo(deadLetterRoutingKey); - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var invalidSupport = (IUseBrighterInvalidMessageSupport)subscription; - Assert.Equal(invalidMessageRoutingKey, invalidSupport.InvalidMessageRoutingKey); + await Assert.That(invalidSupport.InvalidMessageRoutingKey).IsEqualTo(invalidMessageRoutingKey); } - [Fact] - public void When_creating_rocket_subscription_without_dlq_routing_keys_should_default_to_null() + [Test] + public async Task When_creating_rocket_subscription_without_dlq_routing_keys_should_default_to_null() { // Arrange & Act var subscription = new RocketMqSubscription( @@ -69,12 +68,12 @@ public void When_creating_rocket_subscription_without_dlq_routing_keys_should_de ); // Assert - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var dlqSupport = (IUseBrighterDeadLetterSupport)subscription; - Assert.Null(dlqSupport.DeadLetterRoutingKey); + await Assert.That(dlqSupport.DeadLetterRoutingKey).IsNull(); - Assert.IsAssignableFrom(subscription); + await Assert.That(subscription).IsAssignableTo(); var invalidSupport = (IUseBrighterInvalidMessageSupport)subscription; - Assert.Null(invalidSupport.InvalidMessageRoutingKey); + await Assert.That(invalidSupport.InvalidMessageRoutingKey).IsNull(); } } diff --git a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests.csproj b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests.csproj index ccf9e3800b..5e78f22153 100644 --- a/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests.csproj +++ b/tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests/Paramore.Brighter.RocketMQ.Tests.csproj @@ -1,30 +1,17 @@ - - - $(BrighterTestTargetFrameworks) - enable - false - true - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - + + $(BrighterTestTargetFrameworks) + enable + false + true + Exe + - - + + + + \ No newline at end of file diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs index a68f0b8609..9aa753c0f1 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Binary.Async; -public class WhenAddingADuplicateMessageItShouldNotThrowAsync : IAsyncLifetime +public class WhenAddingADuplicateMessageItShouldNotThrowAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenAddingADuplicateMessageItShouldNotThrowAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() { // Arrange @@ -47,6 +49,6 @@ public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs index 8907e236f1..43d2398e45 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Binary.Async; -public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync : IAsyncLifetime +public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async() { // Arrange @@ -49,37 +51,37 @@ public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_ var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs index 6e37665338..6bfc41095a 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Binary.Async; -public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async() { // Arrange @@ -54,6 +56,6 @@ public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Shoul var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs index d13265b024..02737017c5 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Binary.Async; -public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async() { // Arrange @@ -54,37 +56,37 @@ public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_A var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs index 0a00ef7e3b..bf20fcb615 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Binary.Async; -public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -58,8 +60,8 @@ public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Ou .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs index e8ee4e8c56..bae133d58f 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Binary.Async; -public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -47,17 +46,20 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -84,8 +86,8 @@ public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Asy .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs index 7ca708df22..40ed6e0a05 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Binary.Async; -public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync : IAsyncLifetime +public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async() { // Arrange @@ -80,38 +82,38 @@ public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_M var message = await outbox.GetAsync(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs index 72d3842af2..4524956d49 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Binary.Async; -public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync : IAsyncLifetime +public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async() { // Arrange @@ -45,6 +47,6 @@ public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_ var message = await outbox.GetAsync(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs index c1f070b3c3..27dd0cea53 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Binary.Async; -public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync : IAsyncLifetime +public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync( _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async() { // Arrange @@ -80,9 +82,9 @@ public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_An var messages = (await _outboxProvider.GetAllMessagesAsync()).ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs index c5d6e1d223..0b437d7f12 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Binary.Async; -public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_As var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs index 1c5178bfc8..dca537afc5 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Binary.Async; -public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync : IAsyncLifetime +public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async() { // Arrange @@ -82,9 +84,9 @@ public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requeste .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs index 5322b7fd0d..7f3fa02e19 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Binary.Async; -public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_A var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs index 87e53f6c37..4a58e52a06 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenAddingADuplicateMessageItShouldNotThrow() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() + [Test] + public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw() { // Arrange var context = new RequestContext(); @@ -63,7 +62,7 @@ public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs index 147a853a01..cf3610eeb9 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenAddingAMessageItShouldBeStoredWithAllProperties() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() + [Test] + public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() { // Arrange var context = new RequestContext(); @@ -64,38 +63,38 @@ public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs index 4bc6116e2c..00259321ea 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,14 +47,14 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,12 +63,12 @@ public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_ // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Rollback(); + await transaction.RollbackAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs index 35e4e3dedb..a64108347b 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,14 +47,14 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,43 +63,43 @@ public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_C // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Commit(); + await transaction.CommitAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs index 93c13a7684..cab6a4a1ba 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,9 +73,9 @@ public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs index ab8a5eef07..905d1ea381 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,9 +73,9 @@ public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs index 886517bb0d..24a0a37e45 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() + [Test] + public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() { // Arrange var context = new RequestContext(); @@ -70,39 +69,39 @@ public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message var message = outbox.Get(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs index 59077cf91e..1af860c769 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() + [Test] + public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() { // Arrange var context = new RequestContext(); @@ -60,7 +59,7 @@ public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Messag var message = outbox.Get(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs index 3366ae5e81..576dc9d9b3 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() + [Test] + public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() { // Arrange var context = new RequestContext(); @@ -70,10 +69,10 @@ public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undi var messages = _outboxProvider.GetAllMessages().ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs index 23cc4414dc..7e707c0c39 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,19 +71,19 @@ public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs index 42bd68955d..221046b1e7 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() + [Test] + public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() { // Arrange var context = new RequestContext(); @@ -72,10 +71,10 @@ public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Mess .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs index 0c169e5a63..d2d4ef0acb 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Binary/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,19 +71,19 @@ public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs index 5abd561930..4c5dcee181 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Text.Async; -public class WhenAddingADuplicateMessageItShouldNotThrowAsync : IAsyncLifetime +public class WhenAddingADuplicateMessageItShouldNotThrowAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenAddingADuplicateMessageItShouldNotThrowAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() { // Arrange @@ -47,6 +49,6 @@ public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs index ed9e0f35d9..cccb32f70e 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Text.Async; -public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync : IAsyncLifetime +public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async() { // Arrange @@ -49,37 +51,37 @@ public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_ var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs index 8562d98060..79825032e1 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Text.Async; -public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async() { // Arrange @@ -54,6 +56,6 @@ public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Shoul var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs index f4ab2d3aff..3a3c0fa77f 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Text.Async; -public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync : IAsyncLifetime +public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async() { // Arrange @@ -54,37 +56,37 @@ public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_A var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs index 563ec63c69..a66baf7340 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Text.Async; -public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -22,17 +21,20 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -58,8 +60,8 @@ public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Ou .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs index c9b08db1ce..a2b0d54283 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Text.Async; -public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync : IAsyncLifetime +public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -47,17 +46,20 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -84,8 +86,8 @@ public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Asy .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs index 6c2027ea62..d00dfdeb6d 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Text.Async; -public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync : IAsyncLifetime +public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async() { // Arrange @@ -80,38 +82,38 @@ public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_M var message = await outbox.GetAsync(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs index 874ee305a3..b14460199c 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Text.Async; -public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync : IAsyncLifetime +public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async() { // Arrange @@ -45,6 +47,6 @@ public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_ var message = await outbox.GetAsync(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs index 2a385fdcb8..995e797175 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Text.Async; -public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync : IAsyncLifetime +public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync( _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async() { // Arrange @@ -80,9 +82,9 @@ public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_An var messages = (await _outboxProvider.GetAllMessagesAsync()).ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs index 563a3fe5b5..8d8814c0b6 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Text.Async; -public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_As var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs index af60199cb9..aaf2c01e2d 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,7 +34,7 @@ THE SOFTWARE. */ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Text.Async; -public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync : IAsyncLifetime +public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -48,17 +47,20 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async() { // Arrange @@ -82,9 +84,9 @@ public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requeste .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs index abdc355800..0c41ae868c 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs @@ -1,8 +1,7 @@ -// +// // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,7 +9,7 @@ namespace Paramore.Brighter.Sqlite.Tests.Outbox.Text.Async; -public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync : IAsyncLifetime +public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync { private readonly IAmAnOutboxProviderAsync _outboxProvider; private readonly IAmAMessageFactory _messageFactory; @@ -23,17 +22,20 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync() _messageFactory = new DefaultMessageFactory(); } - public async Task InitializeAsync() + [Before(HookType.Test)] + public async Task Setup() { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -57,18 +59,18 @@ public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_A var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs index f702ff4a31..fbeae753c9 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenAddingADuplicateMessageItShouldNotThrow() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() + [Test] + public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw() { // Arrange var context = new RequestContext(); @@ -63,7 +62,7 @@ public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs index 63ef9f972d..7458df63ea 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenAddingAMessageItShouldBeStoredWithAllProperties() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() + [Test] + public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() { // Arrange var context = new RequestContext(); @@ -64,38 +63,38 @@ public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs index 37f40e6437..353bd61d23 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,14 +47,14 @@ public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,12 +63,12 @@ public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_ // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Rollback(); + await transaction.RollbackAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs index 599d522107..e97e8851f7 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,14 +47,14 @@ public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() { // Arrange var outbox = _outboxProvider.CreateOutbox(); var transaction = _outboxProvider.CreateTransactionProvider(); - _ = transaction.GetTransaction(); + _ = await transaction.GetTransactionAsync(); var context = new RequestContext(); var message = _messageFactory.Create(); @@ -64,43 +63,43 @@ public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_C // Act outbox.Add(message, context, transactionProvider: transaction); - transaction.Commit(); + await transaction.CommitAsync(); var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(storedMessage.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag).ContainsKey(key); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs index d94396b37f..f9743620fb 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,9 +73,9 @@ public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs index 828e8f4ea6..321ddd4e8a 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenDeletingOneMessageItShouldBeRemovedFromOutbox() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -74,9 +73,9 @@ public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs index 0e73b65cd2..1496bbaa58 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() + [Test] + public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() { // Arrange var context = new RequestContext(); @@ -70,39 +69,39 @@ public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message var message = outbox.Get(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic).IsEqualTo(message.Header.Topic); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsEqualTo(message.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(dispatched.Header.ReplyTo).IsEqualTo(message.Header.ReplyTo); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey).IsEqualTo(message.Header.PartitionKey); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag).ContainsKey(key); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type).IsEqualTo(message.Header.Type); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState).IsEqualTo(message.Header.TraceState); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs index f7876e2fca..dd4fb810f2 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() + [Test] + public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() { // Arrange var context = new RequestContext(); @@ -60,7 +59,7 @@ public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Messag var message = outbox.Get(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs index 330d755771..50f3e720e2 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() + [Test] + public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() { // Arrange var context = new RequestContext(); @@ -70,10 +69,10 @@ public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undi var messages = _outboxProvider.GetAllMessages().ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs index 954d6139de..7b38d58677 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingDispatchedMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,19 +71,19 @@ public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs index a987d81e29..b280e8db36 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() + [Test] + public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() { // Arrange var context = new RequestContext(); @@ -72,10 +71,10 @@ public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Mess .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs index ded75a9dcb..dc74d742fa 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs +++ b/tests/Paramore.Brighter.Sqlite.Tests/Outbox/Text/Generated/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs @@ -1,4 +1,4 @@ -#region Licence +#region Licence /* The MIT License (MIT) Copyright © 2014 Ian Cooper @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -48,8 +47,8 @@ public WhenRetrievingOutstandingMessagesItShouldFilterByAge() _messageFactory = new DefaultMessageFactory(); } - [Fact] - public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -72,19 +71,19 @@ public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } public void Dispose() diff --git a/tests/Paramore.Brighter.Sqlite.Tests/Paramore.Brighter.Sqlite.Tests.csproj b/tests/Paramore.Brighter.Sqlite.Tests/Paramore.Brighter.Sqlite.Tests.csproj index a8ebed9d5a..e9f4d14182 100644 --- a/tests/Paramore.Brighter.Sqlite.Tests/Paramore.Brighter.Sqlite.Tests.csproj +++ b/tests/Paramore.Brighter.Sqlite.Tests/Paramore.Brighter.Sqlite.Tests.csproj @@ -1,37 +1,21 @@ - - - $(BrighterTestTargetFrameworks) - false - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - + + $(BrighterTestTargetFrameworks) + false + Exe + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_creating_outbox_generator_with_logger_should_not_throw.cs b/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_creating_outbox_generator_with_logger_should_not_throw.cs index 790566b263..71a0a973a5 100644 --- a/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_creating_outbox_generator_with_logger_should_not_throw.cs +++ b/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_creating_outbox_generator_with_logger_should_not_throw.cs @@ -1,7 +1,6 @@ -using System; +using System; using System.IO; using Microsoft.Extensions.Logging; -using Xunit; namespace Paramore.Brighter.Test.Generator.Tests.OutboxGenerator; @@ -19,14 +18,14 @@ public WhenCreatingOutboxGeneratorWithLoggerShouldNotThrow() _logger = factory.CreateLogger(); } - [Fact] - public void When_creating_outbox_generator_with_logger_should_not_throw() + [Test] + public async Task When_creating_outbox_generator_with_logger_should_not_throw() { // Arrange & Act var generator = new Generators.OutboxGenerator(_logger); // Assert - Assert.NotNull(generator); + await Assert.That(generator).IsNotNull(); } public void Dispose() diff --git a/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_generating_with_multiple_outboxes_should_complete_without_error.cs b/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_generating_with_multiple_outboxes_should_complete_without_error.cs index 618377d9b0..e16cf103cb 100644 --- a/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_generating_with_multiple_outboxes_should_complete_without_error.cs +++ b/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_generating_with_multiple_outboxes_should_complete_without_error.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Paramore.Brighter.Test.Generator.Configuration; -using Xunit; namespace Paramore.Brighter.Test.Generator.Tests.OutboxGenerator; @@ -21,7 +20,7 @@ public WhenGeneratingWithMultipleOutboxesShouldCompleteWithoutError() _logger = factory.CreateLogger(); } - [Fact] + [Test] public async Task When_generating_with_single_outbox_should_complete_without_error() { // Arrange diff --git a/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_generating_with_outbox_without_transaction_support_should_complete.cs b/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_generating_with_outbox_without_transaction_support_should_complete.cs index c52c52d7a0..e0fb8d815b 100644 --- a/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_generating_with_outbox_without_transaction_support_should_complete.cs +++ b/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_generating_with_outbox_without_transaction_support_should_complete.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Paramore.Brighter.Test.Generator.Configuration; -using Xunit; namespace Paramore.Brighter.Test.Generator.Tests.OutboxGenerator; @@ -21,7 +20,7 @@ public WhenGeneratingWithOutboxWithoutTransactionSupportShouldComplete() _logger = factory.CreateLogger(); } - [Fact] + [Test] public async Task When_generating_with_outbox_without_transaction_support_should_complete() { // Arrange diff --git a/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_generating_with_single_outbox_should_complete_without_error.cs b/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_generating_with_single_outbox_should_complete_without_error.cs index d164bdc6bd..a974b3e64a 100644 --- a/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_generating_with_single_outbox_should_complete_without_error.cs +++ b/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_generating_with_single_outbox_should_complete_without_error.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Paramore.Brighter.Test.Generator.Configuration; -using Xunit; namespace Paramore.Brighter.Test.Generator.Tests.OutboxGenerator; @@ -21,7 +20,7 @@ public WhenGeneratingWithSingleOutboxShouldCompleteWithoutError() _logger = factory.CreateLogger(); } - [Fact] + [Test] public async Task When_generating_with_single_outbox_should_complete_without_error() { // Arrange diff --git a/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_generating_without_outbox_configuration_should_log_and_complete.cs b/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_generating_without_outbox_configuration_should_log_and_complete.cs index e8cfe916c7..2bd367edf1 100644 --- a/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_generating_without_outbox_configuration_should_log_and_complete.cs +++ b/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_generating_without_outbox_configuration_should_log_and_complete.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Paramore.Brighter.Test.Generator.Configuration; -using Xunit; namespace Paramore.Brighter.Test.Generator.Tests.OutboxGenerator; @@ -21,7 +20,7 @@ public WhenGeneratingWithoutOutboxConfigurationShouldLogAndComplete() _logger = factory.CreateLogger(); } - [Fact] + [Test] public async Task When_generating_without_outbox_configuration_should_log_and_complete() { // Arrange diff --git a/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_multiple_outboxes_missing_prefix_should_use_key_as_prefix.cs b/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_multiple_outboxes_missing_prefix_should_use_key_as_prefix.cs index 406d4933cb..1d9c910d40 100644 --- a/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_multiple_outboxes_missing_prefix_should_use_key_as_prefix.cs +++ b/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_multiple_outboxes_missing_prefix_should_use_key_as_prefix.cs @@ -1,10 +1,9 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Paramore.Brighter.Test.Generator.Configuration; -using Xunit; namespace Paramore.Brighter.Test.Generator.Tests.OutboxGenerator; @@ -22,7 +21,7 @@ public WhenMultipleOutboxesMissingPrefixShouldUseKeyAsPrefix() _logger = factory.CreateLogger(); } - [Fact] + [Test] public async Task When_multiple_outboxes_missing_prefix_should_use_key_as_prefix() { // Arrange @@ -49,7 +48,7 @@ public async Task When_multiple_outboxes_missing_prefix_should_use_key_as_prefix await generator.GenerateAsync(configuration); // Assert - prefix should be derived from key - Assert.Equal(".SqlServer", configuration.Outboxes["SqlServer"].Prefix); + await Assert.That(configuration.Outboxes["SqlServer"].Prefix).IsEqualTo(".SqlServer"); } public void Dispose() diff --git a/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_outbox_configuration_missing_message_factory_should_use_parent_factory.cs b/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_outbox_configuration_missing_message_factory_should_use_parent_factory.cs index a57abe4e23..c6086e213b 100644 --- a/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_outbox_configuration_missing_message_factory_should_use_parent_factory.cs +++ b/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_outbox_configuration_missing_message_factory_should_use_parent_factory.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Paramore.Brighter.Test.Generator.Configuration; -using Xunit; namespace Paramore.Brighter.Test.Generator.Tests.OutboxGenerator; @@ -21,7 +20,7 @@ public WhenOutboxConfigurationMissingMessageFactoryShouldUseParentFactory() _logger = factory.CreateLogger(); } - [Fact] + [Test] public async Task When_outbox_configuration_missing_message_factory_should_use_parent_factory() { // Arrange @@ -43,7 +42,7 @@ public async Task When_outbox_configuration_missing_message_factory_should_use_p await generator.GenerateAsync(configuration); // Assert - message factory should be inherited from parent configuration - Assert.Equal("TestMessageFactory", configuration.Outbox.MessageFactory); + await Assert.That(configuration.Outbox.MessageFactory).IsEqualTo("TestMessageFactory"); } public void Dispose() diff --git a/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_outbox_configuration_missing_namespace_should_use_parent_namespace.cs b/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_outbox_configuration_missing_namespace_should_use_parent_namespace.cs index 84cca694a3..65268fea8a 100644 --- a/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_outbox_configuration_missing_namespace_should_use_parent_namespace.cs +++ b/tests/Paramore.Brighter.Test.Generator.Tests/OutboxGenerator/When_outbox_configuration_missing_namespace_should_use_parent_namespace.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Paramore.Brighter.Test.Generator.Configuration; -using Xunit; namespace Paramore.Brighter.Test.Generator.Tests.OutboxGenerator; @@ -21,7 +20,7 @@ public WhenOutboxConfigurationMissingNamespaceShouldUseParentNamespace() _logger = factory.CreateLogger(); } - [Fact] + [Test] public async Task When_outbox_configuration_missing_namespace_should_use_parent_namespace() { // Arrange @@ -43,7 +42,7 @@ public async Task When_outbox_configuration_missing_namespace_should_use_parent_ await generator.GenerateAsync(configuration); // Assert - namespace should be inherited from parent configuration - Assert.Equal("MyApp.Tests", configuration.Outbox.Namespace); + await Assert.That(configuration.Outbox.Namespace).IsEqualTo("MyApp.Tests"); } public void Dispose() diff --git a/tests/Paramore.Brighter.Test.Generator.Tests/Paramore.Brighter.Test.Generator.Tests.csproj b/tests/Paramore.Brighter.Test.Generator.Tests/Paramore.Brighter.Test.Generator.Tests.csproj index 3faaab3341..15c9310527 100644 --- a/tests/Paramore.Brighter.Test.Generator.Tests/Paramore.Brighter.Test.Generator.Tests.csproj +++ b/tests/Paramore.Brighter.Test.Generator.Tests/Paramore.Brighter.Test.Generator.Tests.csproj @@ -1,28 +1,12 @@ - - - - $(BrighterTestTargetFrameworks) - false - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - + + + $(BrighterTestTargetFrameworks) + false + Exe + + + + + + + \ No newline at end of file diff --git a/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_complex_template_with_multiple_features_should_render_correctly.cs b/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_complex_template_with_multiple_features_should_render_correctly.cs index dd16b39ae8..c6956fcb1b 100644 --- a/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_complex_template_with_multiple_features_should_render_correctly.cs +++ b/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_complex_template_with_multiple_features_should_render_correctly.cs @@ -1,7 +1,6 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; -using Xunit; namespace Paramore.Brighter.Test.Generator.Tests.Parser; @@ -15,7 +14,7 @@ public WhenParsingComplexTemplateWithMultipleFeaturesShouldRenderCorrectly() Directory.CreateDirectory(_testDirectory); } - [Fact] + [Test] public async Task When_parsing_complex_template_with_multiple_features_should_render_correctly() { // Arrange @@ -26,8 +25,8 @@ namespace {{ Namespace }} public class {{ Prefix }}TransactionTests { {% for test in Tests %} - [Fact] - public void {{ test }}() { } + [Test] + public async Task {{ test }}() { } {% endfor %} } {% endif %} @@ -52,10 +51,10 @@ public class {{ Prefix }}TransactionTests // Assert var result = await File.ReadAllTextAsync(outputPath); - Assert.Contains("namespace MyApp.Tests", result); - Assert.Contains("SqlServerTransactionTests", result); - Assert.Contains("Test1", result); - Assert.Contains("Test2", result); + await Assert.That(result).Contains("namespace MyApp.Tests"); + await Assert.That(result).Contains("SqlServerTransactionTests"); + await Assert.That(result).Contains("Test1"); + await Assert.That(result).Contains("Test2"); } public void Dispose() diff --git a/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_simple_template_should_render_correctly.cs b/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_simple_template_should_render_correctly.cs index 71b646085a..3b0d9448d8 100644 --- a/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_simple_template_should_render_correctly.cs +++ b/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_simple_template_should_render_correctly.cs @@ -1,7 +1,6 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; -using Xunit; namespace Paramore.Brighter.Test.Generator.Tests.Parser; @@ -19,7 +18,7 @@ public WhenParsingSimpleTemplateShouldRenderCorrectly() _outputPath = Path.Combine(_testDirectory, "output.txt"); } - [Fact] + [Test] public async Task When_parsing_simple_template_should_render_correctly() { // Arrange @@ -34,7 +33,7 @@ public async Task When_parsing_simple_template_should_render_correctly() // Assert var result = await File.ReadAllTextAsync(_outputPath); - Assert.Equal("Hello World!", result); + await Assert.That(result).IsEqualTo("Hello World!"); } public void Dispose() diff --git a/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_conditional_should_render_correctly.cs b/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_conditional_should_render_correctly.cs index 7612fa28c2..9c7185698a 100644 --- a/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_conditional_should_render_correctly.cs +++ b/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_conditional_should_render_correctly.cs @@ -1,7 +1,6 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; -using Xunit; namespace Paramore.Brighter.Test.Generator.Tests.Parser; @@ -19,7 +18,7 @@ public WhenParsingTemplateWithConditionalShouldRenderCorrectly() _outputPath = Path.Combine(_testDirectory, "output.txt"); } - [Fact] + [Test] public async Task When_parsing_template_with_conditional_should_render_correctly() { // Arrange @@ -34,7 +33,7 @@ public async Task When_parsing_template_with_conditional_should_render_correctly // Assert var result = await File.ReadAllTextAsync(_outputPath); - Assert.Equal("Active", result); + await Assert.That(result).IsEqualTo("Active"); } public void Dispose() diff --git a/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_empty_collection_should_render_empty.cs b/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_empty_collection_should_render_empty.cs index aff73dc9f1..040b1c79a9 100644 --- a/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_empty_collection_should_render_empty.cs +++ b/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_empty_collection_should_render_empty.cs @@ -1,7 +1,6 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; -using Xunit; namespace Paramore.Brighter.Test.Generator.Tests.Parser; @@ -15,7 +14,7 @@ public WhenParsingTemplateWithEmptyCollectionShouldRenderEmpty() Directory.CreateDirectory(_testDirectory); } - [Fact] + [Test] public async Task When_parsing_template_with_empty_collection_should_render_empty() { // Arrange @@ -33,7 +32,7 @@ public async Task When_parsing_template_with_empty_collection_should_render_empt // Assert var result = await File.ReadAllTextAsync(outputPath); - Assert.Empty(result); + await Assert.That(result).IsEmpty(); } public void Dispose() diff --git a/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_false_conditional_should_skip_content.cs b/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_false_conditional_should_skip_content.cs index b0dd3284c0..82d63a52bc 100644 --- a/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_false_conditional_should_skip_content.cs +++ b/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_false_conditional_should_skip_content.cs @@ -1,7 +1,6 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; -using Xunit; namespace Paramore.Brighter.Test.Generator.Tests.Parser; @@ -15,7 +14,7 @@ public WhenParsingTemplateWithFalseConditionalShouldSkipContent() Directory.CreateDirectory(_testDirectory); } - [Fact] + [Test] public async Task When_parsing_template_with_false_conditional_should_skip_content() { // Arrange @@ -33,7 +32,7 @@ public async Task When_parsing_template_with_false_conditional_should_skip_conte // Assert var result = await File.ReadAllTextAsync(outputPath); - Assert.Empty(result); + await Assert.That(result).IsEmpty(); } public void Dispose() diff --git a/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_filters_should_apply_correctly.cs b/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_filters_should_apply_correctly.cs index 1b388a4a7b..9f3f5dd0e0 100644 --- a/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_filters_should_apply_correctly.cs +++ b/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_filters_should_apply_correctly.cs @@ -1,7 +1,6 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; -using Xunit; namespace Paramore.Brighter.Test.Generator.Tests.Parser; @@ -15,7 +14,7 @@ public WhenParsingTemplateWithFiltersShouldApplyCorrectly() Directory.CreateDirectory(_testDirectory); } - [Fact] + [Test] public async Task When_parsing_template_with_filters_should_apply_correctly() { // Arrange @@ -33,7 +32,7 @@ public async Task When_parsing_template_with_filters_should_apply_correctly() // Assert var result = await File.ReadAllTextAsync(outputPath); - Assert.Equal("TEST", result); + await Assert.That(result).IsEqualTo("TEST"); } public void Dispose() diff --git a/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_loop_should_render_correctly.cs b/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_loop_should_render_correctly.cs index d6b1115511..5486fa2abd 100644 --- a/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_loop_should_render_correctly.cs +++ b/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_loop_should_render_correctly.cs @@ -1,7 +1,6 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; -using Xunit; namespace Paramore.Brighter.Test.Generator.Tests.Parser; @@ -19,7 +18,7 @@ public WhenParsingTemplateWithLoopShouldRenderCorrectly() _outputPath = Path.Combine(_testDirectory, "output.txt"); } - [Fact] + [Test] public async Task When_parsing_template_with_loop_should_render_correctly() { // Arrange @@ -34,9 +33,9 @@ public async Task When_parsing_template_with_loop_should_render_correctly() // Assert var result = await File.ReadAllTextAsync(_outputPath); - Assert.Contains("Item1", result); - Assert.Contains("Item2", result); - Assert.Contains("Item3", result); + await Assert.That(result).Contains("Item1"); + await Assert.That(result).Contains("Item2"); + await Assert.That(result).Contains("Item3"); } public void Dispose() diff --git a/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_outbox_configuration_should_render_correctly.cs b/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_outbox_configuration_should_render_correctly.cs index ad67e86b64..3437e6c729 100644 --- a/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_outbox_configuration_should_render_correctly.cs +++ b/tests/Paramore.Brighter.Test.Generator.Tests/Parser/When_parsing_template_with_outbox_configuration_should_render_correctly.cs @@ -1,8 +1,7 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; using Paramore.Brighter.Test.Generator.Configuration; -using Xunit; namespace Paramore.Brighter.Test.Generator.Tests.Parser; @@ -20,7 +19,7 @@ public WhenParsingTemplateWithOutboxConfigurationShouldRenderCorrectly() _outputPath = Path.Combine(_testDirectory, "output.txt"); } - [Fact] + [Test] public async Task When_parsing_template_with_outbox_configuration_should_render_correctly() { // Arrange @@ -35,8 +34,8 @@ public async Task When_parsing_template_with_outbox_configuration_should_render_ // Assert var result = await File.ReadAllTextAsync(_outputPath); - Assert.Contains("namespace MyApp.Tests", result); - Assert.Contains("public class SqlServerTests", result); + await Assert.That(result).Contains("namespace MyApp.Tests"); + await Assert.That(result).Contains("public class SqlServerTests"); } public void Dispose() diff --git a/tests/Paramore.Brighter.Test.Generator.Tests/SharedGenerator/When_creating_shared_generator_with_logger_should_not_throw.cs b/tests/Paramore.Brighter.Test.Generator.Tests/SharedGenerator/When_creating_shared_generator_with_logger_should_not_throw.cs index ac688f4c45..2ef9cea95a 100644 --- a/tests/Paramore.Brighter.Test.Generator.Tests/SharedGenerator/When_creating_shared_generator_with_logger_should_not_throw.cs +++ b/tests/Paramore.Brighter.Test.Generator.Tests/SharedGenerator/When_creating_shared_generator_with_logger_should_not_throw.cs @@ -1,7 +1,6 @@ -using System; +using System; using System.IO; using Microsoft.Extensions.Logging; -using Xunit; namespace Paramore.Brighter.Test.Generator.Tests.SharedGenerator; @@ -19,14 +18,14 @@ public WhenCreatingSharedGeneratorWithLoggerShouldNotThrow() _logger = factory.CreateLogger(); } - [Fact] - public void When_creating_shared_generator_with_logger_should_not_throw() + [Test] + public async Task When_creating_shared_generator_with_logger_should_not_throw() { // Arrange & Act var generator = new Generators.SharedGenerator(_logger); // Assert - Assert.NotNull(generator); + await Assert.That(generator).IsNotNull(); } public void Dispose() diff --git a/tests/Paramore.Brighter.Test.Generator.Tests/SharedGenerator/When_generating_with_custom_message_factory_should_preserve_it.cs b/tests/Paramore.Brighter.Test.Generator.Tests/SharedGenerator/When_generating_with_custom_message_factory_should_preserve_it.cs index 59862c5588..a011c85168 100644 --- a/tests/Paramore.Brighter.Test.Generator.Tests/SharedGenerator/When_generating_with_custom_message_factory_should_preserve_it.cs +++ b/tests/Paramore.Brighter.Test.Generator.Tests/SharedGenerator/When_generating_with_custom_message_factory_should_preserve_it.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Paramore.Brighter.Test.Generator.Configuration; -using Xunit; namespace Paramore.Brighter.Test.Generator.Tests.SharedGenerator; @@ -21,7 +20,7 @@ public WhenGeneratingWithCustomMessageFactoryShouldPreserveIt() _logger = factory.CreateLogger(); } - [Fact] + [Test] public async Task When_generating_with_custom_message_factory_should_preserve_it() { // Arrange @@ -37,7 +36,7 @@ public async Task When_generating_with_custom_message_factory_should_preserve_it await generator.GenerateAsync(configuration); // Assert - Assert.Equal("CustomMessageFactory", configuration.MessageFactory); + await Assert.That(configuration.MessageFactory).IsEqualTo("CustomMessageFactory"); } public void Dispose() diff --git a/tests/Paramore.Brighter.Test.Generator.Tests/SharedGenerator/When_generating_with_no_message_factory_should_use_default.cs b/tests/Paramore.Brighter.Test.Generator.Tests/SharedGenerator/When_generating_with_no_message_factory_should_use_default.cs index d5b62be88d..166aa5e187 100644 --- a/tests/Paramore.Brighter.Test.Generator.Tests/SharedGenerator/When_generating_with_no_message_factory_should_use_default.cs +++ b/tests/Paramore.Brighter.Test.Generator.Tests/SharedGenerator/When_generating_with_no_message_factory_should_use_default.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.IO; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Paramore.Brighter.Test.Generator.Configuration; -using Xunit; namespace Paramore.Brighter.Test.Generator.Tests.SharedGenerator; @@ -21,7 +20,7 @@ public WhenGeneratingWithNoMessageFactoryShouldUseDefault() _logger = factory.CreateLogger(); } - [Fact] + [Test] public async Task When_generating_with_no_message_factory_should_use_default() { // Arrange @@ -36,7 +35,7 @@ public async Task When_generating_with_no_message_factory_should_use_default() await generator.GenerateAsync(configuration); // Assert - Assert.Equal("DefaultMessageFactory", configuration.MessageFactory); + await Assert.That(configuration.MessageFactory).IsEqualTo("DefaultMessageFactory"); } public void Dispose() diff --git a/tests/Paramore.Brighter.Testing.Tests/Paramore.Brighter.Testing.Tests.csproj b/tests/Paramore.Brighter.Testing.Tests/Paramore.Brighter.Testing.Tests.csproj index 01a712be39..61a3e2cdb9 100644 --- a/tests/Paramore.Brighter.Testing.Tests/Paramore.Brighter.Testing.Tests.csproj +++ b/tests/Paramore.Brighter.Testing.Tests/Paramore.Brighter.Testing.Tests.csproj @@ -2,25 +2,11 @@ false $(BrighterTestTargetFrameworks) + Exe + + - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - + \ No newline at end of file diff --git a/tests/Paramore.Brighter.Testing.Tests/When_async_methods_called_should_record_async_command_types.cs b/tests/Paramore.Brighter.Testing.Tests/When_async_methods_called_should_record_async_command_types.cs index fe4374e073..bee00db4c1 100644 --- a/tests/Paramore.Brighter.Testing.Tests/When_async_methods_called_should_record_async_command_types.cs +++ b/tests/Paramore.Brighter.Testing.Tests/When_async_methods_called_should_record_async_command_types.cs @@ -22,8 +22,6 @@ THE SOFTWARE. */ #endregion using System.Threading.Tasks; -using Shouldly; -using Xunit; namespace Paramore.Brighter.Testing.Tests; @@ -31,54 +29,54 @@ public class SpyCommandProcessorRecordTests { private readonly SpyCommandProcessor _spy = new(); - [Fact] + [Test] public async Task Then_send_async_should_record_send_async() { //Act await _spy.SendAsync(new TestCommand()); //Assert - _spy.Commands.ShouldContain(CommandType.SendAsync); + await Assert.That(_spy.Commands).Contains(CommandType.SendAsync); } - [Fact] + [Test] public async Task Then_publish_async_should_record_publish_async() { //Act await _spy.PublishAsync(new TestEvent()); //Assert - _spy.Commands.ShouldContain(CommandType.PublishAsync); + await Assert.That(_spy.Commands).Contains(CommandType.PublishAsync); } - [Fact] + [Test] public async Task Then_post_async_should_record_post_async() { //Act await _spy.PostAsync(new TestCommand()); //Assert - _spy.Commands.ShouldContain(CommandType.PostAsync); + await Assert.That(_spy.Commands).Contains(CommandType.PostAsync); } - [Fact] + [Test] public async Task Then_deposit_post_async_should_record_deposit_async() { //Act await _spy.DepositPostAsync(new TestCommand()); //Assert - _spy.Commands.ShouldContain(CommandType.DepositAsync); + await Assert.That(_spy.Commands).Contains(CommandType.DepositAsync); } - [Fact] + [Test] public async Task Then_clear_outbox_async_should_record_clear_async() { //Act await _spy.ClearOutboxAsync([Id.Random()]); //Assert - _spy.Commands.ShouldContain(CommandType.ClearAsync); + await Assert.That(_spy.Commands).Contains(CommandType.ClearAsync); } private sealed class TestCommand() : Command(Id.Random()); diff --git a/tests/Paramore.Brighter.Testing.Tests/When_call_count_returns_invocation_count.cs b/tests/Paramore.Brighter.Testing.Tests/When_call_count_returns_invocation_count.cs index 2c24fa7a13..1e404580fa 100644 --- a/tests/Paramore.Brighter.Testing.Tests/When_call_count_returns_invocation_count.cs +++ b/tests/Paramore.Brighter.Testing.Tests/When_call_count_returns_invocation_count.cs @@ -23,8 +23,6 @@ THE SOFTWARE. */ using Paramore.Brighter; using Paramore.Brighter.Testing; -using Shouldly; -using Xunit; namespace Paramore.Brighter.Testing.Tests; @@ -32,25 +30,25 @@ public class SpyCommandProcessorCountTests { private readonly SpyCommandProcessor _spy = new(); - [Fact] - public void Then_call_count_returns_zero_before_any_calls() + [Test] + public async Task Then_call_count_returns_zero_before_any_calls() { //Assert - _spy.CallCount(CommandType.Send).ShouldBe(0); + await Assert.That(_spy.CallCount(CommandType.Send)).IsEqualTo(0); } - [Fact] - public void Then_call_count_returns_one_after_single_call() + [Test] + public async Task Then_call_count_returns_one_after_single_call() { //Act _spy.Send(new TestCommand()); //Assert - _spy.CallCount(CommandType.Send).ShouldBe(1); + await Assert.That(_spy.CallCount(CommandType.Send)).IsEqualTo(1); } - [Fact] - public void Then_call_count_returns_three_after_three_calls() + [Test] + public async Task Then_call_count_returns_three_after_three_calls() { //Act _spy.Send(new TestCommand()); @@ -58,18 +56,18 @@ public void Then_call_count_returns_three_after_three_calls() _spy.Send(new TestCommand()); //Assert - _spy.CallCount(CommandType.Send).ShouldBe(3); + await Assert.That(_spy.CallCount(CommandType.Send)).IsEqualTo(3); } - [Fact] - public void Then_call_count_returns_zero_for_different_method() + [Test] + public async Task Then_call_count_returns_zero_for_different_method() { //Act _spy.Send(new TestCommand()); _spy.Send(new TestCommand()); //Assert - _spy.CallCount(CommandType.Publish).ShouldBe(0); + await Assert.That(_spy.CallCount(CommandType.Publish)).IsEqualTo(0); } private sealed class TestCommand() : Command(Id.Random()); diff --git a/tests/Paramore.Brighter.Testing.Tests/When_call_invoked_records_and_returns_null.cs b/tests/Paramore.Brighter.Testing.Tests/When_call_invoked_records_and_returns_null.cs index 8603c1e3b9..f152aff2bb 100644 --- a/tests/Paramore.Brighter.Testing.Tests/When_call_invoked_records_and_returns_null.cs +++ b/tests/Paramore.Brighter.Testing.Tests/When_call_invoked_records_and_returns_null.cs @@ -24,8 +24,6 @@ THE SOFTWARE. */ using System; using Paramore.Brighter; using Paramore.Brighter.Testing; -using Shouldly; -using Xunit; namespace Paramore.Brighter.Testing.Tests; @@ -45,41 +43,41 @@ public SpyCommandProcessorCallTests() _response = _spy.Call(_request); } - [Fact] - public void Then_should_record_call_command_type() + [Test] + public async Task Then_should_record_call_command_type() { //Assert - _spy.Commands.ShouldContain(CommandType.Call); + await Assert.That(_spy.Commands).Contains(CommandType.Call); } - [Fact] - public void Then_should_return_null() + [Test] + public async Task Then_should_return_null() { //Assert - _response.ShouldBeNull(); + await Assert.That(_response).IsNull(); } - [Fact] - public void Then_should_capture_request_in_recorded_calls() + [Test] + public async Task Then_should_capture_request_in_recorded_calls() { //Assert - _spy.RecordedCalls.Count.ShouldBe(1); - _spy.RecordedCalls[0].Request.ShouldBeSameAs(_request); - _spy.RecordedCalls[0].Type.ShouldBe(CommandType.Call); + await Assert.That(_spy.RecordedCalls.Count).IsEqualTo(1); + await Assert.That(_spy.RecordedCalls[0].Request).IsSameReferenceAs(_request); + await Assert.That(_spy.RecordedCalls[0].Type).IsEqualTo(CommandType.Call); } - [Fact] - public void Then_was_called_should_return_true() + [Test] + public async Task Then_was_called_should_return_true() { //Assert - _spy.WasCalled(CommandType.Call).ShouldBeTrue(); + await Assert.That(_spy.WasCalled(CommandType.Call)).IsTrue(); } - [Fact] - public void Then_call_count_should_be_one() + [Test] + public async Task Then_call_count_should_be_one() { //Assert - _spy.CallCount(CommandType.Call).ShouldBe(1); + await Assert.That(_spy.CallCount(CommandType.Call)).IsEqualTo(1); } private sealed class TestCallRequest : ICall diff --git a/tests/Paramore.Brighter.Testing.Tests/When_clear_outbox_moves_requests_to_queue.cs b/tests/Paramore.Brighter.Testing.Tests/When_clear_outbox_moves_requests_to_queue.cs index b23cc438f7..b08dea6c56 100644 --- a/tests/Paramore.Brighter.Testing.Tests/When_clear_outbox_moves_requests_to_queue.cs +++ b/tests/Paramore.Brighter.Testing.Tests/When_clear_outbox_moves_requests_to_queue.cs @@ -24,8 +24,6 @@ THE SOFTWARE. */ using System; using System.Threading.Tasks; using Paramore.Brighter.Testing; -using Shouldly; -using Xunit; namespace Paramore.Brighter.Testing.Tests; @@ -35,19 +33,19 @@ public class SpyCommandProcessorOutboxTests private readonly MyCommand _command1 = new() { Value = "first" }; private readonly MyCommand _command2 = new() { Value = "second" }; - [Fact] - public void Should_not_be_observable_before_clear() + [Test] + public Task Should_not_be_observable_before_clear() { // Arrange _spy.DepositPost(_command1); // Act & Assert - request is NOT in observation queue yet - var observeAction = () => _spy.Observe(); - observeAction.ShouldThrow(); + Assert.ThrowsExactly(() => _spy.Observe()); + return Task.CompletedTask; } - [Fact] - public void Should_be_observable_after_clear() + [Test] + public async Task Should_be_observable_after_clear() { // Arrange var id = _spy.DepositPost(_command1); @@ -57,11 +55,11 @@ public void Should_be_observable_after_clear() // Assert - request IS now in observation queue var observed = _spy.Observe(); - observed.ShouldBe(_command1); + await Assert.That(observed).IsEqualTo(_command1); } - [Fact] - public void Should_clear_multiple_requests() + [Test] + public async Task Should_clear_multiple_requests() { // Arrange var id1 = _spy.DepositPost(_command1); @@ -71,12 +69,12 @@ public void Should_clear_multiple_requests() _spy.ClearOutbox([id1, id2]); // Assert - both requests are now observable in order - _spy.Observe().ShouldBe(_command1); - _spy.Observe().ShouldBe(_command2); + await Assert.That(_spy.Observe()).IsEqualTo(_command1); + await Assert.That(_spy.Observe()).IsEqualTo(_command2); } - [Fact] - public void Should_record_clear_command_type() + [Test] + public async Task Should_record_clear_command_type() { // Arrange var id = _spy.DepositPost(_command1); @@ -85,10 +83,10 @@ public void Should_record_clear_command_type() _spy.ClearOutbox([id]); // Assert - _spy.WasCalled(CommandType.Clear).ShouldBeTrue(); + await Assert.That(_spy.WasCalled(CommandType.Clear)).IsTrue(); } - [Fact] + [Test] public async Task Should_work_with_async_clear() { // Arrange @@ -98,8 +96,8 @@ public async Task Should_work_with_async_clear() await _spy.ClearOutboxAsync([id]); // Assert - _spy.Observe().ShouldBe(_command1); - _spy.WasCalled(CommandType.ClearAsync).ShouldBeTrue(); + await Assert.That(_spy.Observe()).IsEqualTo(_command1); + await Assert.That(_spy.WasCalled(CommandType.ClearAsync)).IsTrue(); } private sealed class MyCommand : Command diff --git a/tests/Paramore.Brighter.Testing.Tests/When_deposit_post_called_tracks_in_deposited_requests.cs b/tests/Paramore.Brighter.Testing.Tests/When_deposit_post_called_tracks_in_deposited_requests.cs index ffabb6cb76..aeba48e6b0 100644 --- a/tests/Paramore.Brighter.Testing.Tests/When_deposit_post_called_tracks_in_deposited_requests.cs +++ b/tests/Paramore.Brighter.Testing.Tests/When_deposit_post_called_tracks_in_deposited_requests.cs @@ -23,8 +23,6 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter.Testing; -using Shouldly; -using Xunit; namespace Paramore.Brighter.Testing.Tests; @@ -34,8 +32,8 @@ public class SpyCommandProcessorDepositTests private readonly MyCommand _command1 = new() { Value = "first" }; private readonly MyCommand _command2 = new() { Value = "second" }; - [Fact] - public void Should_return_id_from_deposit_post() + [Test] + public async Task Should_return_id_from_deposit_post() { // Arrange - command has a known Id @@ -43,11 +41,11 @@ public void Should_return_id_from_deposit_post() var returnedId = _spy.DepositPost(_command1); // Assert - returnedId.ShouldBe(_command1.Id); + await Assert.That(returnedId).IsEqualTo(_command1.Id); } - [Fact] - public void Should_track_deposited_request_by_id() + [Test] + public async Task Should_track_deposited_request_by_id() { // Arrange var id = _spy.DepositPost(_command1); @@ -56,41 +54,41 @@ public void Should_track_deposited_request_by_id() var depositedRequest = _spy.DepositedRequests[id]; // Assert - depositedRequest.ShouldBe(_command1); + await Assert.That(depositedRequest).IsEqualTo(_command1); } - [Fact] - public void Should_track_multiple_deposits_independently() + [Test] + public async Task Should_track_multiple_deposits_independently() { // Arrange & Act var id1 = _spy.DepositPost(_command1); var id2 = _spy.DepositPost(_command2); // Assert - _spy.DepositedRequests[id1].ShouldBe(_command1); - _spy.DepositedRequests[id2].ShouldBe(_command2); - _spy.DepositedRequests.Count.ShouldBe(2); + await Assert.That(_spy.DepositedRequests[id1]).IsEqualTo(_command1); + await Assert.That(_spy.DepositedRequests[id2]).IsEqualTo(_command2); + await Assert.That(_spy.DepositedRequests.Count).IsEqualTo(2); } - [Fact] + [Test] public async Task Should_track_async_deposits() { // Arrange & Act var id = await _spy.DepositPostAsync(_command1); // Assert - _spy.DepositedRequests[id].ShouldBe(_command1); + await Assert.That(_spy.DepositedRequests[id]).IsEqualTo(_command1); } - [Fact] - public void Should_not_add_deposited_requests_to_observation_queue() + [Test] + public Task Should_not_add_deposited_requests_to_observation_queue() { // Arrange & Act _spy.DepositPost(_command1); // Assert - DepositPost should NOT add to observation queue (that's ClearOutbox's job) - var observeAction = () => _spy.Observe(); - observeAction.ShouldThrow(); + Assert.ThrowsExactly(() => _spy.Observe()); + return Task.CompletedTask; } private sealed class MyCommand : Command diff --git a/tests/Paramore.Brighter.Testing.Tests/When_get_calls_returns_matching_recorded_calls.cs b/tests/Paramore.Brighter.Testing.Tests/When_get_calls_returns_matching_recorded_calls.cs index beda3f5557..f6d838983c 100644 --- a/tests/Paramore.Brighter.Testing.Tests/When_get_calls_returns_matching_recorded_calls.cs +++ b/tests/Paramore.Brighter.Testing.Tests/When_get_calls_returns_matching_recorded_calls.cs @@ -24,8 +24,6 @@ THE SOFTWARE. */ using System; using System.Linq; using Paramore.Brighter.Testing; -using Shouldly; -using Xunit; namespace Paramore.Brighter.Testing.Tests; @@ -36,8 +34,8 @@ public class SpyCommandProcessorFindRecordedCallsTests private readonly MyCommand _command2 = new() { Value = "second" }; private readonly MyEvent _event1 = new() { Data = "event" }; - [Fact] - public void Should_return_all_calls_for_command_type() + [Test] + public async Task Should_return_all_calls_for_command_type() { // Arrange _spy.Send(_command1); @@ -48,14 +46,14 @@ public void Should_return_all_calls_for_command_type() var sendCalls = _spy.GetCalls(CommandType.Send); // Assert - sendCalls.ShouldNotBeNull(); - sendCalls.Count().ShouldBe(2); - sendCalls.Select(c => c.Request).ShouldContain(_command1); - sendCalls.Select(c => c.Request).ShouldContain(_command2); + await Assert.That(sendCalls).IsNotNull(); + await Assert.That(sendCalls.Count()).IsEqualTo(2); + await Assert.That(sendCalls.Select(c => c.Request)).Contains(_command1); + await Assert.That(sendCalls.Select(c => c.Request)).Contains(_command2); } - [Fact] - public void Should_return_recorded_call_with_full_details() + [Test] + public async Task Should_return_recorded_call_with_full_details() { // Arrange var context = new RequestContext(); @@ -66,16 +64,16 @@ public void Should_return_recorded_call_with_full_details() // Assert var call = calls.Single(); - call.Type.ShouldBe(CommandType.Send); - call.Request.ShouldBe(_command1); - call.Context.ShouldBe(context); - call.Timestamp.ShouldBeInRange( + await Assert.That(call.Type).IsEqualTo(CommandType.Send); + await Assert.That(call.Request).IsEqualTo(_command1); + await Assert.That(call.Context).IsEqualTo(context); + await Assert.That(call.Timestamp).IsBetween( DateTime.UtcNow.AddSeconds(-5), DateTime.UtcNow.AddSeconds(1)); } - [Fact] - public void Should_return_empty_when_no_matching_calls() + [Test] + public async Task Should_return_empty_when_no_matching_calls() { // Arrange _spy.Send(_command1); @@ -84,11 +82,11 @@ public void Should_return_empty_when_no_matching_calls() var publishCalls = _spy.GetCalls(CommandType.Publish); // Assert - publishCalls.ShouldBeEmpty(); + await Assert.That(publishCalls).IsEmpty(); } - [Fact] - public void Should_filter_to_specific_command_type_only() + [Test] + public async Task Should_filter_to_specific_command_type_only() { // Arrange _spy.Send(_command1); @@ -99,8 +97,8 @@ public void Should_filter_to_specific_command_type_only() var publishCalls = _spy.GetCalls(CommandType.Publish); // Assert - publishCalls.Count().ShouldBe(1); - publishCalls.Single().Request.ShouldBe(_event1); + await Assert.That(publishCalls.Count()).IsEqualTo(1); + await Assert.That(publishCalls.Single().Request).IsEqualTo(_event1); } private sealed class MyCommand : Command diff --git a/tests/Paramore.Brighter.Testing.Tests/When_get_requests_returns_matching_requests.cs b/tests/Paramore.Brighter.Testing.Tests/When_get_requests_returns_matching_requests.cs index d21b182edf..8ff5c4cd0e 100644 --- a/tests/Paramore.Brighter.Testing.Tests/When_get_requests_returns_matching_requests.cs +++ b/tests/Paramore.Brighter.Testing.Tests/When_get_requests_returns_matching_requests.cs @@ -23,8 +23,6 @@ THE SOFTWARE. */ using System.Linq; using Paramore.Brighter.Testing; -using Shouldly; -using Xunit; namespace Paramore.Brighter.Testing.Tests; @@ -35,8 +33,8 @@ public class SpyCommandProcessorGetRequestsTests private readonly MyCommand _command2 = new() { Value = "second" }; private readonly MyEvent _event1 = new() { Data = "event" }; - [Fact] - public void Should_return_all_requests_of_type() + [Test] + public async Task Should_return_all_requests_of_type() { // Arrange _spy.Send(_command1); @@ -47,14 +45,14 @@ public void Should_return_all_requests_of_type() var commands = _spy.GetRequests(); // Assert - commands.ShouldNotBeNull(); - commands.Count().ShouldBe(2); - commands.ShouldContain(_command1); - commands.ShouldContain(_command2); + await Assert.That(commands).IsNotNull(); + await Assert.That(commands.Count()).IsEqualTo(2); + await Assert.That(commands).Contains(_command1); + await Assert.That(commands).Contains(_command2); } - [Fact] - public void Should_be_non_destructive() + [Test] + public async Task Should_be_non_destructive() { // Arrange _spy.Send(_command1); @@ -65,13 +63,13 @@ public void Should_be_non_destructive() var secondCall = _spy.GetRequests().ToList(); // Assert - both calls return the same results - firstCall.Count.ShouldBe(2); - secondCall.Count.ShouldBe(2); - firstCall.ShouldBe(secondCall); + await Assert.That(firstCall.Count).IsEqualTo(2); + await Assert.That(secondCall.Count).IsEqualTo(2); + await Assert.That(firstCall).IsEquivalentTo(secondCall); } - [Fact] - public void Should_return_empty_when_no_matching_requests() + [Test] + public async Task Should_return_empty_when_no_matching_requests() { // Arrange - send only events, no commands _spy.Publish(_event1); @@ -80,11 +78,11 @@ public void Should_return_empty_when_no_matching_requests() var commands = _spy.GetRequests(); // Assert - commands.ShouldBeEmpty(); + await Assert.That(commands).IsEmpty(); } - [Fact] - public void Should_filter_to_specific_type_only() + [Test] + public async Task Should_filter_to_specific_type_only() { // Arrange _spy.Send(_command1); @@ -94,8 +92,8 @@ public void Should_filter_to_specific_type_only() var events = _spy.GetRequests(); // Assert - events.Count().ShouldBe(1); - events.Single().ShouldBe(_event1); + await Assert.That(events.Count()).IsEqualTo(1); + await Assert.That(events.Single()).IsEqualTo(_event1); } private sealed class MyCommand : Command diff --git a/tests/Paramore.Brighter.Testing.Tests/When_method_called_should_capture_request_details.cs b/tests/Paramore.Brighter.Testing.Tests/When_method_called_should_capture_request_details.cs index 3a6205fcf4..2e58495b01 100644 --- a/tests/Paramore.Brighter.Testing.Tests/When_method_called_should_capture_request_details.cs +++ b/tests/Paramore.Brighter.Testing.Tests/When_method_called_should_capture_request_details.cs @@ -24,8 +24,6 @@ THE SOFTWARE. */ using System; using Paramore.Brighter; using Paramore.Brighter.Testing; -using Shouldly; -using Xunit; namespace Paramore.Brighter.Testing.Tests; @@ -50,35 +48,35 @@ public SpyCommandProcessorCaptureRequestDetailsTests() _afterCall = DateTime.UtcNow; } - [Fact] - public void Then_recorded_call_should_have_correct_type() + [Test] + public async Task Then_recorded_call_should_have_correct_type() { //Assert - _spy.RecordedCalls.ShouldHaveSingleItem(); - _spy.RecordedCalls[0].Type.ShouldBe(CommandType.Send); + await Assert.That(_spy.RecordedCalls).HasSingleItem(); + await Assert.That(_spy.RecordedCalls[0].Type).IsEqualTo(CommandType.Send); } - [Fact] - public void Then_recorded_call_should_have_exact_request() + [Test] + public async Task Then_recorded_call_should_have_exact_request() { //Assert - _spy.RecordedCalls[0].Request.ShouldBeSameAs(_command); + await Assert.That(_spy.RecordedCalls[0].Request).IsSameReferenceAs(_command); } - [Fact] - public void Then_recorded_call_should_have_timestamp_within_range() + [Test] + public async Task Then_recorded_call_should_have_timestamp_within_range() { //Assert var timestamp = _spy.RecordedCalls[0].Timestamp; - timestamp.ShouldBeGreaterThanOrEqualTo(_beforeCall); - timestamp.ShouldBeLessThanOrEqualTo(_afterCall); + await Assert.That(timestamp).IsGreaterThanOrEqualTo(_beforeCall); + await Assert.That(timestamp).IsLessThanOrEqualTo(_afterCall); } - [Fact] - public void Then_recorded_call_should_capture_request_context() + [Test] + public async Task Then_recorded_call_should_capture_request_context() { //Assert - _spy.RecordedCalls[0].Context.ShouldBeSameAs(_context); + await Assert.That(_spy.RecordedCalls[0].Context).IsSameReferenceAs(_context); } private sealed class TestCommand() : Command(Id.Random()); diff --git a/tests/Paramore.Brighter.Testing.Tests/When_observe_dequeues_requests_in_order.cs b/tests/Paramore.Brighter.Testing.Tests/When_observe_dequeues_requests_in_order.cs index 8f90408560..ff3ded0b83 100644 --- a/tests/Paramore.Brighter.Testing.Tests/When_observe_dequeues_requests_in_order.cs +++ b/tests/Paramore.Brighter.Testing.Tests/When_observe_dequeues_requests_in_order.cs @@ -24,8 +24,6 @@ THE SOFTWARE. */ using System; using Paramore.Brighter; using Paramore.Brighter.Testing; -using Shouldly; -using Xunit; namespace Paramore.Brighter.Testing.Tests; @@ -47,42 +45,43 @@ public SpyCommandProcessorObserveTests() _spy.Send(_command2); } - [Fact] - public void Then_first_observe_returns_first_request() + [Test] + public async Task Then_first_observe_returns_first_request() { //Act var observed = _spy.Observe(); //Assert - observed.ShouldBeSameAs(_command1); - observed.Name.ShouldBe("first"); + await Assert.That(observed).IsSameReferenceAs(_command1); + await Assert.That(observed.Name).IsEqualTo("first"); } - [Fact] - public void Then_second_observe_returns_second_request() + [Test] + public async Task Then_second_observe_returns_second_request() { //Act _spy.Observe(); // Dequeue first var observed = _spy.Observe(); //Assert - observed.ShouldBeSameAs(_command2); - observed.Name.ShouldBe("second"); + await Assert.That(observed).IsSameReferenceAs(_command2); + await Assert.That(observed.Name).IsEqualTo("second"); } - [Fact] - public void Then_observe_throws_when_queue_is_empty() + [Test] + public Task Then_observe_throws_when_queue_is_empty() { //Act _spy.Observe(); // Dequeue first _spy.Observe(); // Dequeue second //Assert - Should.Throw(() => _spy.Observe()); + Assert.ThrowsExactly(() => _spy.Observe()); + return Task.CompletedTask; } - [Fact] - public void Then_observe_filters_by_request_type() + [Test] + public async Task Then_observe_filters_by_request_type() { //Arrange - add a different type _spy.Publish(new TestEvent()); @@ -91,7 +90,7 @@ public void Then_observe_filters_by_request_type() var observed = _spy.Observe(); //Assert - observed.ShouldBeOfType(); + await Assert.That(observed).IsTypeOf(); } private sealed class TestCommand(string name) : Command(Id.Random()) diff --git a/tests/Paramore.Brighter.Testing.Tests/When_reset_clears_all_state.cs b/tests/Paramore.Brighter.Testing.Tests/When_reset_clears_all_state.cs index e49c2ed729..e6b99d5d38 100644 --- a/tests/Paramore.Brighter.Testing.Tests/When_reset_clears_all_state.cs +++ b/tests/Paramore.Brighter.Testing.Tests/When_reset_clears_all_state.cs @@ -23,8 +23,6 @@ THE SOFTWARE. */ using System; using Paramore.Brighter.Testing; -using Shouldly; -using Xunit; namespace Paramore.Brighter.Testing.Tests; @@ -33,40 +31,40 @@ public class SpyCommandProcessorClearTests private readonly SpyCommandProcessor _spy = new(); private readonly MyCommand _command = new() { Value = "test" }; - [Fact] - public void Should_clear_recorded_calls() + [Test] + public async Task Should_clear_recorded_calls() { // Arrange _spy.Send(_command); - _spy.RecordedCalls.Count.ShouldBe(1); + await Assert.That(_spy.RecordedCalls.Count).IsEqualTo(1); // Act _spy.Reset(); // Assert - _spy.RecordedCalls.ShouldBeEmpty(); + await Assert.That(_spy.RecordedCalls).IsEmpty(); } - [Fact] - public void Should_clear_commands() + [Test] + public async Task Should_clear_commands() { // Arrange _spy.Send(_command); - _spy.Commands.Count.ShouldBe(1); + await Assert.That(_spy.Commands.Count).IsEqualTo(1); // Act _spy.Reset(); // Assert - _spy.Commands.ShouldBeEmpty(); + await Assert.That(_spy.Commands).IsEmpty(); } - [Fact] - public void Should_clear_observation_queue() + [Test] + public async Task Should_clear_observation_queue() { // Arrange _spy.Send(_command); - _spy.Observe().ShouldBe(_command); // Confirm it was observable + await Assert.That(_spy.Observe()).IsEqualTo(_command); // Confirm it was observable _spy.Send(_command); // Add another one @@ -74,51 +72,50 @@ public void Should_clear_observation_queue() _spy.Reset(); // Assert - observation queue is empty - var observeAction = () => _spy.Observe(); - observeAction.ShouldThrow(); + Assert.ThrowsExactly(() => _spy.Observe()); } - [Fact] - public void Should_clear_deposited_requests() + [Test] + public async Task Should_clear_deposited_requests() { // Arrange var id = _spy.DepositPost(_command); - _spy.DepositedRequests.Count.ShouldBe(1); + await Assert.That(_spy.DepositedRequests.Count).IsEqualTo(1); // Act _spy.Reset(); // Assert - _spy.DepositedRequests.ShouldBeEmpty(); + await Assert.That(_spy.DepositedRequests).IsEmpty(); } - [Fact] - public void Should_reset_was_called_to_false() + [Test] + public async Task Should_reset_was_called_to_false() { // Arrange _spy.Send(_command); - _spy.WasCalled(CommandType.Send).ShouldBeTrue(); + await Assert.That(_spy.WasCalled(CommandType.Send)).IsTrue(); // Act _spy.Reset(); // Assert - _spy.WasCalled(CommandType.Send).ShouldBeFalse(); + await Assert.That(_spy.WasCalled(CommandType.Send)).IsFalse(); } - [Fact] - public void Should_reset_call_count_to_zero() + [Test] + public async Task Should_reset_call_count_to_zero() { // Arrange _spy.Send(_command); _spy.Send(_command); - _spy.CallCount(CommandType.Send).ShouldBe(2); + await Assert.That(_spy.CallCount(CommandType.Send)).IsEqualTo(2); // Act _spy.Reset(); // Assert - _spy.CallCount(CommandType.Send).ShouldBe(0); + await Assert.That(_spy.CallCount(CommandType.Send)).IsEqualTo(0); } private sealed class MyCommand : Command diff --git a/tests/Paramore.Brighter.Testing.Tests/When_scheduled_methods_record_scheduler_types.cs b/tests/Paramore.Brighter.Testing.Tests/When_scheduled_methods_record_scheduler_types.cs index 9ea66e5c01..f0d78dc15b 100644 --- a/tests/Paramore.Brighter.Testing.Tests/When_scheduled_methods_record_scheduler_types.cs +++ b/tests/Paramore.Brighter.Testing.Tests/When_scheduled_methods_record_scheduler_types.cs @@ -25,8 +25,6 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter; using Paramore.Brighter.Testing; -using Shouldly; -using Xunit; namespace Paramore.Brighter.Testing.Tests; @@ -49,32 +47,32 @@ public SpyCommandProcessorScheduledSendTests() _sendDelayId = _spy.Send(delay, command); } - [Fact] - public void Then_should_record_scheduler_type_for_send_at() + [Test] + public async Task Then_should_record_scheduler_type_for_send_at() { //Assert - _spy.Commands[0].ShouldBe(CommandType.Scheduler); + await Assert.That(_spy.Commands[0]).IsEqualTo(CommandType.Scheduler); } - [Fact] - public void Then_should_record_scheduler_type_for_send_delay() + [Test] + public async Task Then_should_record_scheduler_type_for_send_delay() { //Assert - _spy.Commands[1].ShouldBe(CommandType.Scheduler); + await Assert.That(_spy.Commands[1]).IsEqualTo(CommandType.Scheduler); } - [Fact] - public void Then_send_at_should_return_scheduler_id() + [Test] + public async Task Then_send_at_should_return_scheduler_id() { //Assert - _sendAtId.ShouldNotBeNullOrEmpty(); + await Assert.That(string.IsNullOrEmpty(_sendAtId)).IsFalse(); } - [Fact] - public void Then_send_delay_should_return_scheduler_id() + [Test] + public async Task Then_send_delay_should_return_scheduler_id() { //Assert - _sendDelayId.ShouldNotBeNullOrEmpty(); + await Assert.That(string.IsNullOrEmpty(_sendDelayId)).IsFalse(); } private sealed class TestCommand() : Command(Id.Random()); @@ -99,32 +97,32 @@ public SpyCommandProcessorScheduledPublishTests() _publishDelayId = _spy.Publish(delay, @event); } - [Fact] - public void Then_should_record_scheduler_type_for_publish_at() + [Test] + public async Task Then_should_record_scheduler_type_for_publish_at() { //Assert - _spy.Commands[0].ShouldBe(CommandType.Scheduler); + await Assert.That(_spy.Commands[0]).IsEqualTo(CommandType.Scheduler); } - [Fact] - public void Then_should_record_scheduler_type_for_publish_delay() + [Test] + public async Task Then_should_record_scheduler_type_for_publish_delay() { //Assert - _spy.Commands[1].ShouldBe(CommandType.Scheduler); + await Assert.That(_spy.Commands[1]).IsEqualTo(CommandType.Scheduler); } - [Fact] - public void Then_publish_at_should_return_scheduler_id() + [Test] + public async Task Then_publish_at_should_return_scheduler_id() { //Assert - _publishAtId.ShouldNotBeNullOrEmpty(); + await Assert.That(string.IsNullOrEmpty(_publishAtId)).IsFalse(); } - [Fact] - public void Then_publish_delay_should_return_scheduler_id() + [Test] + public async Task Then_publish_delay_should_return_scheduler_id() { //Assert - _publishDelayId.ShouldNotBeNullOrEmpty(); + await Assert.That(string.IsNullOrEmpty(_publishDelayId)).IsFalse(); } private sealed class TestEvent() : Event(Id.Random()); @@ -149,32 +147,32 @@ public SpyCommandProcessorScheduledPostTests() _postDelayId = _spy.Post(delay, command); } - [Fact] - public void Then_should_record_scheduler_type_for_post_at() + [Test] + public async Task Then_should_record_scheduler_type_for_post_at() { //Assert - _spy.Commands[0].ShouldBe(CommandType.Scheduler); + await Assert.That(_spy.Commands[0]).IsEqualTo(CommandType.Scheduler); } - [Fact] - public void Then_should_record_scheduler_type_for_post_delay() + [Test] + public async Task Then_should_record_scheduler_type_for_post_delay() { //Assert - _spy.Commands[1].ShouldBe(CommandType.Scheduler); + await Assert.That(_spy.Commands[1]).IsEqualTo(CommandType.Scheduler); } - [Fact] - public void Then_post_at_should_return_scheduler_id() + [Test] + public async Task Then_post_at_should_return_scheduler_id() { //Assert - _postAtId.ShouldNotBeNullOrEmpty(); + await Assert.That(string.IsNullOrEmpty(_postAtId)).IsFalse(); } - [Fact] - public void Then_post_delay_should_return_scheduler_id() + [Test] + public async Task Then_post_delay_should_return_scheduler_id() { //Assert - _postDelayId.ShouldNotBeNullOrEmpty(); + await Assert.That(string.IsNullOrEmpty(_postDelayId)).IsFalse(); } private sealed class TestCommand() : Command(Id.Random()); @@ -183,63 +181,68 @@ private sealed class TestCommand() : Command(Id.Random()); public class SpyCommandProcessorScheduledAsyncTests { private readonly SpyCommandProcessor _spy; - private readonly string _sendAsyncAtId; - private readonly string _publishAsyncDelayId; - private readonly string _postAsyncAtId; + private string _sendAsyncAtId; + private string _publishAsyncDelayId; + private string _postAsyncAtId; public SpyCommandProcessorScheduledAsyncTests() { //Arrange _spy = new SpyCommandProcessor(); + } + + [Before(Test)] + public async Task Setup() + { var command = new TestCommand(); var @event = new TestEvent(); var at = DateTimeOffset.UtcNow.AddMinutes(5); var delay = TimeSpan.FromMinutes(10); //Act - _sendAsyncAtId = _spy.SendAsync(at, command).GetAwaiter().GetResult(); - _publishAsyncDelayId = _spy.PublishAsync(delay, @event).GetAwaiter().GetResult(); - _postAsyncAtId = _spy.PostAsync(at, command).GetAwaiter().GetResult(); + _sendAsyncAtId = await _spy.SendAsync(at, command); + _publishAsyncDelayId = await _spy.PublishAsync(delay, @event); + _postAsyncAtId = await _spy.PostAsync(at, command); } - [Fact] - public void Then_should_record_scheduler_async_for_send() + [Test] + public async Task Then_should_record_scheduler_async_for_send() { //Assert - _spy.Commands[0].ShouldBe(CommandType.SchedulerAsync); + await Assert.That(_spy.Commands[0]).IsEqualTo(CommandType.SchedulerAsync); } - [Fact] - public void Then_should_record_scheduler_async_for_publish() + [Test] + public async Task Then_should_record_scheduler_async_for_publish() { //Assert - _spy.Commands[1].ShouldBe(CommandType.SchedulerAsync); + await Assert.That(_spy.Commands[1]).IsEqualTo(CommandType.SchedulerAsync); } - [Fact] - public void Then_should_record_scheduler_async_for_post() + [Test] + public async Task Then_should_record_scheduler_async_for_post() { //Assert - _spy.Commands[2].ShouldBe(CommandType.SchedulerAsync); + await Assert.That(_spy.Commands[2]).IsEqualTo(CommandType.SchedulerAsync); } - [Fact] - public void Then_async_scheduled_methods_should_return_ids() + [Test] + public async Task Then_async_scheduled_methods_should_return_ids() { //Assert - _sendAsyncAtId.ShouldNotBeNullOrEmpty(); - _publishAsyncDelayId.ShouldNotBeNullOrEmpty(); - _postAsyncAtId.ShouldNotBeNullOrEmpty(); + await Assert.That(string.IsNullOrEmpty(_sendAsyncAtId)).IsFalse(); + await Assert.That(string.IsNullOrEmpty(_publishAsyncDelayId)).IsFalse(); + await Assert.That(string.IsNullOrEmpty(_postAsyncAtId)).IsFalse(); } - [Fact] - public void Then_should_record_requests_in_recorded_calls() + [Test] + public async Task Then_should_record_requests_in_recorded_calls() { //Assert - _spy.RecordedCalls.Count.ShouldBe(3); - _spy.RecordedCalls[0].Request.ShouldBeOfType(); - _spy.RecordedCalls[1].Request.ShouldBeOfType(); - _spy.RecordedCalls[2].Request.ShouldBeOfType(); + await Assert.That(_spy.RecordedCalls.Count).IsEqualTo(3); + await Assert.That(_spy.RecordedCalls[0].Request).IsTypeOf(); + await Assert.That(_spy.RecordedCalls[1].Request).IsTypeOf(); + await Assert.That(_spy.RecordedCalls[2].Request).IsTypeOf(); } private sealed class TestCommand() : Command(Id.Random()); diff --git a/tests/Paramore.Brighter.Testing.Tests/When_send_is_called_should_record_command_type.cs b/tests/Paramore.Brighter.Testing.Tests/When_send_is_called_should_record_command_type.cs index 055a2af29b..be9c62e4f7 100644 --- a/tests/Paramore.Brighter.Testing.Tests/When_send_is_called_should_record_command_type.cs +++ b/tests/Paramore.Brighter.Testing.Tests/When_send_is_called_should_record_command_type.cs @@ -23,8 +23,6 @@ THE SOFTWARE. */ using Paramore.Brighter; using Paramore.Brighter.Testing; -using Shouldly; -using Xunit; namespace Paramore.Brighter.Testing.Tests; @@ -42,18 +40,18 @@ public SpyCommandProcessorCommandTypeTests() _spy.Send(command); } - [Fact] - public void Then_commands_should_contain_send() + [Test] + public async Task Then_commands_should_contain_send() { //Assert - _spy.Commands.ShouldContain(CommandType.Send); + await Assert.That(_spy.Commands).Contains(CommandType.Send); } - [Fact] - public void Then_commands_should_have_single_entry() + [Test] + public async Task Then_commands_should_have_single_entry() { //Assert - _spy.Commands.Count.ShouldBe(1); + await Assert.That(_spy.Commands.Count).IsEqualTo(1); } private sealed class TestCommand() : Command(Id.Random()); diff --git a/tests/Paramore.Brighter.Testing.Tests/When_subclass_overrides_executes_custom_behavior.cs b/tests/Paramore.Brighter.Testing.Tests/When_subclass_overrides_executes_custom_behavior.cs index d3a8c06d17..a222dacc58 100644 --- a/tests/Paramore.Brighter.Testing.Tests/When_subclass_overrides_executes_custom_behavior.cs +++ b/tests/Paramore.Brighter.Testing.Tests/When_subclass_overrides_executes_custom_behavior.cs @@ -24,8 +24,6 @@ THE SOFTWARE. */ using System; using Paramore.Brighter; using Paramore.Brighter.Testing; -using Shouldly; -using Xunit; namespace Paramore.Brighter.Testing.Tests; @@ -33,7 +31,6 @@ public class SpyCommandProcessorSubclassOverrideSendTests { private readonly ThrowingSpyCommandProcessor _spy; private readonly TestCommand _command; - private readonly InvalidOperationException _caughtException; public SpyCommandProcessorSubclassOverrideSendTests() { @@ -42,29 +39,30 @@ public SpyCommandProcessorSubclassOverrideSendTests() _command = new TestCommand(); //Act - _caughtException = Should.Throw(() => _spy.Send(_command)); + try { _spy.Send(_command); } catch (InvalidOperationException) { } } - [Fact] - public void Then_should_throw_custom_exception() + [Test] + public Task Then_should_throw_custom_exception() { //Assert - _caughtException.Message.ShouldBe("Send is not allowed in this test"); + Assert.ThrowsExactly(() => _spy.Send(new TestCommand())); + return Task.CompletedTask; } - [Fact] - public void Then_base_should_have_recorded_the_call() + [Test] + public async Task Then_base_should_have_recorded_the_call() { //Assert - _spy.WasCalled(CommandType.Send).ShouldBeTrue(); + await Assert.That(_spy.WasCalled(CommandType.Send)).IsTrue(); } - [Fact] - public void Then_request_should_be_captured_in_recorded_calls() + [Test] + public async Task Then_request_should_be_captured_in_recorded_calls() { //Assert - _spy.RecordedCalls.Count.ShouldBe(1); - _spy.RecordedCalls[0].Request.ShouldBeSameAs(_command); + await Assert.That(_spy.RecordedCalls.Count).IsEqualTo(1); + await Assert.That(_spy.RecordedCalls[0].Request).IsSameReferenceAs(_command); } private sealed class TestCommand() : Command(Id.Random()); @@ -74,7 +72,6 @@ public class SpyCommandProcessorSubclassOverridePublishTests { private readonly ThrowingSpyCommandProcessor _spy; private readonly TestEvent _event; - private readonly InvalidOperationException _caughtException; public SpyCommandProcessorSubclassOverridePublishTests() { @@ -83,21 +80,22 @@ public SpyCommandProcessorSubclassOverridePublishTests() _event = new TestEvent(); //Act - _caughtException = Should.Throw(() => _spy.Publish(_event)); + try { _spy.Publish(_event); } catch (InvalidOperationException) { } } - [Fact] - public void Then_should_throw_custom_exception() + [Test] + public Task Then_should_throw_custom_exception() { //Assert - _caughtException.Message.ShouldBe("Publish is not allowed in this test"); + Assert.ThrowsExactly(() => _spy.Publish(new TestEvent())); + return Task.CompletedTask; } - [Fact] - public void Then_base_should_have_recorded_the_call() + [Test] + public async Task Then_base_should_have_recorded_the_call() { //Assert - _spy.WasCalled(CommandType.Publish).ShouldBeTrue(); + await Assert.That(_spy.WasCalled(CommandType.Publish)).IsTrue(); } private sealed class TestEvent() : Event(Id.Random()); diff --git a/tests/Paramore.Brighter.Testing.Tests/When_transaction_provider_overloads_record_correctly.cs b/tests/Paramore.Brighter.Testing.Tests/When_transaction_provider_overloads_record_correctly.cs index 2a6ac35eb4..ab29f5a62f 100644 --- a/tests/Paramore.Brighter.Testing.Tests/When_transaction_provider_overloads_record_correctly.cs +++ b/tests/Paramore.Brighter.Testing.Tests/When_transaction_provider_overloads_record_correctly.cs @@ -26,8 +26,6 @@ THE SOFTWARE. */ using System.Threading.Tasks; using Paramore.Brighter; using Paramore.Brighter.Testing; -using Shouldly; -using Xunit; namespace Paramore.Brighter.Testing.Tests; @@ -55,50 +53,50 @@ public SpyCommandProcessorTransactionProviderSyncTests() new[] { _batchCommand1, _batchCommand2 }, transactionProvider); } - [Fact] - public void Then_single_deposit_should_record_deposit_type() + [Test] + public async Task Then_single_deposit_should_record_deposit_type() { //Assert - _spy.Commands[0].ShouldBe(CommandType.Deposit); + await Assert.That(_spy.Commands[0]).IsEqualTo(CommandType.Deposit); } - [Fact] - public void Then_single_deposit_should_return_request_id() + [Test] + public async Task Then_single_deposit_should_return_request_id() { //Assert - _singleId.ShouldBe(_singleCommand.Id); + await Assert.That(_singleId).IsEqualTo(_singleCommand.Id); } - [Fact] - public void Then_single_deposit_should_be_in_deposited_requests() + [Test] + public async Task Then_single_deposit_should_be_in_deposited_requests() { //Assert - _spy.DepositedRequests[_singleId].ShouldBeSameAs(_singleCommand); + await Assert.That(_spy.DepositedRequests[_singleId]).IsSameReferenceAs(_singleCommand); } - [Fact] - public void Then_batch_deposit_should_record_deposit_types() + [Test] + public async Task Then_batch_deposit_should_record_deposit_types() { //Assert - _spy.Commands[1].ShouldBe(CommandType.Deposit); - _spy.Commands[2].ShouldBe(CommandType.Deposit); + await Assert.That(_spy.Commands[1]).IsEqualTo(CommandType.Deposit); + await Assert.That(_spy.Commands[2]).IsEqualTo(CommandType.Deposit); } - [Fact] - public void Then_batch_deposit_should_return_ids_for_each_request() + [Test] + public async Task Then_batch_deposit_should_return_ids_for_each_request() { //Assert - _batchIds.Length.ShouldBe(2); - _batchIds[0].ShouldBe(_batchCommand1.Id); - _batchIds[1].ShouldBe(_batchCommand2.Id); + await Assert.That(_batchIds.Length).IsEqualTo(2); + await Assert.That(_batchIds[0]).IsEqualTo(_batchCommand1.Id); + await Assert.That(_batchIds[1]).IsEqualTo(_batchCommand2.Id); } - [Fact] - public void Then_batch_deposits_should_be_in_deposited_requests() + [Test] + public async Task Then_batch_deposits_should_be_in_deposited_requests() { //Assert - _spy.DepositedRequests[_batchIds[0]].ShouldBeSameAs(_batchCommand1); - _spy.DepositedRequests[_batchIds[1]].ShouldBeSameAs(_batchCommand2); + await Assert.That(_spy.DepositedRequests[_batchIds[0]]).IsSameReferenceAs(_batchCommand1); + await Assert.That(_spy.DepositedRequests[_batchIds[1]]).IsSameReferenceAs(_batchCommand2); } private sealed class TestCommand() : Command(Id.Random()); @@ -107,8 +105,8 @@ private sealed class TestCommand() : Command(Id.Random()); public class SpyCommandProcessorTransactionProviderAsyncTests { private readonly SpyCommandProcessor _spy; - private readonly Id _singleId; - private readonly Id[] _batchIds; + private Id _singleId; + private Id[] _batchIds; private readonly TestCommand _singleCommand; private readonly TestCommand _batchCommand1; private readonly TestCommand _batchCommand2; @@ -120,59 +118,62 @@ public SpyCommandProcessorTransactionProviderAsyncTests() _singleCommand = new TestCommand(); _batchCommand1 = new TestCommand(); _batchCommand2 = new TestCommand(); + } + + [Before(Test)] + public async Task Setup() + { var transactionProvider = new StubTransactionProvider(); //Act - _singleId = _spy.DepositPostAsync(_singleCommand, transactionProvider) - .GetAwaiter().GetResult(); - _batchIds = _spy.DepositPostAsync( - new[] { _batchCommand1, _batchCommand2 }, transactionProvider) - .GetAwaiter().GetResult(); + _singleId = await _spy.DepositPostAsync(_singleCommand, transactionProvider); + _batchIds = await _spy.DepositPostAsync( + new[] { _batchCommand1, _batchCommand2 }, transactionProvider); } - [Fact] - public void Then_single_async_deposit_should_record_deposit_async_type() + [Test] + public async Task Then_single_async_deposit_should_record_deposit_async_type() { //Assert - _spy.Commands[0].ShouldBe(CommandType.DepositAsync); + await Assert.That(_spy.Commands[0]).IsEqualTo(CommandType.DepositAsync); } - [Fact] - public void Then_single_async_deposit_should_return_request_id() + [Test] + public async Task Then_single_async_deposit_should_return_request_id() { //Assert - _singleId.ShouldBe(_singleCommand.Id); + await Assert.That(_singleId).IsEqualTo(_singleCommand.Id); } - [Fact] - public void Then_single_async_deposit_should_be_in_deposited_requests() + [Test] + public async Task Then_single_async_deposit_should_be_in_deposited_requests() { //Assert - _spy.DepositedRequests[_singleId].ShouldBeSameAs(_singleCommand); + await Assert.That(_spy.DepositedRequests[_singleId]).IsSameReferenceAs(_singleCommand); } - [Fact] - public void Then_batch_async_deposit_should_record_deposit_async_types() + [Test] + public async Task Then_batch_async_deposit_should_record_deposit_async_types() { //Assert - _spy.Commands[1].ShouldBe(CommandType.DepositAsync); - _spy.Commands[2].ShouldBe(CommandType.DepositAsync); + await Assert.That(_spy.Commands[1]).IsEqualTo(CommandType.DepositAsync); + await Assert.That(_spy.Commands[2]).IsEqualTo(CommandType.DepositAsync); } - [Fact] - public void Then_batch_async_deposit_should_return_ids_for_each_request() + [Test] + public async Task Then_batch_async_deposit_should_return_ids_for_each_request() { //Assert - _batchIds.Length.ShouldBe(2); - _batchIds[0].ShouldBe(_batchCommand1.Id); - _batchIds[1].ShouldBe(_batchCommand2.Id); + await Assert.That(_batchIds.Length).IsEqualTo(2); + await Assert.That(_batchIds[0]).IsEqualTo(_batchCommand1.Id); + await Assert.That(_batchIds[1]).IsEqualTo(_batchCommand2.Id); } - [Fact] - public void Then_total_call_count_should_be_three() + [Test] + public async Task Then_total_call_count_should_be_three() { //Assert - _spy.CallCount(CommandType.DepositAsync).ShouldBe(3); + await Assert.That(_spy.CallCount(CommandType.DepositAsync)).IsEqualTo(3); } private sealed class TestCommand() : Command(Id.Random()); diff --git a/tests/Paramore.Brighter.Testing.Tests/When_was_called_checks_for_invoked_method.cs b/tests/Paramore.Brighter.Testing.Tests/When_was_called_checks_for_invoked_method.cs index e4018df7dc..c215d1aa9d 100644 --- a/tests/Paramore.Brighter.Testing.Tests/When_was_called_checks_for_invoked_method.cs +++ b/tests/Paramore.Brighter.Testing.Tests/When_was_called_checks_for_invoked_method.cs @@ -23,8 +23,6 @@ THE SOFTWARE. */ using Paramore.Brighter; using Paramore.Brighter.Testing; -using Shouldly; -using Xunit; namespace Paramore.Brighter.Testing.Tests; @@ -32,31 +30,31 @@ public class SpyCommandProcessorInvokedMethodTests { private readonly SpyCommandProcessor _spy = new(); - [Fact] - public void Then_was_called_returns_false_before_any_calls() + [Test] + public async Task Then_was_called_returns_false_before_any_calls() { //Assert - _spy.WasCalled(CommandType.Send).ShouldBeFalse(); + await Assert.That(_spy.WasCalled(CommandType.Send)).IsFalse(); } - [Fact] - public void Then_was_called_returns_true_after_send_called() + [Test] + public async Task Then_was_called_returns_true_after_send_called() { //Act _spy.Send(new TestCommand()); //Assert - _spy.WasCalled(CommandType.Send).ShouldBeTrue(); + await Assert.That(_spy.WasCalled(CommandType.Send)).IsTrue(); } - [Fact] - public void Then_was_called_returns_false_for_different_method() + [Test] + public async Task Then_was_called_returns_false_for_different_method() { //Act _spy.Send(new TestCommand()); //Assert - _spy.WasCalled(CommandType.Publish).ShouldBeFalse(); + await Assert.That(_spy.WasCalled(CommandType.Publish)).IsFalse(); } private sealed class TestCommand() : Command(Id.Random()); diff --git a/tests/Paramore.Brighter.TickerQ.Tests/Paramore.Brighter.TickerQ.Tests.csproj b/tests/Paramore.Brighter.TickerQ.Tests/Paramore.Brighter.TickerQ.Tests.csproj index 040fc9e590..27cba7060c 100644 --- a/tests/Paramore.Brighter.TickerQ.Tests/Paramore.Brighter.TickerQ.Tests.csproj +++ b/tests/Paramore.Brighter.TickerQ.Tests/Paramore.Brighter.TickerQ.Tests.csproj @@ -1,32 +1,16 @@ - - + $(BrighterTestTargetFrameworks) enable - false true Paramore.Brighter.TickerQ.Tests + Exe - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - + - - - - - - - - + \ No newline at end of file diff --git a/tests/Paramore.Brighter.TickerQ.Tests/TestDoubles/Fixtures/BaseTickerQFixture.cs b/tests/Paramore.Brighter.TickerQ.Tests/TestDoubles/Fixtures/BaseTickerQFixture.cs index b928ee5150..2a886e3bea 100644 --- a/tests/Paramore.Brighter.TickerQ.Tests/TestDoubles/Fixtures/BaseTickerQFixture.cs +++ b/tests/Paramore.Brighter.TickerQ.Tests/TestDoubles/Fixtures/BaseTickerQFixture.cs @@ -98,8 +98,13 @@ protected BaseTickerQFixture() Processor = ServiceProvider.GetRequiredService(); SchedulerFactory = ServiceProvider.GetRequiredService(); TickerQModuleInitializer.EnsureOneTimeSetupTickerQ(); + } + + [Before(HookType.Test)] + public async Task StartScheduler() + { var scheduler = ServiceProvider.GetRequiredService(); - scheduler.StartAsync().GetAwaiter().GetResult(); + await scheduler.StartAsync(); } protected abstract IAmAHandlerFactory GetHandlerFactory(); protected abstract IAmASubscriberRegistry GetSubscriberServiceRegistry(); diff --git a/tests/Paramore.Brighter.TickerQ.Tests/When_scheduling_a_message.cs b/tests/Paramore.Brighter.TickerQ.Tests/When_scheduling_a_message.cs index 6c5d13db2a..5642194db0 100644 --- a/tests/Paramore.Brighter.TickerQ.Tests/When_scheduling_a_message.cs +++ b/tests/Paramore.Brighter.TickerQ.Tests/When_scheduling_a_message.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text.Json; using Paramore.Brighter.TickerQ.Tests.TestDoubles; using Paramore.Brighter.TickerQ.Tests.TestDoubles.Fixtures; @@ -6,78 +6,77 @@ namespace Paramore.Brighter.TickerQ.Tests; -[Collection("Scheduler")] -public class TickerQSchedulerMessageTests : IClassFixture, IDisposable + public class TickerQSchedulerMessageTests : IDisposable { private readonly TickerQMessageTestFixture _fixture; - public TickerQSchedulerMessageTests(TickerQMessageTestFixture fixture) + public TickerQSchedulerMessageTests() { - _fixture = fixture; + _fixture = new TickerQMessageTestFixture(); } - [Fact] - public void When_scheduler_a_message_with_a_datetimeoffset_sync() + [Test] + public async Task When_scheduler_a_message_with_a_datetimeoffset_sync() { Message message = GetMessage(); var scheduler = (IAmAMessageSchedulerSync)_fixture.SchedulerFactory.Create(_fixture.Processor); var id = scheduler.Schedule(message, _fixture.TimeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.Empty(_fixture.InternalBus.Stream(_fixture.RoutingKey)); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey)).IsEmpty(); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Equivalent(message, _fixture.Outbox.Get(message.Id, new RequestContext())); + await Assert.That(await _fixture.Outbox.GetAsync(message.Id, new RequestContext())).IsEquivalentTo(message); - Assert.NotEmpty(_fixture.InternalBus.Stream(_fixture.RoutingKey)); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey)).IsNotEmpty(); } - [Fact] - public void When_scheduler_a_message_with_a_timespan_sync() + [Test] + public async Task When_scheduler_a_message_with_a_timespan_sync() { Message message = GetMessage(); var scheduler = (IAmAMessageSchedulerSync)_fixture.SchedulerFactory.Create(_fixture.Processor); var id = scheduler.Schedule(message, TimeSpan.FromSeconds(1)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.Empty(_fixture.InternalBus.Stream(_fixture.RoutingKey)); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey)).IsEmpty(); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Equivalent(message, _fixture.Outbox.Get(message.Id, new RequestContext())); + await Assert.That(await _fixture.Outbox.GetAsync(message.Id, new RequestContext())).IsEquivalentTo(message); - Assert.NotEmpty(_fixture.InternalBus.Stream(_fixture.RoutingKey)); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey)).IsNotEmpty(); } - [Fact] - public void When_reschedule_a_message_with_a_datetimeoffset_sync() + [Test] + public async Task When_reschedule_a_message_with_a_datetimeoffset_sync() { var message = GetMessage(); var scheduler = (IAmAMessageSchedulerSync)_fixture.SchedulerFactory.Create(_fixture.Processor); var id = scheduler.Schedule(message, _fixture.TimeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(2))); - Assert.True((id)?.Any()); - Assert.Empty(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []); + await Assert.That((id)?.Any()).IsTrue(); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []).IsEmpty(); scheduler.ReScheduler(id, _fixture.TimeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(5))); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Empty(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []).IsEmpty(); Thread.Sleep(TimeSpan.FromSeconds(5)); - Assert.NotEmpty(_fixture.InternalBus.Stream(_fixture.RoutingKey)); - Assert.Equivalent(message, _fixture.Outbox.Get(message.Id, new RequestContext())); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey)).IsNotEmpty(); + await Assert.That(await _fixture.Outbox.GetAsync(message.Id, new RequestContext())).IsEquivalentTo(message); } - [Fact] + [Test] public async Task When_reschedule_a_message_with_a_timespan_sync() { var message = GetMessage(); @@ -85,80 +84,80 @@ public async Task When_reschedule_a_message_with_a_timespan_sync() var scheduler = (IAmAMessageSchedulerSync)_fixture.SchedulerFactory.Create(_fixture.Processor); var id = scheduler.Schedule(message, TimeSpan.FromSeconds(2)); - Assert.True((id)?.Any()); - Assert.Empty(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []); + await Assert.That((id)?.Any()).IsTrue(); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []).IsEmpty(); scheduler.ReScheduler(id, TimeSpan.FromSeconds(5)); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Empty(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []).IsEmpty(); await Task.Delay(TimeSpan.FromSeconds(5)); - Assert.NotEmpty(_fixture.InternalBus.Stream(_fixture.RoutingKey)); - Assert.Equivalent(message, _fixture.Outbox.Get(message.Id, new RequestContext())); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey)).IsNotEmpty(); + await Assert.That(await _fixture.Outbox.GetAsync(message.Id, new RequestContext())).IsEquivalentTo(message); } - [Fact] - public void When_cancel_scheduler_message_with_a_datetimeoffset() + [Test] + public async Task When_cancel_scheduler_message_with_a_datetimeoffset() { var message = GetMessage(); var scheduler = (IAmAMessageSchedulerSync)_fixture.SchedulerFactory.Create(_fixture.Processor); var id = scheduler.Schedule(message, TimeSpan.FromSeconds(2)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); scheduler.Cancel(id); Thread.Sleep(TimeSpan.FromSeconds(3)); var expected = Message.Empty; - var actual = _fixture.Outbox.Get(message.Id, new RequestContext()); - - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + var actual = await _fixture.Outbox.GetAsync(message.Id, new RequestContext()); + + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] - public void When_cancel_scheduler_request_with_a_timespan() + [Test] + public async Task When_cancel_scheduler_request_with_a_timespan() { var message = GetMessage(); var scheduler = (IAmAMessageSchedulerSync)_fixture.SchedulerFactory.Create(_fixture.Processor); var id = scheduler.Schedule(message, TimeSpan.FromSeconds(2)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); scheduler.Cancel(id); Thread.Sleep(TimeSpan.FromSeconds(3)); var expected = Message.Empty; - var actual = _fixture.Outbox.Get(message.Id, new RequestContext()); - - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + var actual = await _fixture.Outbox.GetAsync(message.Id, new RequestContext()); + + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } private Message GetMessage() diff --git a/tests/Paramore.Brighter.TickerQ.Tests/When_scheduling_a_message_async.cs b/tests/Paramore.Brighter.TickerQ.Tests/When_scheduling_a_message_async.cs index 5f730ea935..d6b974605d 100644 --- a/tests/Paramore.Brighter.TickerQ.Tests/When_scheduling_a_message_async.cs +++ b/tests/Paramore.Brighter.TickerQ.Tests/When_scheduling_a_message_async.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Text.Json; using Paramore.Brighter.TickerQ.Tests.TestDoubles; using Paramore.Brighter.TickerQ.Tests.TestDoubles.Fixtures; @@ -6,17 +6,16 @@ namespace Paramore.Brighter.TickerQ.Tests; -[Collection("Scheduler")] -public class TickerQSchedulerMessageAsyncTests : IClassFixture, IDisposable + public class TickerQSchedulerMessageAsyncTests : IDisposable { private readonly TickerQMessageTestFixture _fixture; - public TickerQSchedulerMessageAsyncTests(TickerQMessageTestFixture tickerQTestFixture) + public TickerQSchedulerMessageAsyncTests() { - _fixture = tickerQTestFixture; + _fixture = new TickerQMessageTestFixture(); } - [Fact] + [Test] public async Task When_scheduler_a_message_with_a_datetimeoffset_async() { Message message = GetMessage(); @@ -25,18 +24,18 @@ public async Task When_scheduler_a_message_with_a_datetimeoffset_async() var id = await scheduler.ScheduleAsync(message, _fixture.TimeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.Empty(_fixture.InternalBus.Stream(_fixture.RoutingKey)); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey)).IsEmpty(); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Equivalent(message, await _fixture.Outbox.GetAsync(message.Id, new RequestContext())); + await Assert.That(await _fixture.Outbox.GetAsync(message.Id, new RequestContext())).IsEquivalentTo(message); - Assert.NotEmpty(_fixture.InternalBus.Stream(_fixture.RoutingKey)); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey)).IsNotEmpty(); } - [Fact] + [Test] public async Task When_scheduler_a_message_with_a_timespan_async() { Message message = GetMessage(); @@ -44,18 +43,18 @@ public async Task When_scheduler_a_message_with_a_timespan_async() var scheduler = (IAmAMessageSchedulerAsync)_fixture.SchedulerFactory.Create(_fixture.Processor); var id = await scheduler.ScheduleAsync(message, TimeSpan.FromSeconds(4)); - Assert.NotEqual(0, id.Length); + await Assert.That(id.Length).IsNotEqualTo(0); - Assert.Empty(_fixture.InternalBus.Stream(_fixture.RoutingKey)); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey)).IsEmpty(); await Task.Delay(TimeSpan.FromSeconds(6)); - Assert.Equivalent(message, await _fixture.Outbox.GetAsync(message.Id, new RequestContext())); + await Assert.That(await _fixture.Outbox.GetAsync(message.Id, new RequestContext())).IsEquivalentTo(message); - Assert.NotEmpty(_fixture.InternalBus.Stream(_fixture.RoutingKey)); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey)).IsNotEmpty(); } - [Fact] + [Test] public async Task When_reschedule_a_message_with_a_datetimeoffset_async() { var message = GetMessage(); @@ -63,20 +62,20 @@ public async Task When_reschedule_a_message_with_a_datetimeoffset_async() var scheduler = (IAmAMessageSchedulerAsync)_fixture.SchedulerFactory.Create(_fixture.Processor); var id = await scheduler.ScheduleAsync(message, _fixture.TimeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(2))); - Assert.True((id)?.Any()); - Assert.Empty(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []); + await Assert.That((id)?.Any()).IsTrue(); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []).IsEmpty(); await scheduler.ReSchedulerAsync(id, _fixture.TimeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(5))); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Empty(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []).IsEmpty(); await Task.Delay(TimeSpan.FromSeconds(5)); - Assert.NotEmpty(_fixture.InternalBus.Stream(_fixture.RoutingKey)); - Assert.Equivalent(message, await _fixture.Outbox.GetAsync(message.Id, new RequestContext())); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey)).IsNotEmpty(); + await Assert.That(await _fixture.Outbox.GetAsync(message.Id, new RequestContext())).IsEquivalentTo(message); } - [Fact] + [Test] public async Task When_reschedule_a_message_with_a_timespan_async() { var message = GetMessage(); @@ -84,20 +83,20 @@ public async Task When_reschedule_a_message_with_a_timespan_async() var scheduler = (IAmAMessageSchedulerAsync)_fixture.SchedulerFactory.Create(_fixture.Processor); var id = await scheduler.ScheduleAsync(message, _fixture.TimeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(2))); - Assert.True((id)?.Any()); - Assert.Empty(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []); + await Assert.That((id)?.Any()).IsTrue(); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []).IsEmpty(); var reScheduled = await scheduler.ReSchedulerAsync(id, TimeSpan.FromSeconds(5)); - Assert.True(reScheduled); + await Assert.That(reScheduled).IsTrue(); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Empty(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []).IsEmpty(); await Task.Delay(TimeSpan.FromSeconds(6)); - Assert.NotEmpty(_fixture.InternalBus.Stream(_fixture.RoutingKey)); - Assert.Equivalent(message, await _fixture.Outbox.GetAsync(message.Id, new RequestContext())); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey)).IsNotEmpty(); + await Assert.That(await _fixture.Outbox.GetAsync(message.Id, new RequestContext())).IsEquivalentTo(message); } - [Fact] + [Test] public async Task When_cancel_scheduler_message_with_a_datetimeoffset_async() { var message = GetMessage(); @@ -105,7 +104,7 @@ public async Task When_cancel_scheduler_message_with_a_datetimeoffset_async() var scheduler = (IAmAMessageSchedulerAsync)_fixture.SchedulerFactory.Create(_fixture.Processor); var id = await scheduler.ScheduleAsync(message, TimeSpan.FromHours(1)); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); await scheduler.CancelAsync(id); @@ -114,22 +113,22 @@ public async Task When_cancel_scheduler_message_with_a_datetimeoffset_async() var expected = Message.Empty; var actual = await _fixture.Outbox.GetAsync(message.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_cancel_scheduler_request_with_a_timespan_async() { var message = GetMessage(); @@ -137,7 +136,7 @@ public async Task When_cancel_scheduler_request_with_a_timespan_async() var scheduler = (IAmAMessageSchedulerAsync)_fixture.SchedulerFactory.Create(_fixture.Processor); var id = await scheduler.ScheduleAsync(message, TimeSpan.FromHours(1)); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); await scheduler.CancelAsync(id); @@ -146,18 +145,18 @@ public async Task When_cancel_scheduler_request_with_a_timespan_async() var expected = Message.Empty; var actual = await _fixture.Outbox.GetAsync(message.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } private Message GetMessage() diff --git a/tests/Paramore.Brighter.TickerQ.Tests/When_scheduling_a_request.cs b/tests/Paramore.Brighter.TickerQ.Tests/When_scheduling_a_request.cs index 55d5e08a25..3d61294bd4 100644 --- a/tests/Paramore.Brighter.TickerQ.Tests/When_scheduling_a_request.cs +++ b/tests/Paramore.Brighter.TickerQ.Tests/When_scheduling_a_request.cs @@ -1,341 +1,340 @@ -using Paramore.Brighter.TickerQ.Tests.TestDoubles; +using Paramore.Brighter.TickerQ.Tests.TestDoubles; using Paramore.Brighter.TickerQ.Tests.TestDoubles.Fixtures; namespace Paramore.Brighter.TickerQ.Tests { - [Collection("Scheduler")] - public class TickerQSchedulerRequestTests : IClassFixture, IDisposable + public class TickerQSchedulerRequestTests : IDisposable { private readonly TickerQRequestTestFixture _fixture; - public TickerQSchedulerRequestTests(TickerQRequestTestFixture tickerQTestFixture) + public TickerQSchedulerRequestTests() { - _fixture = tickerQTestFixture; + _fixture = new TickerQRequestTestFixture(); } #region Scheduler - [Fact] - public void When_scheduler_send_request_with_a_datetimeoffset() + [Test] + public async Task When_scheduler_send_request_with_a_datetimeoffset() { var req = new MyEvent(); var scheduler = _fixture.SchedulerFactory.CreateSync(_fixture.Processor); var id = scheduler.Schedule(req, RequestSchedulerType.Send, _fixture.TimeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandler), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandler), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _fixture.Outbox.Get(req.Id, new RequestContext()); - - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + var actual = await _fixture.Outbox.GetAsync(req.Id, new RequestContext()); + + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] - public void When_scheduler_send_request_with_a_timespan() + [Test] + public async Task When_scheduler_send_request_with_a_timespan() { var req = new MyEvent(); var scheduler = _fixture.SchedulerFactory.CreateSync(_fixture.Processor); var id = scheduler.Schedule(req, RequestSchedulerType.Send, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandler), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandler), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _fixture.Outbox.Get(req.Id, new RequestContext()); - - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + var actual = await _fixture.Outbox.GetAsync(req.Id, new RequestContext()); + + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] - public void When_scheduler_publish_request_with_a_datetimeoffset() + [Test] + public async Task When_scheduler_publish_request_with_a_datetimeoffset() { var req = new MyEvent(); var scheduler = _fixture.SchedulerFactory.CreateSync(_fixture.Processor); var id = scheduler.Schedule(req, RequestSchedulerType.Publish, _fixture.TimeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandler), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandler), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _fixture.Outbox.Get(req.Id, new RequestContext()); - - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + var actual = await _fixture.Outbox.GetAsync(req.Id, new RequestContext()); + + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] - public void When_scheduler_publish_request_with_a_timespan() + [Test] + public async Task When_scheduler_publish_request_with_a_timespan() { var req = new MyEvent(); var scheduler = _fixture.SchedulerFactory.CreateSync(_fixture.Processor); var id = scheduler.Schedule(req, RequestSchedulerType.Publish, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandler), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandler), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _fixture.Outbox.Get(req.Id, new RequestContext()); - - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + var actual = await _fixture.Outbox.GetAsync(req.Id, new RequestContext()); + + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] - public void When_scheduler_post_request_with_a_datetimeoffset() + [Test] + public async Task When_scheduler_post_request_with_a_datetimeoffset() { var req = new MyEvent(); var scheduler = _fixture.SchedulerFactory.CreateSync(_fixture.Processor); var id = scheduler.Schedule(req, RequestSchedulerType.Post, _fixture.TimeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.Empty(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []).IsEmpty(); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.NotEqual(Message.Empty, _fixture.Outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _fixture.Outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); - Assert.NotEmpty(_fixture.InternalBus.Stream(_fixture.RoutingKey)); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey)).IsNotEmpty(); } - [Fact] - public void When_scheduler_post_request_with_a_timespan() + [Test] + public async Task When_scheduler_post_request_with_a_timespan() { var req = new MyEvent(); var scheduler = _fixture.SchedulerFactory.CreateSync(_fixture.Processor); var id = scheduler.Schedule(req, RequestSchedulerType.Post, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.Empty(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []).IsEmpty(); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(_fixture.InternalBus.Stream(_fixture.RoutingKey)); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey)).IsNotEmpty(); - Assert.NotEqual(Message.Empty, _fixture.Outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _fixture.Outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); } #endregion #region Rescheduler - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Publish)] - public void When_reschedule_request_with_a_datetimeoffset(RequestSchedulerType type) + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Publish)] + public async Task When_reschedule_request_with_a_datetimeoffset(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _fixture.SchedulerFactory.CreateSync(_fixture.Processor); var id = scheduler.Schedule(req, type, _fixture.TimeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(2))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); scheduler.ReScheduler(id, _fixture.TimeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(5))); - Assert.DoesNotContain(nameof(MyEventHandler), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandler), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(5)); - Assert.Contains(nameof(MyEventHandler), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _fixture.Outbox.Get(req.Id, new RequestContext()); - - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + var actual = await _fixture.Outbox.GetAsync(req.Id, new RequestContext()); + + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Publish)] - public void When_reschedule_send_request_with_a_timespan(RequestSchedulerType type) + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Publish)] + public async Task When_reschedule_send_request_with_a_timespan(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _fixture.SchedulerFactory.CreateSync(_fixture.Processor); var id = scheduler.Schedule(req, type, TimeSpan.FromSeconds(2)); - Assert.True((id)?.Any()); - Assert.DoesNotContain(nameof(MyEventHandler), _fixture.ReceivedMessages); + await Assert.That((id)?.Any()).IsTrue(); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandler)); scheduler.ReScheduler(id, TimeSpan.FromSeconds(5)); Thread.Sleep(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandler), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandler)); Thread.Sleep(TimeSpan.FromSeconds(5)); - Assert.Contains(nameof(MyEventHandler), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).ContainsKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _fixture.Outbox.Get(req.Id, new RequestContext()); - - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + var actual = await _fixture.Outbox.GetAsync(req.Id, new RequestContext()); + + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } #endregion #region Cancel - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] - public void When_cancel_scheduler_request_with_a_datetimeoffset(RequestSchedulerType type) + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] + public async Task When_cancel_scheduler_request_with_a_datetimeoffset(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _fixture.SchedulerFactory.CreateSync(_fixture.Processor); var id = scheduler.Schedule(req, type, _fixture.TimeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(2))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandler), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandler)); scheduler.Cancel(id); Thread.Sleep(TimeSpan.FromSeconds(3)); - Assert.DoesNotContain(nameof(MyEventHandler), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _fixture.Outbox.Get(req.Id, new RequestContext()); - - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + var actual = await _fixture.Outbox.GetAsync(req.Id, new RequestContext()); + + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] - public void When_cancel_scheduler_request_with_a_timespan(RequestSchedulerType type) + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] + public async Task When_cancel_scheduler_request_with_a_timespan(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _fixture.SchedulerFactory.CreateSync(_fixture.Processor); var id = scheduler.Schedule(req, type, TimeSpan.FromSeconds(2)); - Assert.True((id)?.Any()); - Assert.DoesNotContain(nameof(MyEventHandler), _fixture.ReceivedMessages); + await Assert.That((id)?.Any()).IsTrue(); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandler)); scheduler.Cancel(id); Thread.Sleep(TimeSpan.FromSeconds(3)); - Assert.DoesNotContain(nameof(MyEventHandler), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandler)); var expected = Message.Empty; - var actual = _fixture.Outbox.Get(req.Id, new RequestContext()); - - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + var actual = await _fixture.Outbox.GetAsync(req.Id, new RequestContext()); + + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } #endregion diff --git a/tests/Paramore.Brighter.TickerQ.Tests/When_scheduling_a_request_async.cs b/tests/Paramore.Brighter.TickerQ.Tests/When_scheduling_a_request_async.cs index c78436266b..9d98f8ab63 100644 --- a/tests/Paramore.Brighter.TickerQ.Tests/When_scheduling_a_request_async.cs +++ b/tests/Paramore.Brighter.TickerQ.Tests/When_scheduling_a_request_async.cs @@ -1,23 +1,22 @@ -using System; +using System; using Paramore.Brighter.TickerQ.Tests.TestDoubles; using Paramore.Brighter.TickerQ.Tests.TestDoubles.Fixtures; namespace Paramore.Brighter.TickerQ.Tests { - [Collection("Scheduler")] - public class TickerQSchedulerRequestAsyncTests : IClassFixture, IDisposable + public class TickerQSchedulerRequestAsyncTests : IDisposable { private readonly TickerQRequestAsyncTestFixture _fixture; - public TickerQSchedulerRequestAsyncTests(TickerQRequestAsyncTestFixture tickerQTestFixture) + public TickerQSchedulerRequestAsyncTests() { - _fixture = tickerQTestFixture; + _fixture = new TickerQRequestAsyncTestFixture(); } #region Scheduler - [Fact] + [Test] public async Task When_scheduler_send_request_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -25,64 +24,64 @@ public async Task When_scheduler_send_request_with_a_datetimeoffset_async() var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Send, _fixture.TimeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandlerAsync), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; - var actual = _fixture.Outbox.Get(req.Id, new RequestContext()); - - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + var actual = await _fixture.Outbox.GetAsync(req.Id, new RequestContext()); + + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_scheduler_send_request_with_a_timespan_asc() { var req = new MyEvent(); var scheduler = _fixture.SchedulerFactory.CreateAsync(_fixture.Processor); var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Send, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandlerAsync), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; - var actual = _fixture.Outbox.Get(req.Id, new RequestContext()); - - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + var actual = await _fixture.Outbox.GetAsync(req.Id, new RequestContext()); + + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_scheduler_publish_request_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -90,64 +89,64 @@ public async Task When_scheduler_publish_request_with_a_datetimeoffset_async() var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Publish, _fixture.TimeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandlerAsync), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; - var actual = _fixture.Outbox.Get(req.Id, new RequestContext()); - - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + var actual = await _fixture.Outbox.GetAsync(req.Id, new RequestContext()); + + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_scheduler_publish_request_with_a_timespan() { var req = new MyEvent(); var scheduler = _fixture.SchedulerFactory.CreateAsync(_fixture.Processor); var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Publish, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.Contains(nameof(MyEventHandlerAsync), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; - var actual = _fixture.Outbox.Get(req.Id, new RequestContext()); - - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + var actual = await _fixture.Outbox.GetAsync(req.Id, new RequestContext()); + + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Fact] + [Test] public async Task When_scheduler_post_request_with_a_datetimeoffset_async() { var req = new MyEvent(); @@ -155,122 +154,122 @@ public async Task When_scheduler_post_request_with_a_datetimeoffset_async() var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Post, _fixture.TimeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(1))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.Empty(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []).IsEmpty(); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.NotEqual(Message.Empty, _fixture.Outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _fixture.Outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); - Assert.NotEmpty(_fixture.InternalBus.Stream(_fixture.RoutingKey)); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey)).IsNotEmpty(); } - [Fact] + [Test] public async Task When_scheduler_post_request_with_a_timespan_async() { var req = new MyEvent(); var scheduler = _fixture.SchedulerFactory.CreateAsync(_fixture.Processor); var id = await scheduler.ScheduleAsync(req, RequestSchedulerType.Post, TimeSpan.FromSeconds(1)); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.Empty(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey) ?? []).IsEmpty(); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.NotEmpty(_fixture.InternalBus.Stream(_fixture.RoutingKey)); + await Assert.That(_fixture.InternalBus.Stream(_fixture.RoutingKey)).IsNotEmpty(); - Assert.NotEqual(Message.Empty, _fixture.Outbox.Get(req.Id, new RequestContext())); + await Assert.That(await _fixture.Outbox.GetAsync(req.Id, new RequestContext())).IsNotEqualTo(Message.Empty); } #endregion #region Rescheduler - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_reschedule_request_with_a_datetimeoffset_async(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _fixture.SchedulerFactory.CreateAsync(_fixture.Processor); var id = await scheduler.ScheduleAsync(req, type, _fixture.TimeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(2))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); await scheduler.ReSchedulerAsync(id, _fixture.TimeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(5))); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(5)); - Assert.Contains(nameof(MyEventHandlerAsync), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; - var actual = _fixture.Outbox.Get(req.Id, new RequestContext()); - - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + var actual = await _fixture.Outbox.GetAsync(req.Id, new RequestContext()); + + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_reschedule_send_request_with_a_timespan_async(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _fixture.SchedulerFactory.CreateAsync(_fixture.Processor); var id = await scheduler.ScheduleAsync(req, type, TimeSpan.FromSeconds(2)); - Assert.True((id)?.Any()); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _fixture.ReceivedMessages); + await Assert.That((id)?.Any()).IsTrue(); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await scheduler.ReSchedulerAsync(id, TimeSpan.FromSeconds(5)); await Task.Delay(TimeSpan.FromSeconds(2)); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await Task.Delay(TimeSpan.FromSeconds(5)); - Assert.Contains(nameof(MyEventHandlerAsync), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).ContainsKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; - var actual = _fixture.Outbox.Get(req.Id, new RequestContext()); - - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + var actual = await _fixture.Outbox.GetAsync(req.Id, new RequestContext()); + + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } #endregion #region Cancel - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_cancel_scheduler_request_with_a_datetimeoffset(RequestSchedulerType type) { var req = new MyEvent(); @@ -278,65 +277,65 @@ public async Task When_cancel_scheduler_request_with_a_datetimeoffset(RequestSch var id = await scheduler.ScheduleAsync(req, type, _fixture.TimeProvider.GetUtcNow().Add(TimeSpan.FromSeconds(2))); - Assert.True((id)?.Any()); + await Assert.That((id)?.Any()).IsTrue(); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await scheduler.CancelAsync(id); await Task.Delay(TimeSpan.FromSeconds(3)); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; var actual = await _fixture.Outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } - [Theory] - [InlineData(RequestSchedulerType.Send)] - [InlineData(RequestSchedulerType.Post)] - [InlineData(RequestSchedulerType.Publish)] + [Test] + [Arguments(RequestSchedulerType.Send)] + [Arguments(RequestSchedulerType.Post)] + [Arguments(RequestSchedulerType.Publish)] public async Task When_cancel_scheduler_request_with_a_timespan_async(RequestSchedulerType type) { var req = new MyEvent(); var scheduler = _fixture.SchedulerFactory.CreateAsync(_fixture.Processor); var id = await scheduler.ScheduleAsync(req, type, TimeSpan.FromSeconds(2)); - Assert.True((id)?.Any()); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _fixture.ReceivedMessages); + await Assert.That((id)?.Any()).IsTrue(); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); await scheduler.CancelAsync(id); await Task.Delay(TimeSpan.FromSeconds(3)); - Assert.DoesNotContain(nameof(MyEventHandlerAsync), _fixture.ReceivedMessages); + await Assert.That(_fixture.ReceivedMessages).DoesNotContainKey(nameof(MyEventHandlerAsync)); var expected = Message.Empty; var actual = await _fixture.Outbox.GetAsync(req.Id, new RequestContext()); - Assert.Equivalent(expected.Body, actual.Body); - Assert.Equal(expected.Id, actual.Id); - Assert.Equal(expected.Persist, actual.Persist); - Assert.Equal(expected.Redelivered, actual.Redelivered); - Assert.Equal(expected.DeliveryTag, actual.DeliveryTag); - Assert.Equal(expected.Header.MessageType, actual.Header.MessageType); - Assert.Equal(expected.Header.Topic, actual.Header.Topic); - Assert.Equal(expected.Header.TimeStamp, actual.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(expected.Header.CorrelationId, actual.Header.CorrelationId); - Assert.Equal(expected.Header.ReplyTo, actual.Header.ReplyTo); - Assert.Equal(expected.Header.ContentType, actual.Header.ContentType); - Assert.Equal(expected.Header.HandledCount, actual.Header.HandledCount); + await Assert.That(actual.Body).IsEquivalentTo(expected.Body); + await Assert.That(actual.Id).IsEqualTo(expected.Id); + await Assert.That(actual.Persist).IsEqualTo(expected.Persist); + await Assert.That(actual.Redelivered).IsEqualTo(expected.Redelivered); + await Assert.That(actual.DeliveryTag).IsEqualTo(expected.DeliveryTag); + await Assert.That(actual.Header.MessageType).IsEqualTo(expected.Header.MessageType); + await Assert.That(actual.Header.Topic).IsEqualTo(expected.Header.Topic); + await Assert.That(actual.Header.TimeStamp).IsEqualTo(expected.Header.TimeStamp).Within(TimeSpan.FromSeconds(1)); + await Assert.That(actual.Header.CorrelationId).IsEqualTo(expected.Header.CorrelationId); + await Assert.That(actual.Header.ReplyTo).IsEqualTo(expected.Header.ReplyTo); + await Assert.That(actual.Header.ContentType).IsEqualTo(expected.Header.ContentType); + await Assert.That(actual.Header.HandledCount).IsEqualTo(expected.Header.HandledCount); } #endregion diff --git a/tests/Paramore.Brighter.Transforms.Adaptors.Tests/JustSaying/JustSayingMessageMapperTest.cs b/tests/Paramore.Brighter.Transforms.Adaptors.Tests/JustSaying/JustSayingMessageMapperTest.cs index b18ed034c7..0e066b3a65 100644 --- a/tests/Paramore.Brighter.Transforms.Adaptors.Tests/JustSaying/JustSayingMessageMapperTest.cs +++ b/tests/Paramore.Brighter.Transforms.Adaptors.Tests/JustSaying/JustSayingMessageMapperTest.cs @@ -1,17 +1,16 @@ -using System; +using System; using System.Net; using System.Text.Json; using System.Text.Json.Nodes; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Transformers.JustSaying; -using Xunit; namespace Paramore.Brighter.Transforms.Adaptors.Tests.JustSaying; public class JustSayingMessageMapperTest { - [Fact] - public void MapToMessage_when_mapping_a_justsaying_command_property_should_not_be_override() + [Test] + public async Task MapToMessage_when_mapping_a_justsaying_command_property_should_not_be_override() { var mapper = new JustSayingMessageMapper(); var command = new SomeJustSayingCommand @@ -25,22 +24,22 @@ public void MapToMessage_when_mapping_a_justsaying_command_property_should_not_b Name = $"Name{Guid.NewGuid().ToString()}", }; - var message = mapper.MapToMessage(command, new Publication()); + var message = await mapper.MapToMessageAsync(command, new Publication()); var obj = JsonSerializer.Deserialize(message.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(obj); - Assert.Equal(command.Id, obj.Id); - Assert.Equal(command.Conversation, obj.Conversation); - Assert.Equal(command.RaisingComponent, obj.RaisingComponent); - Assert.Equal(command.Tenant, obj.Tenant); - Assert.Equal(command.Version, obj.Version); - Assert.Equal(command.TimeStamp, obj.TimeStamp); - Assert.Equal(command.Name, obj.Name); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); + await Assert.That(obj).IsNotNull(); + await Assert.That(obj.Id).IsEqualTo(command.Id); + await Assert.That(obj.Conversation).IsEqualTo(command.Conversation); + await Assert.That(obj.RaisingComponent).IsEqualTo(command.RaisingComponent); + await Assert.That(obj.Tenant).IsEqualTo(command.Tenant); + await Assert.That(obj.Version).IsEqualTo(command.Version); + await Assert.That(obj.TimeStamp).IsEqualTo(command.TimeStamp); + await Assert.That(obj.Name).IsEqualTo(command.Name); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); } - [Fact] - public void MapToMessage_when_mapping_a_justsaying_event_property_should_not_be_override() + [Test] + public async Task MapToMessage_when_mapping_a_justsaying_event_property_should_not_be_override() { var mapper = new JustSayingMessageMapper(); var @event = new SomeJustSayingEvent @@ -55,23 +54,23 @@ public void MapToMessage_when_mapping_a_justsaying_event_property_should_not_be_ SourceIp = IPAddress.Loopback }; - var message = mapper.MapToMessage(@event, new Publication()); + var message = await mapper.MapToMessageAsync(@event, new Publication()); var obj = JsonSerializer.Deserialize(message.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(obj); - Assert.Equal(@event.Id, obj.Id); - Assert.Equal(@event.Conversation, obj.Conversation); - Assert.Equal(@event.RaisingComponent, obj.RaisingComponent); - Assert.Equal(@event.Tenant, obj.Tenant); - Assert.Equal(@event.Version, obj.Version); - Assert.Equal(@event.TimeStamp, obj.TimeStamp); - Assert.Equal(@event.Name, obj.Name); - Assert.Equal(IPAddress.Loopback, obj.SourceIp); - Assert.Equal(MessageType.MT_EVENT, message.Header.MessageType); + await Assert.That(obj).IsNotNull(); + await Assert.That(obj.Id).IsEqualTo(@event.Id); + await Assert.That(obj.Conversation).IsEqualTo(@event.Conversation); + await Assert.That(obj.RaisingComponent).IsEqualTo(@event.RaisingComponent); + await Assert.That(obj.Tenant).IsEqualTo(@event.Tenant); + await Assert.That(obj.Version).IsEqualTo(@event.Version); + await Assert.That(obj.TimeStamp).IsEqualTo(@event.TimeStamp); + await Assert.That(obj.Name).IsEqualTo(@event.Name); + await Assert.That(obj.SourceIp).IsEqualTo(IPAddress.Loopback); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_EVENT); } - [Fact] - public void MapToMessage_when_mapping_a_command_property_should_not_be_override() + [Test] + public async Task MapToMessage_when_mapping_a_command_property_should_not_be_override() { var mapper = new JustSayingMessageMapper(); var command = new WithJustSayingProperty @@ -85,22 +84,22 @@ public void MapToMessage_when_mapping_a_command_property_should_not_be_override( Name = $"Name{Guid.NewGuid().ToString()}", }; - var message = mapper.MapToMessage(command, new Publication()); + var message = await mapper.MapToMessageAsync(command, new Publication()); var obj = JsonSerializer.Deserialize(message.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(obj); - Assert.Equal(command.Id, obj.Id); - Assert.Equal(command.Conversation, obj.Conversation); - Assert.Equal(command.RaisingComponent, obj.RaisingComponent); - Assert.Equal(command.Tenant, obj.Tenant); - Assert.Equal(command.Version, obj.Version); - Assert.Equal(command.TimeStamp, obj.TimeStamp); - Assert.Equal(command.Name, obj.Name); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); + await Assert.That(obj).IsNotNull(); + await Assert.That(obj.Id).IsEqualTo(command.Id); + await Assert.That(obj.Conversation).IsEqualTo(command.Conversation); + await Assert.That(obj.RaisingComponent).IsEqualTo(command.RaisingComponent); + await Assert.That(obj.Tenant).IsEqualTo(command.Tenant); + await Assert.That(obj.Version).IsEqualTo(command.Version); + await Assert.That(obj.TimeStamp).IsEqualTo(command.TimeStamp); + await Assert.That(obj.Name).IsEqualTo(command.Name); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); } - [Fact] - public void MapToMessage_when_mapping_a_justsaying_command_property_should_set_from_request_context() + [Test] + public async Task MapToMessage_when_mapping_a_justsaying_command_property_should_set_from_request_context() { var mapper = new JustSayingMessageMapper(); var command = new SomeJustSayingCommand @@ -125,25 +124,25 @@ public void MapToMessage_when_mapping_a_justsaying_command_property_should_set_f } }; - var message = mapper.MapToMessage(command, new Publication()); - Assert.Equal(subject, message.Header.Subject); + var message = await mapper.MapToMessageAsync(command, new Publication()); + await Assert.That(message.Header.Subject).IsEqualTo(subject); var obj = JsonSerializer.Deserialize(message.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(obj); - Assert.False(Id.IsNullOrEmpty(obj.Id)); - Assert.NotNull(obj.Conversation); - Assert.False(Id.IsNullOrEmpty(obj.Conversation)); - Assert.NotEqual(DateTimeOffset.MinValue, obj.TimeStamp); + await Assert.That(obj).IsNotNull(); + await Assert.That(Id.IsNullOrEmpty(obj.Id)).IsFalse(); + await Assert.That(obj.Conversation).IsNotNull(); + await Assert.That(Id.IsNullOrEmpty(obj.Conversation)).IsFalse(); + await Assert.That(obj.TimeStamp).IsNotEqualTo(DateTimeOffset.MinValue); - Assert.Equal(raisingComponent, obj.RaisingComponent); - Assert.Equal(tenant, obj.Tenant); - Assert.Equal(version, obj.Version); - Assert.Equal(command.Name, obj.Name); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); + await Assert.That(obj.RaisingComponent).IsEqualTo(raisingComponent); + await Assert.That(obj.Tenant).IsEqualTo(tenant); + await Assert.That(obj.Version).IsEqualTo(version); + await Assert.That(obj.Name).IsEqualTo(command.Name); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); } - [Fact] - public void MapToMessage_when_mapping_a_request_command_property_should_set_from_request_context() + [Test] + public async Task MapToMessage_when_mapping_a_request_command_property_should_set_from_request_context() { var mapper = new JustSayingMessageMapper(); var command = new WithJustSayingProperty @@ -168,25 +167,25 @@ public void MapToMessage_when_mapping_a_request_command_property_should_set_from } }; - var message = mapper.MapToMessage(command, new Publication()); - Assert.Equal(subject, message.Header.Subject); + var message = await mapper.MapToMessageAsync(command, new Publication()); + await Assert.That(message.Header.Subject).IsEqualTo(subject); var obj = JsonSerializer.Deserialize(message.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(obj); - Assert.False(Id.IsNullOrEmpty(obj.Id)); - Assert.NotNull(obj.Conversation); - Assert.NotEmpty(obj.Conversation); - Assert.NotEqual(DateTimeOffset.MinValue, obj.TimeStamp); + await Assert.That(obj).IsNotNull(); + await Assert.That(Id.IsNullOrEmpty(obj.Id)).IsFalse(); + await Assert.That(obj.Conversation).IsNotNull(); + await Assert.That(obj.Conversation).IsNotEmpty(); + await Assert.That(obj.TimeStamp).IsNotEqualTo(DateTimeOffset.MinValue); - Assert.Equal(raisingComponent, obj.RaisingComponent); - Assert.Equal(tenant, obj.Tenant); - Assert.Equal(version, obj.Version); - Assert.Equal(command.Name, obj.Name); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); + await Assert.That(obj.RaisingComponent).IsEqualTo(raisingComponent); + await Assert.That(obj.Tenant).IsEqualTo(tenant); + await Assert.That(obj.Version).IsEqualTo(version); + await Assert.That(obj.Name).IsEqualTo(command.Name); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); } - [Fact] - public void MapToMessage_when_mapping_a_command_with_partial_justsaying_property_should_set_from_request_context() + [Test] + public async Task MapToMessage_when_mapping_a_command_with_partial_justsaying_property_should_set_from_request_context() { var mapper = new JustSayingMessageMapper(); var command = new WithPartialJustSayingProperty @@ -211,34 +210,34 @@ public void MapToMessage_when_mapping_a_command_with_partial_justsaying_property } }; - var message = mapper.MapToMessage(command, new Publication()); - Assert.Equal(subject, message.Header.Subject); + var message = await mapper.MapToMessageAsync(command, new Publication()); + await Assert.That(message.Header.Subject).IsEqualTo(subject); var obj = JsonSerializer.Deserialize(message.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(obj); - Assert.False(Id.IsNullOrEmpty(obj.Id)); - Assert.NotEqual(DateTimeOffset.MinValue, obj.TimeStamp); - Assert.Equal(tenant, obj.Tenant); - Assert.Equal(command.Name, obj.Name); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); + await Assert.That(obj).IsNotNull(); + await Assert.That(Id.IsNullOrEmpty(obj.Id)).IsFalse(); + await Assert.That(obj.TimeStamp).IsNotEqualTo(DateTimeOffset.MinValue); + await Assert.That(obj.Tenant).IsEqualTo(tenant); + await Assert.That(obj.Name).IsEqualTo(command.Name); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); var doc = JsonNode.Parse(message.Body.Bytes, new JsonNodeOptions{ PropertyNameCaseInsensitive = true}); - Assert.NotNull(doc); + await Assert.That(doc).IsNotNull(); var nodeConversation = doc[nameof(IJustSayingRequest.Conversation)]?.GetValue(); - Assert.NotNull(nodeConversation); - Assert.NotEmpty(nodeConversation); + await Assert.That(nodeConversation).IsNotNull(); + await Assert.That(nodeConversation).IsNotEmpty(); var nodeRaisingComponent = doc[nameof(IJustSayingRequest.RaisingComponent)]?.GetValue(); - Assert.Equal(raisingComponent, nodeRaisingComponent); + await Assert.That(nodeRaisingComponent).IsEqualTo(raisingComponent); var nodeVersion = doc[nameof(IJustSayingRequest.Version)]?.GetValue(); - Assert.Equal(version, nodeVersion); + await Assert.That(nodeVersion).IsEqualTo(version); } - [Fact] - public void MapToMessage_when_mapping_a_command_with_non_justsaying_property_should_set_from_request_context() + [Test] + public async Task MapToMessage_when_mapping_a_command_with_non_justsaying_property_should_set_from_request_context() { var mapper = new JustSayingMessageMapper(); var command = new NonJustSayingProperty @@ -263,38 +262,38 @@ public void MapToMessage_when_mapping_a_command_with_non_justsaying_property_sho } }; - var message = mapper.MapToMessage(command, new Publication()); - Assert.Equal(subject, message.Header.Subject); + var message = await mapper.MapToMessageAsync(command, new Publication()); + await Assert.That(message.Header.Subject).IsEqualTo(subject); var obj = JsonSerializer.Deserialize(message.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(obj); - Assert.False(Id.IsNullOrEmpty(obj.Id)); - Assert.Equal(command.Name, obj.Name); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); + await Assert.That(obj).IsNotNull(); + await Assert.That(Id.IsNullOrEmpty(obj.Id)).IsFalse(); + await Assert.That(obj.Name).IsEqualTo(command.Name); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); var doc = JsonNode.Parse(message.Body.Bytes, new JsonNodeOptions{ PropertyNameCaseInsensitive = true}); - Assert.NotNull(doc); + await Assert.That(doc).IsNotNull(); var nodeTimeStamp = doc[nameof(IJustSayingRequest.TimeStamp)]?.GetValue(); - Assert.NotNull(nodeTimeStamp); - Assert.NotEmpty(nodeTimeStamp); + await Assert.That(nodeTimeStamp).IsNotNull(); + await Assert.That(nodeTimeStamp).IsNotEmpty(); var nodeConversation = doc[nameof(IJustSayingRequest.Conversation)]?.GetValue(); - Assert.NotNull(nodeConversation); - Assert.NotEmpty(nodeConversation); + await Assert.That(nodeConversation).IsNotNull(); + await Assert.That(nodeConversation).IsNotEmpty(); var nodeTenant = doc[nameof(IJustSayingRequest.Tenant)]?.GetValue(); - Assert.Equal(tenant, nodeTenant); + await Assert.That(nodeTenant).IsEqualTo(tenant); var nodeRaisingComponent = doc[nameof(IJustSayingRequest.RaisingComponent)]?.GetValue(); - Assert.Equal(raisingComponent, nodeRaisingComponent); + await Assert.That(nodeRaisingComponent).IsEqualTo(raisingComponent); var nodeVersion = doc[nameof(IJustSayingRequest.Version)]?.GetValue(); - Assert.Equal(version, nodeVersion); + await Assert.That(nodeVersion).IsEqualTo(version); } - [Fact] - public void MapToMessage_when_mapping_a_request_command_property_should_set_from_publication() + [Test] + public async Task MapToMessage_when_mapping_a_request_command_property_should_set_from_publication() { var mapper = new JustSayingMessageMapper(); var command = new WithJustSayingProperty @@ -306,24 +305,24 @@ public void MapToMessage_when_mapping_a_request_command_property_should_set_from var subject = $"Subject{Guid.NewGuid().ToString()}"; var source = new Uri($"Raising{Guid.NewGuid().ToString()}", UriKind.Relative); - var message = mapper.MapToMessage(command, new Publication + var message = await mapper.MapToMessageAsync(command, new Publication { Subject = subject, Source = source }); - Assert.Equal(subject, message.Header.Subject); + await Assert.That(message.Header.Subject).IsEqualTo(subject); var obj = JsonSerializer.Deserialize(message.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(obj); - Assert.False(Id.IsNullOrEmpty(obj.Id)); - Assert.NotNull(obj.Conversation); - Assert.NotEmpty(obj.Conversation); - Assert.NotEqual(DateTimeOffset.MinValue, obj.TimeStamp); + await Assert.That(obj).IsNotNull(); + await Assert.That(Id.IsNullOrEmpty(obj.Id)).IsFalse(); + await Assert.That(obj.Conversation).IsNotNull(); + await Assert.That(obj.Conversation).IsNotEmpty(); + await Assert.That(obj.TimeStamp).IsNotEqualTo(DateTimeOffset.MinValue); - Assert.Equal(source.ToString(), obj.RaisingComponent); - Assert.Equal(command.Name, obj.Name); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); + await Assert.That(obj.RaisingComponent).IsEqualTo(source.ToString()); + await Assert.That(obj.Name).IsEqualTo(command.Name); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); } public class SomeJustSayingCommand : JustSayingCommand diff --git a/tests/Paramore.Brighter.Transforms.Adaptors.Tests/JustSaying/JustSayingTransformTest.cs b/tests/Paramore.Brighter.Transforms.Adaptors.Tests/JustSaying/JustSayingTransformTest.cs index 0e54933d13..e480fb2795 100644 --- a/tests/Paramore.Brighter.Transforms.Adaptors.Tests/JustSaying/JustSayingTransformTest.cs +++ b/tests/Paramore.Brighter.Transforms.Adaptors.Tests/JustSaying/JustSayingTransformTest.cs @@ -1,8 +1,7 @@ -using System; +using System; using System.Text.Json; using System.Text.Json.Nodes; using Paramore.Brighter.Transformers.JustSaying; -using Xunit; namespace Paramore.Brighter.Transforms.Adaptors.Tests.JustSaying; @@ -10,8 +9,8 @@ public class JustSayingTransformTest { private readonly JustSayingTransform _transform = new(); - [Fact] - public void wrap_should_set_properties_when_it_missing() + [Test] + public async Task wrap_should_set_properties_when_it_missing() { var raisingComponent = $"RaisingComponent{Guid.NewGuid()}"; var version = $"Version{Guid.NewGuid()}"; @@ -34,28 +33,28 @@ public void wrap_should_set_properties_when_it_missing() new JsonNodeOptions { PropertyNameCaseInsensitive = true }, new JsonDocumentOptions { MaxDepth = 0 }); - Assert.Equal(subject, message.Header.Subject); + await Assert.That(message.Header.Subject).IsEqualTo(subject); - Assert.NotNull(node); + await Assert.That(node).IsNotNull(); - Assert.NotNull(node[nameof(IJustSayingRequest.Id)]); - Assert.NotNull(node[nameof(IJustSayingRequest.TimeStamp)]); + await Assert.That(node[nameof(IJustSayingRequest.Id)]).IsNotNull(); + await Assert.That(node[nameof(IJustSayingRequest.TimeStamp)]).IsNotNull(); - Assert.NotNull(node[nameof(IJustSayingRequest.RaisingComponent)]); - Assert.Equal(raisingComponent, node[nameof(IJustSayingRequest.RaisingComponent)]!.GetValue()); + await Assert.That(node[nameof(IJustSayingRequest.RaisingComponent)]).IsNotNull(); + await Assert.That(node[nameof(IJustSayingRequest.RaisingComponent)]!.GetValue()).IsEqualTo(raisingComponent); - Assert.NotNull(node[nameof(IJustSayingRequest.Version)]); - Assert.Equal(version, node[nameof(IJustSayingRequest.Version)]!.GetValue()); + await Assert.That(node[nameof(IJustSayingRequest.Version)]).IsNotNull(); + await Assert.That(node[nameof(IJustSayingRequest.Version)]!.GetValue()).IsEqualTo(version); - Assert.NotNull(node[nameof(IJustSayingRequest.Tenant)]); - Assert.Equal(tenant, node[nameof(IJustSayingRequest.Tenant)]!.GetValue()); + await Assert.That(node[nameof(IJustSayingRequest.Tenant)]).IsNotNull(); + await Assert.That(node[nameof(IJustSayingRequest.Tenant)]!.GetValue()).IsEqualTo(tenant); - Assert.NotNull(node[nameof(IJustSayingRequest.Conversation)]); - Assert.Equal(correlationId, node[nameof(IJustSayingRequest.Conversation)]!.GetValue()); + await Assert.That(node[nameof(IJustSayingRequest.Conversation)]).IsNotNull(); + await Assert.That(node[nameof(IJustSayingRequest.Conversation)]!.GetValue()).IsEqualTo(correlationId); } - [Fact] - public void wrap_should_set_properties_from_request_context_when_it_missing() + [Test] + public async Task wrap_should_set_properties_from_request_context_when_it_missing() { var raisingComponent = $"RaisingComponent{Guid.NewGuid()}"; var version = $"Version{Guid.NewGuid()}"; @@ -84,25 +83,25 @@ public void wrap_should_set_properties_from_request_context_when_it_missing() new JsonDocumentOptions { MaxDepth = 0 }); - Assert.NotNull(node); + await Assert.That(node).IsNotNull(); - Assert.NotNull(node[nameof(IJustSayingRequest.Id)]); - Assert.NotNull(node[nameof(IJustSayingRequest.Conversation)]); - Assert.NotNull(node[nameof(IJustSayingRequest.TimeStamp)]); + await Assert.That(node[nameof(IJustSayingRequest.Id)]).IsNotNull(); + await Assert.That(node[nameof(IJustSayingRequest.Conversation)]).IsNotNull(); + await Assert.That(node[nameof(IJustSayingRequest.TimeStamp)]).IsNotNull(); - Assert.NotNull(node[nameof(IJustSayingRequest.RaisingComponent)]); - Assert.Equal(raisingComponent, node[nameof(IJustSayingRequest.RaisingComponent)]!.GetValue()); + await Assert.That(node[nameof(IJustSayingRequest.RaisingComponent)]).IsNotNull(); + await Assert.That(node[nameof(IJustSayingRequest.RaisingComponent)]!.GetValue()).IsEqualTo(raisingComponent); - Assert.NotNull(node[nameof(IJustSayingRequest.Version)]); - Assert.Equal(version, node[nameof(IJustSayingRequest.Version)]!.GetValue()); + await Assert.That(node[nameof(IJustSayingRequest.Version)]).IsNotNull(); + await Assert.That(node[nameof(IJustSayingRequest.Version)]!.GetValue()).IsEqualTo(version); - Assert.NotNull(node[nameof(IJustSayingRequest.Tenant)]); - Assert.Equal(tenant, node[nameof(IJustSayingRequest.Tenant)]!.GetValue()); + await Assert.That(node[nameof(IJustSayingRequest.Tenant)]).IsNotNull(); + await Assert.That(node[nameof(IJustSayingRequest.Tenant)]!.GetValue()).IsEqualTo(tenant); } - [Fact] - public void wrap_should_not_override_properties_when_it_is_in_payload() + [Test] + public async Task wrap_should_not_override_properties_when_it_is_in_payload() { var raisingComponent = $"RaisingComponent{Guid.NewGuid()}"; var version = $"Version{Guid.NewGuid()}"; @@ -133,20 +132,20 @@ public void wrap_should_not_override_properties_when_it_is_in_payload() new JsonNodeOptions { PropertyNameCaseInsensitive = true }, new JsonDocumentOptions { MaxDepth = 0 }); - Assert.NotNull(node); + await Assert.That(node).IsNotNull(); - Assert.NotNull(node[nameof(IJustSayingRequest.Id)]); - Assert.NotNull(node[nameof(IJustSayingRequest.Conversation)]); - Assert.NotNull(node[nameof(IJustSayingRequest.TimeStamp)]); + await Assert.That(node[nameof(IJustSayingRequest.Id)]).IsNotNull(); + await Assert.That(node[nameof(IJustSayingRequest.Conversation)]).IsNotNull(); + await Assert.That(node[nameof(IJustSayingRequest.TimeStamp)]).IsNotNull(); - Assert.NotNull(node[nameof(IJustSayingRequest.RaisingComponent)]); - Assert.NotEqual(raisingComponent, node[nameof(IJustSayingRequest.RaisingComponent)]!.GetValue()); + await Assert.That(node[nameof(IJustSayingRequest.RaisingComponent)]).IsNotNull(); + await Assert.That(node[nameof(IJustSayingRequest.RaisingComponent)]!.GetValue()).IsNotEqualTo(raisingComponent); - Assert.NotNull(node[nameof(IJustSayingRequest.Version)]); - Assert.NotEqual(version, node[nameof(IJustSayingRequest.Version)]!.GetValue()); + await Assert.That(node[nameof(IJustSayingRequest.Version)]).IsNotNull(); + await Assert.That(node[nameof(IJustSayingRequest.Version)]!.GetValue()).IsNotEqualTo(version); - Assert.NotNull(node[nameof(IJustSayingRequest.Tenant)]); - Assert.NotEqual(tenant, node[nameof(IJustSayingRequest.Tenant)]!.GetValue()); + await Assert.That(node[nameof(IJustSayingRequest.Tenant)]).IsNotNull(); + await Assert.That(node[nameof(IJustSayingRequest.Tenant)]!.GetValue()).IsNotEqualTo(tenant); } } diff --git a/tests/Paramore.Brighter.Transforms.Adaptors.Tests/MassTransit/MassTransitMessageMapperTest.cs b/tests/Paramore.Brighter.Transforms.Adaptors.Tests/MassTransit/MassTransitMessageMapperTest.cs index de189ba4bc..a721081005 100644 --- a/tests/Paramore.Brighter.Transforms.Adaptors.Tests/MassTransit/MassTransitMessageMapperTest.cs +++ b/tests/Paramore.Brighter.Transforms.Adaptors.Tests/MassTransit/MassTransitMessageMapperTest.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.Text.Json; using System.Threading.Tasks; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Transformers.MassTransit; -using Xunit; namespace Paramore.Brighter.Transforms.Adaptors.Tests.MassTransit; @@ -16,41 +15,41 @@ public class MassTransitMessageMapperTests Source = new Uri("http://source") }; - [Fact] - public void MapToMessage_CommandType_SetsMT_COMMAND() + [Test] + public async Task MapToMessage_CommandType_SetsMT_COMMAND() { var mapper = new MassTransitMessageMapper { Context = _context }; var request = new TestCommand(); - var message = mapper.MapToMessage(request, _publication); + var message = await mapper.MapToMessageAsync(request, _publication); - Assert.Equal(MessageType.MT_COMMAND, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_COMMAND); } - [Fact] - public void MapToMessage_EventType_SetsMT_EVENT() + [Test] + public async Task MapToMessage_EventType_SetsMT_EVENT() { var mapper = new MassTransitMessageMapper { Context = _context }; var request = new TestEvent(); - var message = mapper.MapToMessage(request, _publication); + var message = await mapper.MapToMessageAsync(request, _publication); - Assert.Equal(MessageType.MT_EVENT, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_EVENT); } - [Fact] - public void MapToMessage_OtherType_SetsMT_DOCUMENT() + [Test] + public async Task MapToMessage_OtherType_SetsMT_DOCUMENT() { var mapper = new MassTransitMessageMapper { Context = _context }; var request = new TestOtherRequest(); - var message = mapper.MapToMessage(request, _publication); + var message = await mapper.MapToMessageAsync(request, _publication); - Assert.Equal(MessageType.MT_DOCUMENT, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_DOCUMENT); } - [Fact] - public void MapToMessage_ContextHasCorrelationId_UsesIt() + [Test] + public async Task MapToMessage_ContextHasCorrelationId_UsesIt() { const string correlationId = "test-correlation"; _context.Bag[MassTransitHeaderNames.CorrelationId] = correlationId; @@ -58,24 +57,24 @@ public void MapToMessage_ContextHasCorrelationId_UsesIt() var mapper = new MassTransitMessageMapper { Context = _context }; var request = new TestOtherRequest(); - var message = mapper.MapToMessage(request, _publication); + var message = await mapper.MapToMessageAsync(request, _publication); - Assert.Equal(correlationId, message.Header.CorrelationId); + await Assert.That(message.Header.CorrelationId).IsEqualTo(correlationId); } - [Fact] - public void MapToMessage_NoCorrelationIdInContext_GeneratesNew() + [Test] + public async Task MapToMessage_NoCorrelationIdInContext_GeneratesNew() { var mapper = new MassTransitMessageMapper { Context = _context }; var request = new TestOtherRequest(); - var message = mapper.MapToMessage(request, _publication); + var message = await mapper.MapToMessageAsync(request, _publication); - Assert.NotEqual(Guid.Empty.ToString(), message.Header.CorrelationId.Value); + await Assert.That(message.Header.CorrelationId.Value).IsNotEqualTo(Guid.Empty.ToString()); } - [Fact] - public void MapToRequest_DeserializesEnvelopeCorrectly() + [Test] + public async Task MapToRequest_DeserializesEnvelopeCorrectly() { var expectedId = Guid.NewGuid().ToString(); var envelope = new MassTransitMessageEnvelop @@ -99,13 +98,13 @@ public void MapToRequest_DeserializesEnvelopeCorrectly() ); var mapper = new MassTransitMessageMapper(); - var result = mapper.MapToRequest(message); + var result = await mapper.MapToRequestAsync(message); - Assert.Equal(expectedId, result.Id); + await Assert.That(result.Id).IsEqualTo(expectedId); } - [Fact] - public void MapToMessage_EnvelopeContainsConversationIdFromContext() + [Test] + public async Task MapToMessage_EnvelopeContainsConversationIdFromContext() { const string conversationId = "conv123"; _context.Bag[MassTransitHeaderNames.ConversationId] = conversationId; @@ -113,14 +112,14 @@ public void MapToMessage_EnvelopeContainsConversationIdFromContext() var mapper = new MassTransitMessageMapper { Context = _context }; var request = new TestOtherRequest(); - var message = mapper.MapToMessage(request, _publication); + var message = await mapper.MapToMessageAsync(request, _publication); var envelope = JsonSerializer.Deserialize>(message.Body.Bytes, JsonSerialisationOptions.Options); - Assert.Equal(conversationId, envelope?.ConversationId?.Value); + await Assert.That(envelope?.ConversationId?.Value).IsEqualTo(conversationId); } - [Fact] + [Test] public async Task MapToMessageAsync_CallsMapToMessage() { var mapper = new MassTransitMessageMapper(); @@ -128,10 +127,10 @@ public async Task MapToMessageAsync_CallsMapToMessage() var message = await mapper.MapToMessageAsync(request, _publication); - Assert.NotNull(message); + await Assert.That(message).IsNotNull(); } - [Fact] + [Test] public async Task MapToRequestAsync_CallsMapToRequest() { var expectedId = Id.Random(); @@ -159,7 +158,7 @@ public async Task MapToRequestAsync_CallsMapToRequest() var mapper = new MassTransitMessageMapper(); var result = await mapper.MapToRequestAsync(message); - Assert.Equal(expectedId, result.Id); + await Assert.That(result.Id).IsEqualTo(expectedId); } } diff --git a/tests/Paramore.Brighter.Transforms.Adaptors.Tests/MassTransit/MassTransitTransformTest.cs b/tests/Paramore.Brighter.Transforms.Adaptors.Tests/MassTransit/MassTransitTransformTest.cs index 2bf0a29f4d..89cecb027c 100644 --- a/tests/Paramore.Brighter.Transforms.Adaptors.Tests/MassTransit/MassTransitTransformTest.cs +++ b/tests/Paramore.Brighter.Transforms.Adaptors.Tests/MassTransit/MassTransitTransformTest.cs @@ -1,9 +1,8 @@ -using System; +using System; using System.Collections.Generic; using System.Text.Json; using Paramore.Brighter.JsonConverters; using Paramore.Brighter.Transformers.MassTransit; -using Xunit; namespace Paramore.Brighter.Transforms.Adaptors.Tests.MassTransit; @@ -11,8 +10,8 @@ public class MassTransitTransformTest { private readonly MassTransitTransform _transform = new(); - [Fact] - public void wrap_should_use_default_value() + [Test] + public async Task wrap_should_use_default_value() { var message = new Message( new MessageHeader @@ -28,22 +27,22 @@ public void wrap_should_use_default_value() var envelop = JsonSerializer.Deserialize>(wrap.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(envelop); - Assert.Null(envelop.ConversationId); - Assert.Null(envelop.DestinationAddress); - Assert.Null(envelop.FaultAddress); - Assert.Null(envelop.MessageType); - Assert.Null(envelop.RequestId); - Assert.Null(envelop.ResponseAddress); - Assert.Null(envelop.SourceAddress); - Assert.Null(envelop.ExpirationTime); - Assert.Equal(message.Header.MessageId, envelop.MessageId); - Assert.Equal(message.Header.CorrelationId, envelop.CorrelationId); - Assert.Equal(message.Header.TimeStamp.DateTime, envelop.SentTime); + await Assert.That(envelop).IsNotNull(); + await Assert.That(envelop.ConversationId).IsNull(); + await Assert.That(envelop.DestinationAddress).IsNull(); + await Assert.That(envelop.FaultAddress).IsNull(); + await Assert.That(envelop.MessageType).IsNull(); + await Assert.That(envelop.RequestId).IsNull(); + await Assert.That(envelop.ResponseAddress).IsNull(); + await Assert.That(envelop.SourceAddress).IsNull(); + await Assert.That(envelop.ExpirationTime).IsNull(); + await Assert.That(envelop.MessageId).IsEqualTo(message.Header.MessageId); + await Assert.That(envelop.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(envelop.SentTime).IsEqualTo(message.Header.TimeStamp.DateTime); } - [Fact] - public void wrap_should_use_from_request_context() + [Test] + public async Task wrap_should_use_from_request_context() { var message = new Message( new MessageHeader @@ -85,22 +84,22 @@ public void wrap_should_use_from_request_context() var envelop = JsonSerializer.Deserialize>(wrap.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(envelop); - Assert.Equal(conversationId, envelop.ConversationId?.Value); - Assert.Equal(destinationAddress, envelop.DestinationAddress?.ToString()); - Assert.Equal(faultAddress, envelop.FaultAddress?.ToString()); - Assert.Equal(messageType, envelop.MessageType); - Assert.Equal(requestId, envelop.RequestId?.Value); - Assert.Equal(responseAddress, envelop.ResponseAddress?.ToString()); - Assert.Equal(sourceAddress, envelop.SourceAddress?.ToString()); - Assert.Equal(expirationTime, envelop.ExpirationTime); - Assert.Equal(message.Header.MessageId, envelop.MessageId); - Assert.Equal(message.Header.CorrelationId, envelop.CorrelationId); - Assert.Equal(message.Header.TimeStamp.DateTime, envelop.SentTime); + await Assert.That(envelop).IsNotNull(); + await Assert.That(envelop.ConversationId?.Value).IsEqualTo(conversationId); + await Assert.That(envelop.DestinationAddress?.ToString()).IsEqualTo(destinationAddress); + await Assert.That(envelop.FaultAddress?.ToString()).IsEqualTo(faultAddress); + await Assert.That(envelop.MessageType).IsEqualTo(messageType); + await Assert.That(envelop.RequestId?.Value).IsEqualTo(requestId); + await Assert.That(envelop.ResponseAddress?.ToString()).IsEqualTo(responseAddress); + await Assert.That(envelop.SourceAddress?.ToString()).IsEqualTo(sourceAddress); + await Assert.That(envelop.ExpirationTime).IsEqualTo(expirationTime); + await Assert.That(envelop.MessageId).IsEqualTo(message.Header.MessageId); + await Assert.That(envelop.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(envelop.SentTime).IsEqualTo(message.Header.TimeStamp.DateTime); } - [Fact] - public void wrap_should_use_from_transform() + [Test] + public async Task wrap_should_use_from_transform() { var message = new Message( new MessageHeader @@ -139,22 +138,22 @@ public void wrap_should_use_from_transform() var envelop = JsonSerializer.Deserialize>(wrap.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(envelop); - Assert.Equal(conversationId, envelop.ConversationId?.Value); - Assert.Equal(destinationAddress, envelop.DestinationAddress?.ToString()); - Assert.Equal(faultAddress, envelop.FaultAddress?.ToString()); - Assert.Equal(messageType, envelop.MessageType); - Assert.Equal(requestId, envelop.RequestId?.Value); - Assert.Equal(responseAddress, envelop.ResponseAddress?.ToString()); - Assert.Equal(sourceAddress, envelop.SourceAddress?.ToString()); - Assert.Equal(expirationTime, envelop.ExpirationTime); - Assert.Equal(message.Header.MessageId, envelop.MessageId); - Assert.Equal(message.Header.CorrelationId, envelop.CorrelationId); - Assert.Equal(message.Header.TimeStamp.DateTime, envelop.SentTime); + await Assert.That(envelop).IsNotNull(); + await Assert.That(envelop.ConversationId?.Value).IsEqualTo(conversationId); + await Assert.That(envelop.DestinationAddress?.ToString()).IsEqualTo(destinationAddress); + await Assert.That(envelop.FaultAddress?.ToString()).IsEqualTo(faultAddress); + await Assert.That(envelop.MessageType).IsEqualTo(messageType); + await Assert.That(envelop.RequestId?.Value).IsEqualTo(requestId); + await Assert.That(envelop.ResponseAddress?.ToString()).IsEqualTo(responseAddress); + await Assert.That(envelop.SourceAddress?.ToString()).IsEqualTo(sourceAddress); + await Assert.That(envelop.ExpirationTime).IsEqualTo(expirationTime); + await Assert.That(envelop.MessageId).IsEqualTo(message.Header.MessageId); + await Assert.That(envelop.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(envelop.SentTime).IsEqualTo(message.Header.TimeStamp.DateTime); } - [Fact] - public void unwrap() + [Test] + public async Task unwrap() { var message = new Message( new MessageHeader @@ -197,19 +196,19 @@ public void unwrap() var envelop = JsonSerializer.Deserialize>(wrap.Body.Bytes, JsonSerialisationOptions.Options); - Assert.NotNull(envelop); - Assert.Equal(conversationId, envelop.ConversationId?.Value); - Assert.Equal(destinationAddress, envelop.DestinationAddress?.ToString()); - Assert.Equal(faultAddress, envelop.FaultAddress?.ToString()); - Assert.Equal(messageType, envelop.MessageType); - Assert.Equal(requestId, envelop.RequestId?.Value); - Assert.Equal(responseAddress, envelop.ResponseAddress?.ToString()); - Assert.Equal(sourceAddress, envelop.SourceAddress?.ToString()); - Assert.Equal(expirationTime, envelop.ExpirationTime); - Assert.Equal(message.Header.MessageId, envelop.MessageId); - Assert.Equal(message.Header.CorrelationId, envelop.CorrelationId); - Assert.Equal(message.Header.TimeStamp.DateTime, envelop.SentTime); - Assert.Single(message.Header.Bag); + await Assert.That(envelop).IsNotNull(); + await Assert.That(envelop.ConversationId?.Value).IsEqualTo(conversationId); + await Assert.That(envelop.DestinationAddress?.ToString()).IsEqualTo(destinationAddress); + await Assert.That(envelop.FaultAddress?.ToString()).IsEqualTo(faultAddress); + await Assert.That(envelop.MessageType).IsEqualTo(messageType); + await Assert.That(envelop.RequestId?.Value).IsEqualTo(requestId); + await Assert.That(envelop.ResponseAddress?.ToString()).IsEqualTo(responseAddress); + await Assert.That(envelop.SourceAddress?.ToString()).IsEqualTo(sourceAddress); + await Assert.That(envelop.ExpirationTime).IsEqualTo(expirationTime); + await Assert.That(envelop.MessageId).IsEqualTo(message.Header.MessageId); + await Assert.That(envelop.CorrelationId).IsEqualTo(message.Header.CorrelationId); + await Assert.That(envelop.SentTime).IsEqualTo(message.Header.TimeStamp.DateTime); + await Assert.That(message.Header.Bag).HasSingleItem(); } public class SomeEvent() : Event(Guid.NewGuid()) diff --git a/tests/Paramore.Brighter.Transforms.Adaptors.Tests/Paramore.Brighter.Transforms.Adaptors.Tests.csproj b/tests/Paramore.Brighter.Transforms.Adaptors.Tests/Paramore.Brighter.Transforms.Adaptors.Tests.csproj index aa1580ee96..9802b8d879 100644 --- a/tests/Paramore.Brighter.Transforms.Adaptors.Tests/Paramore.Brighter.Transforms.Adaptors.Tests.csproj +++ b/tests/Paramore.Brighter.Transforms.Adaptors.Tests/Paramore.Brighter.Transforms.Adaptors.Tests.csproj @@ -1,30 +1,15 @@ - - - - $(BrighterTestTargetFrameworks) - false - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - + + + $(BrighterTestTargetFrameworks) + false + Exe + + + + + + + + + + \ No newline at end of file diff --git a/tests/Paramore.Test.Helpers/Base/ITestClassBase.cs b/tests/Paramore.Test.Helpers/Base/ITestClassBase.cs index 3f0f63c6db..2f6ab9d0c2 100644 --- a/tests/Paramore.Test.Helpers/Base/ITestClassBase.cs +++ b/tests/Paramore.Test.Helpers/Base/ITestClassBase.cs @@ -1,6 +1,5 @@ -using System; +using System; using Paramore.Test.Helpers.TestOutput; -using Xunit.Abstractions; namespace Paramore.Test.Helpers.Base { @@ -26,19 +25,6 @@ public interface ITestClassBase : IDisposable /// IServiceProvider ServiceProvider { get; } - /// - /// Gets the current xUnit test instance associated with the test execution. - /// - /// - /// An instance of representing the current test, - /// or null if no test is associated. - /// - /// - /// This property provides access to the xUnit test metadata, such as the test's display name - /// and other related information. It may return null if the test context is not initialized. - /// - ITest? XunitTest { get; } - /// /// Gets the fully qualified name of the test, including its namespace and class name. /// This property is useful for uniquely identifying a test within the test suite. diff --git a/tests/Paramore.Test.Helpers/Base/TestClassBase.cs b/tests/Paramore.Test.Helpers/Base/TestClassBase.cs index 3c0b154ddc..e34857d295 100644 --- a/tests/Paramore.Test.Helpers/Base/TestClassBase.cs +++ b/tests/Paramore.Test.Helpers/Base/TestClassBase.cs @@ -1,17 +1,13 @@ -using System; -using System.Diagnostics.CodeAnalysis; -using System.Reflection; +using System; using Microsoft.Extensions.DependencyInjection; using Paramore.Test.Helpers.Extensions; using Paramore.Test.Helpers.TestOutput; -using Xunit.Abstractions; namespace Paramore.Test.Helpers.Base { /// /// Serves as a base class for test classes in the AOT test suite. /// This abstract class provides shared setup and utility functionality for derived test classes. - /// Implements the interface to support shared test context. /// /// /// The type parameter representing the specific test class deriving from this base class. @@ -23,16 +19,11 @@ public abstract class TestClassBase : ITestClassBase /// /// Initializes a new instance of the class. - /// This constructor is used to set up the shared test context and output helper for derived test classes. + /// This constructor sets up the shared test context and output helper for derived test classes. /// - /// - /// An instance of used to capture test output during execution. - /// - protected TestClassBase(ITestOutputHelper testOutputHelper) + protected TestClassBase() { - ArgumentNullException.ThrowIfNull(testOutputHelper); - - TestOutputHelper = new CoreTestOutputHelper(this, testOutputHelper); + TestOutputHelper = new CoreTestOutputHelper(this, Console.Out); _serviceProviderLazy = new Lazy(() => BuildServiceProvider(new ServiceCollection(), TestOutputHelper)); } @@ -43,10 +34,7 @@ protected TestClassBase(ITestOutputHelper testOutputHelper) public ICoreTestOutputHelper TestOutputHelper { get; } /// - public ITest? XunitTest => (ITest?)GetTestField(TestOutputHelper.WrappedTestOutputHelper)?.GetValue(TestOutputHelper.WrappedTestOutputHelper); - - /// - public string TestQualifiedName => XunitTest?.DisplayName ?? typeof(T).GetLoggerCategoryName(); + public string TestQualifiedName => typeof(T).GetLoggerCategoryName(); /// public string TestDisplayName => TestQualifiedName.RemoveNamespace(); @@ -59,10 +47,6 @@ protected virtual IServiceProvider BuildServiceProvider(IServiceCollection servi /// /// Releases all resources used by the instance. /// - /// - /// This method is responsible for performing cleanup operations for the current instance of the class. - /// It ensures that any unmanaged resources are released and any disposable objects are properly disposed. - /// protected virtual void Dispose(bool disposing) { if (!_disposedValue) @@ -83,27 +67,5 @@ public void Dispose() Dispose(disposing: true); GC.SuppressFinalize(this); } - - /// - /// Retrieves the private field named 'test' from the specified instance. - /// - /// - /// An instance of from which the private field is to be retrieved. - /// - /// - /// A object representing the 'test' field if it exists; otherwise, null. - /// - /// - /// This method uses reflection to access a private field named 'test' within the provided - /// instance. The field is expected to exist in the implementation. - /// - /// - /// Thrown if the parameter is null. - /// - [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2075", Justification = "The field 'test' is known to exist in the ITestOutputHelper implementation.")] - private static FieldInfo? GetTestField(ITestOutputHelper testOutputHelper) - { - return testOutputHelper.GetType().GetField("test", BindingFlags.Instance | BindingFlags.NonPublic); - } } } diff --git a/tests/Paramore.Test.Helpers/Paramore.Test.Helpers.csproj b/tests/Paramore.Test.Helpers/Paramore.Test.Helpers.csproj index ef403da8a9..6ab9ef480d 100644 --- a/tests/Paramore.Test.Helpers/Paramore.Test.Helpers.csproj +++ b/tests/Paramore.Test.Helpers/Paramore.Test.Helpers.csproj @@ -1,30 +1,17 @@ - - + $(BrighterTestTargetFrameworks) false + Exe - - - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - + - - \ No newline at end of file diff --git a/tests/Paramore.Test.Helpers/TestOutput/CoreTestOutputHelper.cs b/tests/Paramore.Test.Helpers/TestOutput/CoreTestOutputHelper.cs index 15158a5c33..758a0dbd7d 100644 --- a/tests/Paramore.Test.Helpers/TestOutput/CoreTestOutputHelper.cs +++ b/tests/Paramore.Test.Helpers/TestOutput/CoreTestOutputHelper.cs @@ -1,15 +1,15 @@ -using System; +using System; using System.Globalization; +using System.IO; using System.Text; using System.Threading; using Paramore.Test.Helpers.Base; using Paramore.Test.Helpers.Extensions; -using Xunit.Abstractions; namespace Paramore.Test.Helpers.TestOutput { /// - /// Class CoreTestOutputHelper. Base class for all xUnit tests. + /// Class CoreTestOutputHelper. Provides test output capture and formatting. /// public class CoreTestOutputHelper : ICoreTestOutputHelper { @@ -21,17 +21,18 @@ public class CoreTestOutputHelper : ICoreTestOutputHelper /// /// Initializes a new instance of the class. /// - /// The test output helper instance. - public CoreTestOutputHelper(ITestClassBase testCase, ITestOutputHelper testOutputHelper) + /// The test case instance. + /// The used for test output. + public CoreTestOutputHelper(ITestClassBase testCase, TextWriter writer) { TestCase = testCase; - WrappedTestOutputHelper = testOutputHelper ?? throw new ArgumentNullException(nameof(testOutputHelper)); + WrappedTestOutputHelper = writer ?? throw new ArgumentNullException(nameof(writer)); } public ITestClassBase TestCase { get; } /// - public ITestOutputHelper WrappedTestOutputHelper { get; } + public TextWriter WrappedTestOutputHelper { get; } /// public DateTime DateTimeStart { get; } = DateTime.UtcNow; diff --git a/tests/Paramore.Test.Helpers/TestOutput/ICoreTestOutputHelper.cs b/tests/Paramore.Test.Helpers/TestOutput/ICoreTestOutputHelper.cs index 8736ad8aed..c1a5b30bab 100644 --- a/tests/Paramore.Test.Helpers/TestOutput/ICoreTestOutputHelper.cs +++ b/tests/Paramore.Test.Helpers/TestOutput/ICoreTestOutputHelper.cs @@ -1,10 +1,10 @@ -using System; +using System; +using System.IO; using Paramore.Test.Helpers.Base; -using Xunit.Abstractions; namespace Paramore.Test.Helpers.TestOutput { - public interface ICoreTestOutputHelper : ITestOutputHelper, IDisposable + public interface ICoreTestOutputHelper : IDisposable { /// /// Gets the test case associated with the current test output helper. @@ -17,9 +17,9 @@ public interface ICoreTestOutputHelper : ITestOutputHelper, IDisposable ITestClassBase TestCase { get; } /// - /// Gets the wrapped instance of used for test output handling. + /// Gets the wrapped used for test output handling. /// - ITestOutputHelper WrappedTestOutputHelper { get; } + TextWriter WrappedTestOutputHelper { get; } /// /// Gets the UTC date and time when the test output helper was initialized. diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs.liquid index 1d6a5d85af..5f49825213 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async.cs.liquid @@ -2,7 +2,6 @@ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,30 +9,28 @@ using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Async; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenAddingADuplicateMessageItShouldNotThrowAsync : IAsyncLifetime +[Category("{{Category}}")]{% endif %} +public class WhenAddingADuplicateMessageItShouldNotThrowAsync { - private readonly IAmAnOutboxProviderAsync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderAsync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenAddingADuplicateMessageItShouldNotThrowAsync() + [Before(HookType.Test)] + public async Task Setup() { _outboxProvider = new {{ OutboxProvider }}(); _messageFactory = new {{ MessageFactory }}(); - } - - public async Task InitializeAsync() - { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw_Async() { // Arrange @@ -48,6 +45,6 @@ public class WhenAddingADuplicateMessageItShouldNotThrowAsync : IAsyncLifetime // Assert // Just adding a simple assertion to remove any warning - Assert.True(true); + await Assert.That(true).IsTrue(); } } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs.liquid index 2bc9c8b420..bea68809fd 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async.cs.liquid @@ -2,7 +2,6 @@ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,31 +9,28 @@ using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Async; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync : IAsyncLifetime +[Category("{{Category}}")]{% endif %} +public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync { - private readonly IAmAnOutboxProviderAsync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderAsync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync() + [Before(HookType.Test)] + public async Task Setup() { _outboxProvider = new {{ OutboxProvider }}(); - _messageFactory = new {{ MessageFactory }}(); - } - - public async Task InitializeAsync() - { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties_Async() { // Arrange @@ -50,37 +46,37 @@ public class WhenAddingAMessageItShouldBeStoredWithAllPropertiesAsync : IAsyncLi var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic.ToString()).IsEqualTo(message.Header.Topic.ToString()); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsBetween(message.Header.TimeStamp.AddSeconds(-1), message.Header.TimeStamp.AddSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId.ToString()).IsEqualTo(message.Header.CorrelationId.ToString()); + await Assert.That(storedMessage.Header.ReplyTo.ToString()).IsEqualTo(message.Header.ReplyTo.ToString()); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey.ToString()).IsEqualTo(message.Header.PartitionKey.ToString()); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag.ContainsKey(key)).IsTrue(); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type.ToString()).IsEqualTo(message.Header.Type.ToString()); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState.ToString()).IsEqualTo(message.Header.TraceState.ToString()); } } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs.liquid index 0e92eedfe2..fd70b9492f 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async.cs.liquid @@ -2,7 +2,6 @@ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,31 +9,28 @@ using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Async; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync : IAsyncLifetime +[Category("{{Category}}")]{% endif %} +public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync { - private readonly IAmAnOutboxProviderAsync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderAsync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAsync() + [Before(HookType.Test)] + public async Task Setup() { _outboxProvider = new {{ OutboxProvider }}(); - _messageFactory = new {{ MessageFactory }}(); - } - - public async Task InitializeAsync() - { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored_Async() { // Arrange @@ -55,6 +51,6 @@ public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStoredAs var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs.liquid index 88a9844eb2..b6b9cdf397 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async.cs.liquid @@ -2,7 +2,6 @@ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,31 +9,28 @@ using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Async; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync : IAsyncLifetime +[Category("{{Category}}")]{% endif %} +public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync { - private readonly IAmAnOutboxProviderAsync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderAsync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync() + [Before(HookType.Test)] + public async Task Setup() { _outboxProvider = new {{ OutboxProvider }}(); - _messageFactory = new {{ MessageFactory }}(); - } - - public async Task InitializeAsync() - { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit_Async() { // Arrange @@ -55,37 +51,37 @@ public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommitAsync var storedMessage = await outbox.GetAsync(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic.ToString()).IsEqualTo(message.Header.Topic.ToString()); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsBetween(message.Header.TimeStamp.AddSeconds(-1), message.Header.TimeStamp.AddSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId.ToString()).IsEqualTo(message.Header.CorrelationId.ToString()); + await Assert.That(storedMessage.Header.ReplyTo.ToString()).IsEqualTo(message.Header.ReplyTo.ToString()); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey.ToString()).IsEqualTo(message.Header.PartitionKey.ToString()); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag.ContainsKey(key)).IsTrue(); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type.ToString()).IsEqualTo(message.Header.Type.ToString()); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState.ToString()).IsEqualTo(message.Header.TraceState.ToString()); } } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs.liquid index b2cdb51b12..5cb7c088ad 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async.cs.liquid @@ -2,7 +2,6 @@ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,30 +9,28 @@ using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Async; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync : IAsyncLifetime +[Category("{{Category}}")]{% endif %} +public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync { - private readonly IAmAnOutboxProviderAsync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderAsync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync() + [Before(HookType.Test)] + public async Task Setup() { _outboxProvider = new {{ OutboxProvider }}(); _messageFactory = new {{ MessageFactory }}(); - } - - public async Task InitializeAsync() - { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -59,8 +56,8 @@ public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutboxAsync : IA .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs.liquid index 1b9dedde2b..43053d828a 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async.cs.liquid @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,30 +34,28 @@ using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Async; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync : IAsyncLifetime +[Category("{{Category}}")]{% endif %} +public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync { - private readonly IAmAnOutboxProviderAsync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderAsync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync() + [Before(HookType.Test)] + public async Task Setup() { _outboxProvider = new {{ OutboxProvider }}(); _messageFactory = new {{ MessageFactory }}(); - } - - public async Task InitializeAsync() - { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox_Async() { // Arrange @@ -85,8 +82,8 @@ public class WhenDeletingOneMessageItShouldBeRemovedFromOutboxAsync : IAsyncLife .OutstandingMessagesAsync(TimeSpan.Zero, context)) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs.liquid index a80635573b..16e80f0f21 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async.cs.liquid @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,31 +34,28 @@ using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Async; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync : IAsyncLifetime +[Category("{{Category}}")]{% endif %} +public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync { - private readonly IAmAnOutboxProviderAsync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderAsync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync() + [Before(HookType.Test)] + public async Task Setup() { _outboxProvider = new {{ OutboxProvider }}(); - _messageFactory = new {{ MessageFactory }}(); - } - - public async Task InitializeAsync() - { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message_Async() { // Arrange @@ -81,38 +77,38 @@ public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessageAsync : IA var message = await outbox.GetAsync(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(message.Body.Value).IsEqualTo(dispatched.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox + await Assert.That(message.Header.Topic.ToString()).IsEqualTo(dispatched.Header.Topic.ToString()); + await Assert.That(message.Header.MessageType).IsEqualTo(dispatched.Header.MessageType); + await Assert.That(message.Header.TimeStamp).IsBetween(dispatched.Header.TimeStamp.AddSeconds(-1), dispatched.Header.TimeStamp.AddSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(message.Header.CorrelationId.ToString()).IsEqualTo(dispatched.Header.CorrelationId.ToString()); + await Assert.That(message.Header.ReplyTo.ToString()).IsEqualTo(dispatched.Header.ReplyTo.ToString()); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(message.Header.PartitionKey.ToString()).IsEqualTo(dispatched.Header.PartitionKey.ToString()); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag.ContainsKey(key)).IsTrue(); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type.ToString()).IsEqualTo(message.Header.Type.ToString()); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState.ToString()).IsEqualTo(message.Header.TraceState.ToString()); } } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs.liquid index 7708052518..29adc8ab17 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async.cs.liquid @@ -2,7 +2,6 @@ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,31 +9,28 @@ using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Async; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync : IAsyncLifetime +[Category("{{Category}}")]{% endif %} +public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync { - private readonly IAmAnOutboxProviderAsync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderAsync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync() + [Before(HookType.Test)] + public async Task Setup() { _outboxProvider = new {{ OutboxProvider }}(); - _messageFactory = new {{ MessageFactory }}(); - } - - public async Task InitializeAsync() - { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message_Async() { // Arrange @@ -46,6 +42,6 @@ public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessageAsync : var message = await outbox.GetAsync(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs.liquid index e10b607de2..63afb33f37 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async.cs.liquid @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,31 +34,28 @@ using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Async; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync : IAsyncLifetime +[Category("{{Category}}")]{% endif %} +public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync { - private readonly IAmAnOutboxProviderAsync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderAsync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatchedAsync() + [Before(HookType.Test)] + public async Task Setup() { _outboxProvider = new {{ OutboxProvider }}(); - _messageFactory = new {{ MessageFactory }}(); - } - - public async Task InitializeAsync() - { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched_Async() { // Arrange @@ -81,9 +77,9 @@ public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched var messages = (await _outboxProvider.GetAllMessagesAsync()).ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs.liquid index dd89134f7d..805fc99c66 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async.cs.liquid @@ -2,7 +2,6 @@ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,31 +9,28 @@ using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Async; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync : IAsyncLifetime +[Category("{{Category}}")]{% endif %} +public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync { - private readonly IAmAnOutboxProviderAsync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderAsync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync() + [Before(HookType.Test)] + public async Task Setup() { _outboxProvider = new {{ OutboxProvider }}(); - _messageFactory = new {{ MessageFactory }}(); - } - - public async Task InitializeAsync() - { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -58,18 +54,18 @@ public class WhenRetrievingDispatchedMessagesItShouldFilterByAgeAsync : IAsyncLi var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs.liquid index 9119f3c417..2b3b4ef3c2 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async.cs.liquid @@ -27,7 +27,6 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -35,31 +34,28 @@ using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Async; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync : IAsyncLifetime +[Category("{{Category}}")]{% endif %} +public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync { - private readonly IAmAnOutboxProviderAsync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderAsync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync() + [Before(HookType.Test)] + public async Task Setup() { _outboxProvider = new {{ OutboxProvider }}(); - _messageFactory = new {{ MessageFactory }}(); - } - - public async Task InitializeAsync() - { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages_Async() { // Arrange @@ -83,9 +79,9 @@ public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessagesAsync .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs.liquid index e6a4173662..346d536636 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Async/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async.cs.liquid @@ -2,7 +2,6 @@ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; @@ -10,31 +9,28 @@ using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Async; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync : IAsyncLifetime +[Category("{{Category}}")]{% endif %} +public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync { - private readonly IAmAnOutboxProviderAsync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderAsync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync() + [Before(HookType.Test)] + public async Task Setup() { _outboxProvider = new {{ OutboxProvider }}(); - _messageFactory = new {{ MessageFactory }}(); - } - - public async Task InitializeAsync() - { await _outboxProvider.CreateStoreAsync(); } - public async Task DisposeAsync() + [After(HookType.Test)] + public async Task Cleanup() { await _outboxProvider.DeleteStoreAsync(_createdMessages); } - [Fact] + [Test] public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age_Async() { // Arrange @@ -58,18 +54,18 @@ public class WhenRetrievingOutstandingMessagesItShouldFilterByAgeAsync : IAsyncL var messagesOver4Hours = (await outbox.DispatchedMessagesAsync(TimeSpan.FromHours(4), context)).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs.liquid index 8e39d831ba..0e77bbc4f4 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Adding_A_Duplicate_Message_It_Should_Not_Throw.cs.liquid @@ -27,30 +27,35 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace {{ Namespace }}.Outbox{{ Prefix }}.Sync; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenAddingADuplicateMessageItShouldNotThrow : IDisposable +[Category("{{Category}}")]{% endif %} +public class WhenAddingADuplicateMessageItShouldNotThrow { - private readonly IAmAnOutboxProviderSync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderSync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenAddingADuplicateMessageItShouldNotThrow() + [Before(HookType.Test)] + public void Setup() { _outboxProvider = new {{ OutboxProvider }}(); _outboxProvider.CreateStore(); - _messageFactory = new {{ MessageFactory }}(); } - [Fact] - public void When_Adding_A_Duplicate_Message_It_Should_Not_Throw() + [After(HookType.Test)] + public void Cleanup() + { + _outboxProvider.DeleteStore(_createdMessages); + } + + [Test] + public async Task When_Adding_A_Duplicate_Message_It_Should_Not_Throw() { // Arrange var context = new RequestContext(); @@ -63,12 +68,6 @@ public class WhenAddingADuplicateMessageItShouldNotThrow : IDisposable outbox.Add(message, context); // Assert - // Just adding a simple assertion to remove any warning - Assert.True(true); - } - - public void Dispose() - { - _outboxProvider.DeleteStore(_createdMessages); + await Assert.That(true).IsTrue(); } } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs.liquid index 3e908858ec..6035e0e7a8 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties.cs.liquid @@ -27,30 +27,35 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; namespace {{ Namespace }}.Outbox{{ Prefix }}.Sync; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenAddingAMessageItShouldBeStoredWithAllProperties : IDisposable +[Category("{{Category}}")]{% endif %} +public class WhenAddingAMessageItShouldBeStoredWithAllProperties { - private readonly IAmAnOutboxProviderSync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderSync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenAddingAMessageItShouldBeStoredWithAllProperties() + [Before(HookType.Test)] + public void Setup() { _outboxProvider = new {{ OutboxProvider }}(); _outboxProvider.CreateStore(); - _messageFactory = new {{ MessageFactory }}(); } - [Fact] - public void When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() + [After(HookType.Test)] + public void Cleanup() + { + _outboxProvider.DeleteStore(_createdMessages); + } + + [Test] + public async Task When_Adding_A_Message_It_Should_Be_Stored_With_All_Properties() { // Arrange var context = new RequestContext(); @@ -65,42 +70,37 @@ public class WhenAddingAMessageItShouldBeStoredWithAllProperties : IDisposable var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic.ToString()).IsEqualTo(message.Header.Topic.ToString()); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsBetween(message.Header.TimeStamp.AddSeconds(-1), message.Header.TimeStamp.AddSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId.ToString()).IsEqualTo(message.Header.CorrelationId.ToString()); + await Assert.That(storedMessage.Header.ReplyTo.ToString()).IsEqualTo(message.Header.ReplyTo.ToString()); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey.ToString()).IsEqualTo(message.Header.PartitionKey.ToString()); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag.ContainsKey(key)).IsTrue(); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); - } - - public void Dispose() - { - _outboxProvider.DeleteStore(_createdMessages); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type.ToString()).IsEqualTo(message.Header.Type.ToString()); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState.ToString()).IsEqualTo(message.Header.TraceState.ToString()); } } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs.liquid index b2414926e8..b82d8f99ee 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored.cs.liquid @@ -27,21 +27,22 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Sync; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored : IDisposable +[Category("{{Category}}")]{% endif %} +public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored { - private readonly IAmAnOutboxProviderSync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderSync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored() + [Before(HookType.Test)] + public void Setup() { _outboxProvider = new {{ OutboxProvider }}(); _outboxProvider.CreateStore(); @@ -49,8 +50,8 @@ public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored : _messageFactory = new {{ MessageFactory }}(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_And_Rollback_It_Should_Not_Be_Stored() { // Arrange var outbox = _outboxProvider.CreateOutbox(); @@ -70,10 +71,11 @@ public class WhenAddingAMessageWithinTransactionAndRollbackItShouldNotBeStored : var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(MessageType.MT_NONE, storedMessage.Header.MessageType); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(HookType.Test)] + public void Cleanup() { _outboxProvider.DeleteStore(_createdMessages); } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs.liquid index bb98754aba..b4404320a9 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit.cs.liquid @@ -27,21 +27,22 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Sync; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit : IDisposable +[Category("{{Category}}")]{% endif %} +public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit { - private readonly IAmAnOutboxProviderSync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderSync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit() + [Before(HookType.Test)] + public void Setup() { _outboxProvider = new {{ OutboxProvider }}(); _outboxProvider.CreateStore(); @@ -49,8 +50,8 @@ public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit : ID _messageFactory = new {{ MessageFactory }}(); } - [Fact] - public void When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() + [Test] + public async Task When_Adding_A_Message_Within_Transaction_It_Should_Be_Stored_After_Commit() { // Arrange var outbox = _outboxProvider.CreateOutbox(); @@ -70,41 +71,42 @@ public class WhenAddingAMessageWithinTransactionItShouldBeStoredAfterCommit : ID var storedMessage = outbox.Get(message.Id, context); // Assert - Assert.Equal(message.Body.Value, storedMessage.Body.Value); + await Assert.That(storedMessage.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, storedMessage.Header.Topic); - Assert.Equal(message.Header.MessageType, storedMessage.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, storedMessage.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, storedMessage.Header.HandledCount); // -- should be zero when read from outbox - Assert.Equal(TimeSpan.Zero, storedMessage.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, storedMessage.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, storedMessage.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.ToString(), storedMessage.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, storedMessage.Header.PartitionKey); + await Assert.That(storedMessage.Header.Topic.ToString()).IsEqualTo(message.Header.Topic.ToString()); + await Assert.That(storedMessage.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(storedMessage.Header.TimeStamp).IsBetween(message.Header.TimeStamp.AddSeconds(-1), message.Header.TimeStamp.AddSeconds(1)); + await Assert.That(storedMessage.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(storedMessage.Header.CorrelationId.ToString()).IsEqualTo(message.Header.CorrelationId.ToString()); + await Assert.That(storedMessage.Header.ReplyTo.ToString()).IsEqualTo(message.Header.ReplyTo.ToString()); + await Assert.That(storedMessage.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.ToString()); + await Assert.That(storedMessage.Header.PartitionKey.ToString()).IsEqualTo(message.Header.PartitionKey.ToString()); //Bag serialization - Assert.Equal(message.Header.Bag.Count, storedMessage.Header.Bag.Count); + await Assert.That(storedMessage.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, storedMessage.Header.Bag); - Assert.Equal(val, storedMessage.Header.Bag[key].ToString()); + await Assert.That(storedMessage.Header.Bag.ContainsKey(key)).IsTrue(); + await Assert.That(storedMessage.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, storedMessage.Header.WorkflowId); - Assert.Equal(message.Header.JobId, storedMessage.Header.JobId); + await Assert.That(storedMessage.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(storedMessage.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, storedMessage.Header.Source); - Assert.Equal(message.Header.Type, storedMessage.Header.Type); - Assert.Equal(message.Header.DataSchema, storedMessage.Header.DataSchema); - Assert.Equal(message.Header.Subject, storedMessage.Header.Subject); - Assert.Equal(message.Header.TraceParent, storedMessage.Header.TraceParent); - Assert.Equal(message.Header.TraceState, storedMessage.Header.TraceState); + await Assert.That(storedMessage.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(storedMessage.Header.Type.ToString()).IsEqualTo(message.Header.Type.ToString()); + await Assert.That(storedMessage.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(storedMessage.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(storedMessage.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(storedMessage.Header.TraceState.ToString()).IsEqualTo(message.Header.TraceState.ToString()); } - public void Dispose() + [After(HookType.Test)] + public void Cleanup() { _outboxProvider.DeleteStore(_createdMessages); } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs.liquid index 8def02f434..c5de774759 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox.cs.liquid @@ -27,21 +27,22 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Sync; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox : IDisposable +[Category("{{Category}}")]{% endif %} +public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox { - private readonly IAmAnOutboxProviderSync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderSync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox() + [Before(HookType.Test)] + public void Setup() { _outboxProvider = new {{ OutboxProvider }}(); _outboxProvider.CreateStore(); @@ -49,8 +50,8 @@ public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox : IDispos _messageFactory = new {{ MessageFactory }}(); } - [Fact] - public void When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_Multiple_Messages_They_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -75,12 +76,13 @@ public class WhenDeletingMultipleMessagesTheyShouldBeRemovedFromOutbox : IDispos .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(secondMessage.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(thirdMessage.Id); } - public void Dispose() + [After(HookType.Test)] + public void Cleanup() { _outboxProvider.DeleteStore(_createdMessages); } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs.liquid index 44218e6785..3493727193 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox.cs.liquid @@ -27,21 +27,22 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Sync; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenDeletingOneMessageItShouldBeRemovedFromOutbox : IDisposable +[Category("{{Category}}")]{% endif %} +public class WhenDeletingOneMessageItShouldBeRemovedFromOutbox { - private readonly IAmAnOutboxProviderSync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderSync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenDeletingOneMessageItShouldBeRemovedFromOutbox() + [Before(HookType.Test)] + public void Setup() { _outboxProvider = new {{ OutboxProvider }}(); _outboxProvider.CreateStore(); @@ -49,8 +50,8 @@ public class WhenDeletingOneMessageItShouldBeRemovedFromOutbox : IDisposable _messageFactory = new {{ MessageFactory }}(); } - [Fact] - public void When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() + [Test] + public async Task When_Deleting_One_Message_It_Should_Be_Removed_From_Outbox() { // Arrange var context = new RequestContext(); @@ -75,12 +76,13 @@ public class WhenDeletingOneMessageItShouldBeRemovedFromOutbox : IDisposable .OutstandingMessages(TimeSpan.Zero, context) .ToArray(); - Assert.DoesNotContain(firstMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(secondMessage.Id, messages.Select(x => x.Id)); - Assert.Contains(thirdMessage.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(firstMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(secondMessage.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(thirdMessage.Id); } - public void Dispose() + [After(HookType.Test)] + public void Cleanup() { _outboxProvider.DeleteStore(_createdMessages); } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs.liquid index 9a337137f6..3bc2af60fe 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message.cs.liquid @@ -27,21 +27,22 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Sync; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage : IDisposable +[Category("{{Category}}")]{% endif %} +public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage { - private readonly IAmAnOutboxProviderSync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderSync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage() + [Before(HookType.Test)] + public void Setup() { _outboxProvider = new {{ OutboxProvider }}(); _outboxProvider.CreateStore(); @@ -49,8 +50,8 @@ public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage : IDispos _messageFactory = new {{ MessageFactory }}(); } - [Fact] - public void When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() + [Test] + public async Task When_Retrieving_A_Message_By_Id_It_Should_Return_The_Correct_Message() { // Arrange var context = new RequestContext(); @@ -71,42 +72,43 @@ public class WhenRetrievingAMessageByIdItShouldReturnTheCorrectMessage : IDispos var message = outbox.Get(dispatched.Id, context); // Assert - Assert.NotNull(message); - Assert.Equal(message.Body.Value, dispatched.Body.Value); + await Assert.That(message).IsNotNull(); + await Assert.That(dispatched.Body.Value).IsEqualTo(message.Body.Value); //should read the header from the sql outbox - Assert.Equal(message.Header.Topic, dispatched.Header.Topic); - Assert.Equal(message.Header.MessageType, dispatched.Header.MessageType); - Assert.Equal(message.Header.TimeStamp, dispatched.Header.TimeStamp, TimeSpan.FromSeconds(1)); - Assert.Equal(0, dispatched.Header.HandledCount); // -- should be zero when read from outbox - // Assert.Equal(TimeSpan.Zero, dispatched.Header.Delayed); // -- should be zero when read from outbox - Assert.Equal(message.Header.CorrelationId, dispatched.Header.CorrelationId); - Assert.Equal(message.Header.ReplyTo, dispatched.Header.ReplyTo); - Assert.StartsWith(message.Header.ContentType.MediaType, dispatched.Header.ContentType.ToString()); - Assert.Equal(message.Header.PartitionKey, dispatched.Header.PartitionKey); + await Assert.That(dispatched.Header.Topic.ToString()).IsEqualTo(message.Header.Topic.ToString()); + await Assert.That(dispatched.Header.MessageType).IsEqualTo(message.Header.MessageType); + await Assert.That(dispatched.Header.TimeStamp).IsBetween(message.Header.TimeStamp.AddSeconds(-1), message.Header.TimeStamp.AddSeconds(1)); + await Assert.That(dispatched.Header.HandledCount).IsEqualTo(0); // -- should be zero when read from outbox + // await Assert.That(dispatched.Header.Delayed).IsEqualTo(TimeSpan.Zero); // -- should be zero when read from outbox + await Assert.That(dispatched.Header.CorrelationId.ToString()).IsEqualTo(message.Header.CorrelationId.ToString()); + await Assert.That(dispatched.Header.ReplyTo.ToString()).IsEqualTo(message.Header.ReplyTo.ToString()); + await Assert.That(dispatched.Header.ContentType.ToString()).StartsWith(message.Header.ContentType.MediaType); + await Assert.That(dispatched.Header.PartitionKey.ToString()).IsEqualTo(message.Header.PartitionKey.ToString()); //Bag serialization - Assert.Equal(message.Header.Bag.Count, dispatched.Header.Bag.Count); + await Assert.That(dispatched.Header.Bag.Count).IsEqualTo(message.Header.Bag.Count); foreach (var (key, val) in message.Header.Bag) { - Assert.Contains(key, dispatched.Header.Bag); - Assert.Equal(val.ToString(), dispatched.Header.Bag[key].ToString()); + await Assert.That(dispatched.Header.Bag.ContainsKey(key)).IsTrue(); + await Assert.That(dispatched.Header.Bag[key].ToString()).IsEqualTo(val.ToString()); } //Asserts for workflow properties - Assert.Equal(message.Header.WorkflowId, dispatched.Header.WorkflowId); - Assert.Equal(message.Header.JobId, dispatched.Header.JobId); + await Assert.That(dispatched.Header.WorkflowId).IsEqualTo(message.Header.WorkflowId); + await Assert.That(dispatched.Header.JobId).IsEqualTo(message.Header.JobId); // new fields assertions - Assert.Equal(message.Header.Source, dispatched.Header.Source); - Assert.Equal(message.Header.Type, dispatched.Header.Type); - Assert.Equal(message.Header.DataSchema, dispatched.Header.DataSchema); - Assert.Equal(message.Header.Subject, dispatched.Header.Subject); - Assert.Equal(message.Header.TraceParent, dispatched.Header.TraceParent); - Assert.Equal(message.Header.TraceState, dispatched.Header.TraceState); + await Assert.That(dispatched.Header.Source).IsEqualTo(message.Header.Source); + await Assert.That(dispatched.Header.Type.ToString()).IsEqualTo(message.Header.Type.ToString()); + await Assert.That(dispatched.Header.DataSchema).IsEqualTo(message.Header.DataSchema); + await Assert.That(dispatched.Header.Subject).IsEqualTo(message.Header.Subject); + await Assert.That(dispatched.Header.TraceParent).IsEqualTo(message.Header.TraceParent); + await Assert.That(dispatched.Header.TraceState.ToString()).IsEqualTo(message.Header.TraceState.ToString()); } - public void Dispose() + [After(HookType.Test)] + public void Cleanup() { _outboxProvider.DeleteStore(_createdMessages); } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs.liquid index 1a05099074..89dca8cdab 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message.cs.liquid @@ -27,21 +27,22 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Sync; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage : IDisposable +[Category("{{Category}}")]{% endif %} +public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage { - private readonly IAmAnOutboxProviderSync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderSync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage() + [Before(HookType.Test)] + public void Setup() { _outboxProvider = new {{ OutboxProvider }}(); _outboxProvider.CreateStore(); @@ -49,8 +50,8 @@ public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage : IDisp _messageFactory = new {{ MessageFactory }}(); } - [Fact] - public void When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() + [Test] + public async Task When_Retrieving_A_Non_Existent_Message_It_Should_Return_Empty_Message() { // Arrange var context = new RequestContext(); @@ -61,10 +62,11 @@ public class WhenRetrievingANonExistentMessageItShouldReturnEmptyMessage : IDisp var message = outbox.Get(Id.Random(), context); // Assert - Assert.Equal(MessageType.MT_NONE, message.Header.MessageType); + await Assert.That(message.Header.MessageType).IsEqualTo(MessageType.MT_NONE); } - public void Dispose() + [After(HookType.Test)] + public void Cleanup() { _outboxProvider.DeleteStore(_createdMessages); } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs.liquid index c234f8d5d5..8478351ec1 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched.cs.liquid @@ -27,21 +27,22 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Sync; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched : IDisposable +[Category("{{Category}}")]{% endif %} +public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched { - private readonly IAmAnOutboxProviderSync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderSync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched() + [Before(HookType.Test)] + public void Setup() { _outboxProvider = new {{ OutboxProvider }}(); _outboxProvider.CreateStore(); @@ -49,8 +50,8 @@ public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched _messageFactory = new {{ MessageFactory }}(); } - [Fact] - public void When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() + [Test] + public async Task When_Retrieving_All_Messages_They_Should_Include_Dispatched_And_Undispatched() { // Arrange var context = new RequestContext(); @@ -71,13 +72,14 @@ public class WhenRetrievingAllMessagesTheyShouldIncludeDispatchedAndUndispatched var messages = _outboxProvider.GetAllMessages().ToArray(); // Assert - Assert.True(messages.Length >= 3, "Expecting at least 3 messages"); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.Contains(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length >= 3).IsTrue(); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } - public void Dispose() + [After(HookType.Test)] + public void Cleanup() { _outboxProvider.DeleteStore(_createdMessages); } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs.liquid index 7a69e26381..d131edc3d5 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age.cs.liquid @@ -27,21 +27,22 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Sync; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenRetrievingDispatchedMessagesItShouldFilterByAge : IDisposable +[Category("{{Category}}")]{% endif %} +public class WhenRetrievingDispatchedMessagesItShouldFilterByAge { - private readonly IAmAnOutboxProviderSync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderSync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenRetrievingDispatchedMessagesItShouldFilterByAge() + [Before(HookType.Test)] + public void Setup() { _outboxProvider = new {{ OutboxProvider }}(); _outboxProvider.CreateStore(); @@ -49,8 +50,8 @@ public class WhenRetrievingDispatchedMessagesItShouldFilterByAge : IDisposable _messageFactory = new {{ MessageFactory }}(); } - [Fact] - public void When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Dispatched_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -73,22 +74,23 @@ public class WhenRetrievingDispatchedMessagesItShouldFilterByAge : IDisposable var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } - public void Dispose() + [After(HookType.Test)] + public void Cleanup() { _outboxProvider.DeleteStore(_createdMessages); } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs.liquid index 27baccab65..1fab981b1f 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages.cs.liquid @@ -27,21 +27,22 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Sync; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages : IDisposable +[Category("{{Category}}")]{% endif %} +public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages { - private readonly IAmAnOutboxProviderSync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderSync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages() + [Before(HookType.Test)] + public void Setup() { _outboxProvider = new {{ OutboxProvider }}(); _outboxProvider.CreateStore(); @@ -49,8 +50,8 @@ public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages : ID _messageFactory = new {{ MessageFactory }}(); } - [Fact] - public void When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() + [Test] + public async Task When_Retrieving_Messages_By_Ids_It_Should_Return_Only_Requested_Messages() { // Arrange var context = new RequestContext(); @@ -73,13 +74,14 @@ public class WhenRetrievingMessagesByIdsItShouldReturnOnlyRequestedMessages : ID .ToArray(); // Assert - Assert.Equal(2, messages.Length); - Assert.Contains(earliest.Id, messages.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messages.Select(x => x.Id)); - Assert.Contains(undispatched.Id, messages.Select(x => x.Id)); + await Assert.That(messages.Length).IsEqualTo(2); + await Assert.That(messages.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messages.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messages.Select(x => x.Id)).Contains(undispatched.Id); } - public void Dispose() + [After(HookType.Test)] + public void Cleanup() { _outboxProvider.DeleteStore(_createdMessages); } diff --git a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs.liquid b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs.liquid index 2d7d5340f6..4389b017d7 100644 --- a/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs.liquid +++ b/tools/Paramore.Brighter.Test.Generator/Templates/Outbox/Sync/When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age.cs.liquid @@ -27,21 +27,22 @@ THE SOFTWARE. */ // This file is auto-generated by Paramore.Brighter.Test.Generator // -using Xunit; using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; namespace {{ Namespace }}.Outbox{{ Prefix }}.Sync; {% if Category != null %} -[Trait("Category", "{{Category}}")]{% endif %} -public class WhenRetrievingOutstandingMessagesItShouldFilterByAge : IDisposable +[Category("{{Category}}")]{% endif %} +public class WhenRetrievingOutstandingMessagesItShouldFilterByAge { - private readonly IAmAnOutboxProviderSync _outboxProvider; - private readonly IAmAMessageFactory _messageFactory; + private IAmAnOutboxProviderSync _outboxProvider; + private IAmAMessageFactory _messageFactory; private List _createdMessages = []; - public WhenRetrievingOutstandingMessagesItShouldFilterByAge() + [Before(HookType.Test)] + public void Setup() { _outboxProvider = new {{ OutboxProvider }}(); _outboxProvider.CreateStore(); @@ -49,8 +50,8 @@ public class WhenRetrievingOutstandingMessagesItShouldFilterByAge : IDisposable _messageFactory = new {{ MessageFactory }}(); } - [Fact] - public void When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() + [Test] + public async Task When_Retrieving_Outstanding_Messages_It_Should_Filter_By_Age() { // Arrange var context = new RequestContext(); @@ -73,22 +74,23 @@ public class WhenRetrievingOutstandingMessagesItShouldFilterByAge : IDisposable var messagesOver4Hours = outbox.DispatchedMessages(TimeSpan.FromHours(4), context).ToArray(); // Assert - Assert.True(allDispatched.Length >= 2, "Expecting at least 2 messages"); - Assert.Contains(earliest.Id, allDispatched.Select(x => x.Id)); - Assert.Contains(dispatched.Id, allDispatched.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, allDispatched.Select(x => x.Id)); + await Assert.That(allDispatched.Length >= 2).IsTrue(); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(allDispatched.Select(x => x.Id)).Contains(dispatched.Id); + await Assert.That(allDispatched.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.True(messagesOverAnHour.Length >= 1, "Expecting at least 1 message"); - Assert.Contains(earliest.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOverAnHour.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOverAnHour.Select(x => x.Id)); + await Assert.That(messagesOverAnHour.Length >= 1).IsTrue(); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).Contains(earliest.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOverAnHour.Select(x => x.Id)).DoesNotContain(undispatched.Id); - Assert.DoesNotContain(earliest.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(dispatched.Id, messagesOver4Hours.Select(x => x.Id)); - Assert.DoesNotContain(undispatched.Id, messagesOver4Hours.Select(x => x.Id)); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(earliest.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(dispatched.Id); + await Assert.That(messagesOver4Hours.Select(x => x.Id)).DoesNotContain(undispatched.Id); } - public void Dispose() + [After(HookType.Test)] + public void Cleanup() { _outboxProvider.DeleteStore(_createdMessages); }