diff --git a/readme.md b/readme.md index 8b96a9b..8f49f4a 100644 --- a/readme.md +++ b/readme.md @@ -276,11 +276,20 @@ Will result in the following snapshot file. }, ElementId: Guid_3 } + ], + Created: [ + { + Saga: { + CorrelationId: Guid_3, + StartMessageReceived: true + }, + ElementId: Guid_3 + } ] } } ``` -snippet source | anchor +snippet source | anchor diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 6b9a2fb..351bbc2 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,7 +1,7 @@ - 2.2.0 + 2.3.0 1.0.0 preview MassTransit, Verify @@ -13,4 +13,4 @@ true true - \ No newline at end of file + diff --git a/src/Tests/ConsumerTests.cs b/src/Tests/ConsumerTests.cs index 5685a60..cfb46c9 100644 --- a/src/Tests/ConsumerTests.cs +++ b/src/Tests/ConsumerTests.cs @@ -89,4 +89,4 @@ public Task Consume(ConsumeContext context) => OrderId = context.Message.OrderId }); } -} \ No newline at end of file +} diff --git a/src/Tests/EmptySagaStateMachineTests.EmptyEventsAndStateChangesAreOmitted.verified.txt b/src/Tests/EmptySagaStateMachineTests.EmptyEventsAndStateChangesAreOmitted.verified.txt new file mode 100644 index 0000000..9e01621 --- /dev/null +++ b/src/Tests/EmptySagaStateMachineTests.EmptyEventsAndStateChangesAreOmitted.verified.txt @@ -0,0 +1,5 @@ +{ + Consumed: [], + Sagas: [], + Created: [] +} \ No newline at end of file diff --git a/src/Tests/EmptySagaStateMachineTests.cs b/src/Tests/EmptySagaStateMachineTests.cs new file mode 100644 index 0000000..97f828a --- /dev/null +++ b/src/Tests/EmptySagaStateMachineTests.cs @@ -0,0 +1,20 @@ +namespace Tests; + +public class EmptySagaStateMachineTests +{ + [Fact] + public async Task EmptyEventsAndStateChangesAreOmitted() + { + await using var provider = new ServiceCollection() + .AddMassTransitTestHarness(_ => + _.AddSagaStateMachine()) + .BuildServiceProvider(true); + var harness = provider.GetRequiredService(); + var sagaHarness = harness.GetSagaStateMachineHarness(); + + await harness.Start(); + + await Verify(sagaHarness) + .IgnoreMember("StateMachine"); + } +} diff --git a/src/Tests/SagaStateMachineTests.Run.verified.txt b/src/Tests/SagaStateMachineTests.Run.verified.txt index 9db8cd6..33ca5aa 100644 --- a/src/Tests/SagaStateMachineTests.Run.verified.txt +++ b/src/Tests/SagaStateMachineTests.Run.verified.txt @@ -53,6 +53,29 @@ ElementId: Guid_3 } ], + Events: [ + { + Event: StartEvent, + CorrelationId: Guid_3, + MessageType: SagaStateMachineTests.Start, + Message: { + CorrelationId: Guid_3 + } + } + ], + StateChanges: [ + { + Event: StartEvent, + CorrelationId: Guid_3, + CurrentState: Initial + }, + { + Event: StartEvent, + CorrelationId: Guid_3, + PreviousState: Initial, + CurrentState: Final + } + ], StateMachine: { StartEvent: { Name: StartEvent diff --git a/src/Tests/SagaTests.Run.verified.txt b/src/Tests/SagaTests.Run.verified.txt index c7e4c7a..9bdd200 100644 --- a/src/Tests/SagaTests.Run.verified.txt +++ b/src/Tests/SagaTests.Run.verified.txt @@ -41,6 +41,15 @@ }, ElementId: Guid_3 } + ], + Created: [ + { + Saga: { + CorrelationId: Guid_3, + StartMessageReceived: true + }, + ElementId: Guid_3 + } ] } } \ No newline at end of file diff --git a/src/Tests/SagaTests.cs b/src/Tests/SagaTests.cs index c17fe99..d079022 100644 --- a/src/Tests/SagaTests.cs +++ b/src/Tests/SagaTests.cs @@ -45,4 +45,4 @@ public class Start : CorrelatedBy public Guid CorrelationId { get; init; } } #endregion -} \ No newline at end of file +} diff --git a/src/Verify.MassTransit/ContextConverters/MessageContextConverter.cs b/src/Verify.MassTransit/ContextConverters/MessageContextConverter.cs index d98d3af..30cf0be 100644 --- a/src/Verify.MassTransit/ContextConverters/MessageContextConverter.cs +++ b/src/Verify.MassTransit/ContextConverters/MessageContextConverter.cs @@ -1,6 +1,4 @@ -using MassTransit; - -class MessageContextConverter : +class MessageContextConverter : WriteOnlyJsonConverter { public override void Write(VerifyJsonWriter writer, MessageContext context) diff --git a/src/Verify.MassTransit/ContextConverters/ReceiveContextConverter.cs b/src/Verify.MassTransit/ContextConverters/ReceiveContextConverter.cs index ec6ffdf..8e995ff 100644 --- a/src/Verify.MassTransit/ContextConverters/ReceiveContextConverter.cs +++ b/src/Verify.MassTransit/ContextConverters/ReceiveContextConverter.cs @@ -1,6 +1,4 @@ -using MassTransit; - -class ReceiveContextConverter : +class ReceiveContextConverter : WriteOnlyJsonConverter { public override void Write(VerifyJsonWriter writer, ReceiveContext context) diff --git a/src/Verify.MassTransit/ContextConverters/SendContextConverter.cs b/src/Verify.MassTransit/ContextConverters/SendContextConverter.cs index 8f9493c..dcf8d1d 100644 --- a/src/Verify.MassTransit/ContextConverters/SendContextConverter.cs +++ b/src/Verify.MassTransit/ContextConverters/SendContextConverter.cs @@ -1,6 +1,4 @@ -using MassTransit; - -class SendContextConverter : +class SendContextConverter : WriteOnlyJsonConverter { public override void Write(VerifyJsonWriter writer, SendContext context) diff --git a/src/Verify.MassTransit/ConverterHelpers.cs b/src/Verify.MassTransit/ConverterHelpers.cs index 3e13f02..4c56a6a 100644 --- a/src/Verify.MassTransit/ConverterHelpers.cs +++ b/src/Verify.MassTransit/ConverterHelpers.cs @@ -1,6 +1,4 @@ -using MassTransit; - -static class ConverterHelpers +static class ConverterHelpers { public static void WriteHeaders(this VerifyJsonWriter writer, object context, Headers headers) { @@ -22,4 +20,4 @@ public static void WriteHeaders(this VerifyJsonWriter writer, object context, He path = path.TrimStart('/'); return path; } -} \ No newline at end of file +} diff --git a/src/Verify.MassTransit/GlobalUsings.cs b/src/Verify.MassTransit/GlobalUsings.cs new file mode 100644 index 0000000..a66e1b5 --- /dev/null +++ b/src/Verify.MassTransit/GlobalUsings.cs @@ -0,0 +1,2 @@ +global using MassTransit; +global using MassTransit.Testing; diff --git a/src/Verify.MassTransit/MessageConverters/PublishedMessageConverter.cs b/src/Verify.MassTransit/MessageConverters/PublishedMessageConverter.cs index 1f9352f..27b6b42 100644 --- a/src/Verify.MassTransit/MessageConverters/PublishedMessageConverter.cs +++ b/src/Verify.MassTransit/MessageConverters/PublishedMessageConverter.cs @@ -1,6 +1,4 @@ -using MassTransit.Testing; - -class PublishedMessageConverter : +class PublishedMessageConverter : WriteOnlyJsonConverter { public override void Write(VerifyJsonWriter writer, IPublishedMessage message) diff --git a/src/Verify.MassTransit/MessageConverters/PublishedMessageListConverter.cs b/src/Verify.MassTransit/MessageConverters/PublishedMessageListConverter.cs index e9b1f23..ef1ecf8 100644 --- a/src/Verify.MassTransit/MessageConverters/PublishedMessageListConverter.cs +++ b/src/Verify.MassTransit/MessageConverters/PublishedMessageListConverter.cs @@ -1,6 +1,4 @@ -using MassTransit.Testing; - -class PublishedMessageListConverter : +class PublishedMessageListConverter : WriteOnlyJsonConverter { public override void Write(VerifyJsonWriter writer, IPublishedMessageList messages) diff --git a/src/Verify.MassTransit/MessageConverters/ReceivedMessageConverter.cs b/src/Verify.MassTransit/MessageConverters/ReceivedMessageConverter.cs index 0753881..22ffa44 100644 --- a/src/Verify.MassTransit/MessageConverters/ReceivedMessageConverter.cs +++ b/src/Verify.MassTransit/MessageConverters/ReceivedMessageConverter.cs @@ -1,6 +1,4 @@ -using MassTransit.Testing; - -class ReceivedMessageConverter : +class ReceivedMessageConverter : WriteOnlyJsonConverter { public override void Write(VerifyJsonWriter writer, IReceivedMessage message) diff --git a/src/Verify.MassTransit/MessageConverters/ReceivedMessageListConverter.cs b/src/Verify.MassTransit/MessageConverters/ReceivedMessageListConverter.cs index acac1ec..2a6064c 100644 --- a/src/Verify.MassTransit/MessageConverters/ReceivedMessageListConverter.cs +++ b/src/Verify.MassTransit/MessageConverters/ReceivedMessageListConverter.cs @@ -1,6 +1,4 @@ -using MassTransit.Testing; - -class ReceivedMessageListConverter : +class ReceivedMessageListConverter : WriteOnlyJsonConverter { public override void Write(VerifyJsonWriter writer, IReceivedMessageList messages) diff --git a/src/Verify.MassTransit/MessageConverters/SentMessageConverter.cs b/src/Verify.MassTransit/MessageConverters/SentMessageConverter.cs index f11eed8..457db7b 100644 --- a/src/Verify.MassTransit/MessageConverters/SentMessageConverter.cs +++ b/src/Verify.MassTransit/MessageConverters/SentMessageConverter.cs @@ -1,6 +1,4 @@ -using MassTransit.Testing; - -class SentMessageConverter : +class SentMessageConverter : WriteOnlyJsonConverter { public override void Write(VerifyJsonWriter writer, ISentMessage message) diff --git a/src/Verify.MassTransit/MessageConverters/SentMessageListConverter.cs b/src/Verify.MassTransit/MessageConverters/SentMessageListConverter.cs index 909e7c6..a0e8122 100644 --- a/src/Verify.MassTransit/MessageConverters/SentMessageListConverter.cs +++ b/src/Verify.MassTransit/MessageConverters/SentMessageListConverter.cs @@ -1,6 +1,4 @@ -using MassTransit.Testing; - -class SentMessageListConverter : +class SentMessageListConverter : WriteOnlyJsonConverter { public override void Write(VerifyJsonWriter writer, ISentMessageList messages) diff --git a/src/Verify.MassTransit/SagaConverters/ReceivedEventConverter.cs b/src/Verify.MassTransit/SagaConverters/ReceivedEventConverter.cs new file mode 100644 index 0000000..1e78f8d --- /dev/null +++ b/src/Verify.MassTransit/SagaConverters/ReceivedEventConverter.cs @@ -0,0 +1,13 @@ +class ReceivedEventConverter : + WriteOnlyJsonConverter +{ + public override void Write(VerifyJsonWriter writer, IReceivedEvent received) + { + writer.WriteStartObject(); + writer.WriteMember(received, received.Event.Name, "Event"); + writer.WriteMember(received, received.CorrelationId, "CorrelationId"); + writer.WriteMember(received, received.MessageType, "MessageType"); + writer.WriteMember(received, received.MessageObject, "Message"); + writer.WriteEndObject(); + } +} diff --git a/src/Verify.MassTransit/SagaConverters/ReceivedEventListConverter.cs b/src/Verify.MassTransit/SagaConverters/ReceivedEventListConverter.cs new file mode 100644 index 0000000..4309591 --- /dev/null +++ b/src/Verify.MassTransit/SagaConverters/ReceivedEventListConverter.cs @@ -0,0 +1,14 @@ +class ReceivedEventListConverter : + WriteOnlyJsonConverter +{ + public override void Write(VerifyJsonWriter writer, IReceivedEventList events) + { + writer.WriteStartArray(); + foreach (var received in events.Select(_ => true)) + { + writer.Serialize(received); + } + + writer.WriteEndArray(); + } +} diff --git a/src/Verify.MassTransit/SagaConverters/SagaListConverter.cs b/src/Verify.MassTransit/SagaConverters/SagaListConverter.cs index e6e10ae..bd58f4a 100644 --- a/src/Verify.MassTransit/SagaConverters/SagaListConverter.cs +++ b/src/Verify.MassTransit/SagaConverters/SagaListConverter.cs @@ -1,6 +1,4 @@ -using MassTransit; -using MassTransit.Testing; -using MassTransit.Testing.Implementations; +using MassTransit.Testing.Implementations; class SagaListConverter : WriteOnlyJsonConverter diff --git a/src/Verify.MassTransit/SagaConverters/SagaStateMachineTestHarnessConverter.cs b/src/Verify.MassTransit/SagaConverters/SagaStateMachineTestHarnessConverter.cs new file mode 100644 index 0000000..a48425d --- /dev/null +++ b/src/Verify.MassTransit/SagaConverters/SagaStateMachineTestHarnessConverter.cs @@ -0,0 +1,38 @@ +class SagaStateMachineTestHarnessConverter : + WriteOnlyJsonConverter +{ + public override void Write(VerifyJsonWriter writer, object harness) + { + var type = harness.GetType(); + writer.WriteStartObject(); + WriteMember(writer, harness, type, "Consumed"); + WriteMember(writer, harness, type, "Sagas"); + WriteMember(writer, harness, type, "Created"); + + var events = (IReceivedEventList) Value(harness, type, "Events")!; + if (events.Select(_ => true).Any()) + { + writer.WriteMember(harness, events, "Events"); + } + + var stateChanges = (IStateChangeList) Value(harness, type, "StateChanges")!; + if (stateChanges.Select(_ => true).Any()) + { + writer.WriteMember(harness, stateChanges, "StateChanges"); + } + + WriteMember(writer, harness, type, "StateMachine"); + writer.WriteEndObject(); + } + + static void WriteMember(VerifyJsonWriter writer, object harness, Type type, string name) => + writer.WriteMember(harness, Value(harness, type, name), name); + + static object? Value(object harness, Type type, string name) => + type.GetProperty(name)!.GetValue(harness); + + public override bool CanConvert(Type type) => + type.GetInterfaces() + .Any(_ => _.IsGenericType && + _.GetGenericTypeDefinition() == typeof(ISagaStateMachineTestHarness<,>)); +} diff --git a/src/Verify.MassTransit/SagaConverters/SagaTestHarnessConverter.cs b/src/Verify.MassTransit/SagaConverters/SagaTestHarnessConverter.cs index c97816b..b7cb02e 100644 --- a/src/Verify.MassTransit/SagaConverters/SagaTestHarnessConverter.cs +++ b/src/Verify.MassTransit/SagaConverters/SagaTestHarnessConverter.cs @@ -1,7 +1,4 @@ -using MassTransit; -using MassTransit.Testing; - -class SagaTestHarnessConverter : +class SagaTestHarnessConverter : WriteOnlyJsonConverter { static MethodInfo innerWriteDef; @@ -24,6 +21,7 @@ static void InnerWrite(VerifyJsonWriter writer, SagaTestHarness harness) { writer.WriteMember(harness, harness.Consumed, "Consumed"); writer.WriteMember(harness, harness.Sagas, "Sagas"); + writer.WriteMember(harness, harness.Created, "Created"); } public override bool CanConvert(Type type) => diff --git a/src/Verify.MassTransit/SagaConverters/StateChangeConverter.cs b/src/Verify.MassTransit/SagaConverters/StateChangeConverter.cs new file mode 100644 index 0000000..45f3d2a --- /dev/null +++ b/src/Verify.MassTransit/SagaConverters/StateChangeConverter.cs @@ -0,0 +1,13 @@ +class StateChangeConverter : + WriteOnlyJsonConverter +{ + public override void Write(VerifyJsonWriter writer, IStateChange change) + { + writer.WriteStartObject(); + writer.WriteMember(change, change.Event?.Name, "Event"); + writer.WriteMember(change, change.CorrelationId, "CorrelationId"); + writer.WriteMember(change, change.PreviousState?.Name, "PreviousState"); + writer.WriteMember(change, change.CurrentState?.Name, "CurrentState"); + writer.WriteEndObject(); + } +} diff --git a/src/Verify.MassTransit/SagaConverters/StateChangeListConverter.cs b/src/Verify.MassTransit/SagaConverters/StateChangeListConverter.cs new file mode 100644 index 0000000..d992ccb --- /dev/null +++ b/src/Verify.MassTransit/SagaConverters/StateChangeListConverter.cs @@ -0,0 +1,14 @@ +class StateChangeListConverter : + WriteOnlyJsonConverter +{ + public override void Write(VerifyJsonWriter writer, IStateChangeList changes) + { + writer.WriteStartArray(); + foreach (var change in changes.Select(_ => true)) + { + writer.Serialize(change); + } + + writer.WriteEndArray(); + } +} diff --git a/src/Verify.MassTransit/TestHarnessConverters/ConsumerTestHarnessConverter.cs b/src/Verify.MassTransit/TestHarnessConverters/ConsumerTestHarnessConverter.cs index deea16a..e98ffc9 100644 --- a/src/Verify.MassTransit/TestHarnessConverters/ConsumerTestHarnessConverter.cs +++ b/src/Verify.MassTransit/TestHarnessConverters/ConsumerTestHarnessConverter.cs @@ -1,6 +1,4 @@ -using MassTransit.Testing; - -class ConsumerTestHarnessConverter : +class ConsumerTestHarnessConverter : WriteOnlyJsonConverter { public override void Write(VerifyJsonWriter writer, object harness) @@ -13,4 +11,4 @@ public override void Write(VerifyJsonWriter writer, object harness) public override bool CanConvert(Type type) => type.CanConvertToGeneric(typeof(ConsumerTestHarness<>)); -} \ No newline at end of file +} diff --git a/src/Verify.MassTransit/TestHarnessConverters/TestHarnessConverter.cs b/src/Verify.MassTransit/TestHarnessConverters/TestHarnessConverter.cs index 5cb202e..ba49e9f 100644 --- a/src/Verify.MassTransit/TestHarnessConverters/TestHarnessConverter.cs +++ b/src/Verify.MassTransit/TestHarnessConverters/TestHarnessConverter.cs @@ -1,6 +1,4 @@ -using MassTransit.Testing; - -class TestHarnessConverter : +class TestHarnessConverter : WriteOnlyJsonConverter { public override void Write(VerifyJsonWriter writer, IBaseTestHarness harness) diff --git a/src/Verify.MassTransit/VerifyMassTransit.cs b/src/Verify.MassTransit/VerifyMassTransit.cs index cf02cec..139e7b4 100644 --- a/src/Verify.MassTransit/VerifyMassTransit.cs +++ b/src/Verify.MassTransit/VerifyMassTransit.cs @@ -25,8 +25,13 @@ public static void Initialize() converters.Add(new SentMessageListConverter()); converters.Add(new PublishedMessageConverter()); converters.Add(new PublishedMessageListConverter()); + converters.Add(new SagaStateMachineTestHarnessConverter()); converters.Add(new SagaTestHarnessConverter()); converters.Add(new SagaListConverter()); + converters.Add(new ReceivedEventConverter()); + converters.Add(new ReceivedEventListConverter()); + converters.Add(new StateChangeConverter()); + converters.Add(new StateChangeListConverter()); converters.Add(new MessageContextConverter()); converters.Add(new SendContextConverter()); converters.Add(new ReceiveContextConverter());