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());