public async Task Saga_audit_trail_should_contain_the_state_change() { SagaHistory sagaHistory = null; var context = await Define <MyContext>() .WithEndpoint <SagaEndpoint>(b => b.When((bus, c) => bus.SendLocal(new StartSagaMessage { Id = "Id" }))) .Done(async c => { var result = await this.TryGet <SagaHistory>($"/api/sagas/{c.SagaId}", sh => sh.Changes.Any(change => change.Status == SagaStateChangeStatus.Updated)); sagaHistory = result; return(c.ReceivedTimeoutMessage && result); }) .Run(); Assert.NotNull(sagaHistory); Assert.AreEqual(context.SagaId, sagaHistory.SagaId); Assert.AreEqual(typeof(MySaga).FullName, sagaHistory.SagaType); var updateChange = sagaHistory.Changes.Single(x => x.Status == SagaStateChangeStatus.Updated); Assert.AreEqual(typeof(TimeoutMessage).FullName, updateChange.InitiatingMessage.MessageType); }
public async Task Saga_audit_trail_should_contain_the_state_change() { var context = new MyContext(); SagaHistory sagaHistory = null; await Define(context) .WithEndpoint <EndpointThatIsHostingTheSaga>(b => b.Given((bus, c) => bus.SendLocal(new StartSagaMessage()))) .Done(async c => { var result = await TryGet <SagaHistory>($"/api/sagas/{c.SagaId}"); sagaHistory = result; return(c.InitiatingMessageReceived && result); }) .Run(); Assert.NotNull(sagaHistory); Assert.AreEqual(context.SagaId, sagaHistory.SagaId); Assert.AreEqual(typeof(MySaga).FullName, sagaHistory.SagaType); var change = sagaHistory.Changes.Single(); Assert.AreEqual(SagaStateChangeStatus.New, change.Status); Assert.AreEqual(typeof(StartSagaMessage).FullName, change.InitiatingMessage.MessageType); }
public async Task Saga_history_can_be_fetched_from_main_instance() { SagaHistory sagaHistory = null; var context = await Define <MyContext>() .WithEndpoint <SagaEndpoint>(b => b.When((bus, c) => bus.SendLocal(new MessageInitiatingSaga { Id = "Id" }))) .Done(async c => { if (!c.SagaId.HasValue) { return(false); } var result = await this.TryGet <SagaHistory>($"/api/sagas/{c.SagaId}", instanceName: ServiceControlAuditInstanceName); sagaHistory = result; return(result); }) .Run(); Assert.NotNull(sagaHistory); Assert.AreEqual(context.SagaId, sagaHistory.SagaId); Assert.AreEqual(typeof(SagaEndpoint.MySaga).FullName, sagaHistory.SagaType); var sagaStateChange = sagaHistory.Changes.First(); Assert.AreEqual("Send", sagaStateChange.InitiatingMessage.Intent); }
public void All_outgoing_message_intents_should_be_captured() { var context = new MyContext(); SagaHistory sagaHistory = null; Define(context) .WithEndpoint <EndpointThatIsHostingTheSaga>(b => b.Given((bus, c) => bus.SendLocal(new MessageInitiatingSaga()))) .Done(c => c.Done && TryGet("/api/sagas/" + c.SagaId, out sagaHistory)) .Run(TimeSpan.FromSeconds(40)); Assert.NotNull(sagaHistory); Assert.AreEqual(context.SagaId, sagaHistory.SagaId); Assert.AreEqual(typeof(EndpointThatIsHostingTheSaga.MySaga).FullName, sagaHistory.SagaType); var sagaStateChange = sagaHistory.Changes.First(); Assert.AreEqual("Send", sagaStateChange.InitiatingMessage.Intent); var outgoingIntents = new Dictionary <string, string>(); foreach (var message in sagaStateChange.OutgoingMessages) { outgoingIntents[message.MessageType] = message.Intent; } Assert.AreEqual("Send", outgoingIntents[typeof(MessageReplyBySaga).FullName]); Assert.AreEqual("Send", outgoingIntents[typeof(MessageReplyToOriginatorBySaga).FullName]); Assert.AreEqual("Send", outgoingIntents[typeof(MessageSentBySaga).FullName]); Assert.AreEqual("Publish", outgoingIntents[typeof(MessagePublishedBySaga).FullName]); }
public async Task Should_capture_all_outgoing_message_intents() { SagaHistory sagaHistory = null; var context = await Define <MyContext>() .WithEndpoint <SagaEndpoint>(b => b.When(async(bus, c) => { await bus.SendLocal(new MessageInitiatingSaga { Id = "Id" }); })) .Done(async c => { if (!c.SagaId.HasValue) { return(false); } var result = await this.TryGet <SagaHistory>($"/api/sagas/{c.SagaId}"); sagaHistory = result; return(result); }) .Run(); Assert.NotNull(sagaHistory); Assert.AreEqual(context.SagaId, sagaHistory.SagaId); Assert.AreEqual(typeof(SagaEndpoint.MySaga).FullName, sagaHistory.SagaType); var sagaStateChange = sagaHistory.Changes.First(); Assert.AreEqual("Send", sagaStateChange.InitiatingMessage.Intent); var outgoingIntents = new Dictionary <string, string>(); foreach (var message in sagaStateChange.OutgoingMessages) { Trace.WriteLine($"{message.MessageType} - {message.Intent}"); outgoingIntents[message.MessageType] = message.Intent; } Assert.AreEqual("Reply", outgoingIntents[typeof(MessageReplyBySaga).FullName], "MessageReplyBySaga was not present"); Assert.AreEqual("Reply", outgoingIntents[typeof(MessageReplyToOriginatorBySaga).FullName], "MessageReplyToOriginatorBySaga was not present"); Assert.AreEqual("Send", outgoingIntents[typeof(MessageSentBySaga).FullName], "MessageSentBySaga was not present"); Assert.AreEqual("Publish", outgoingIntents[typeof(MessagePublishedBySaga).FullName], "MessagePublishedBySaga was not present"); }
public void Saga_audit_trail_should_contain_the_state_change() { var context = new MyContext(); SagaHistory sagaHistory = null; Define(context) .WithEndpoint <EndpointThatIsHostingTheSaga>(b => b.Given((bus, c) => bus.SendLocal(new StartSagaMessage()))) .Done(c => c.InitiatingMessageReceived && TryGet("/api/sagas/" + c.SagaId, out sagaHistory)) .Run(); Assert.NotNull(sagaHistory); Assert.AreEqual(context.SagaId, sagaHistory.SagaId); Assert.AreEqual(typeof(MySaga).FullName, sagaHistory.SagaType); var change = sagaHistory.Changes.Single(); Assert.AreEqual(SagaStateChangeStatus.New, change.Status); Assert.AreEqual(typeof(StartSagaMessage).FullName, change.InitiatingMessage.MessageType); }
public void Saga_audit_trail_should_contain_the_state_change() { var context = new MyContext(); SagaHistory sagaHistory = null; Scenario.Define(context) .WithEndpoint <ManagementEndpoint>(c => c.AppConfig(PathToAppConfig)) .WithEndpoint <EndpointThatIsHostingTheSaga>(b => b.Given((bus, c) => bus.SendLocal(new StartSagaMessage()))) .Done(c => c.ReceivedTimeoutMessage && TryGet("/api/sagas/" + c.SagaId, out sagaHistory, sh => sh.Changes.Any(change => change.Status == SagaStateChangeStatus.Updated))) .Run(); Assert.NotNull(sagaHistory); Assert.AreEqual(context.SagaId, sagaHistory.SagaId); Assert.AreEqual(typeof(MySaga).FullName, sagaHistory.SagaType); var updateChange = sagaHistory.Changes.Single(x => x.Status == SagaStateChangeStatus.Updated); Assert.AreEqual(typeof(TimeoutMessage).FullName, updateChange.InitiatingMessage.MessageType); }
public async Task Saga_history_can_be_fetched_on_master() { SetInstanceSettings = ConfigureRemoteInstanceForMasterAsWellAsAuditAndErrorQueues; SagaHistory sagaHistory = null; var context = await Define <MyContext>(Remote1, Master) .WithEndpoint <EndpointThatIsHostingTheSaga>(b => b.When((bus, c) => bus.SendLocal(new MessageInitiatingSaga { Id = "Id" }))) .Done(async c => { var result = await this.TryGet <SagaHistory>($"/api/sagas/{c.SagaId}", instanceName: Master); sagaHistory = result; return(c.Done && result); }) .Run(); Assert.NotNull(sagaHistory); Assert.AreEqual(context.SagaId, sagaHistory.SagaId); Assert.AreEqual(typeof(EndpointThatIsHostingTheSaga.MySaga).FullName, sagaHistory.SagaType); var sagaStateChange = sagaHistory.Changes.First(); Assert.AreEqual("Send", sagaStateChange.InitiatingMessage.Intent); var outgoingIntents = new Dictionary <string, string>(); foreach (var message in sagaStateChange.OutgoingMessages) { outgoingIntents[message.MessageType] = message.Intent; } Assert.AreEqual("Reply", outgoingIntents[typeof(MessageReplyBySaga).FullName]); Assert.AreEqual("Reply", outgoingIntents[typeof(MessageReplyToOriginatorBySaga).FullName]); Assert.AreEqual("Send", outgoingIntents[typeof(MessageSentBySaga).FullName]); Assert.AreEqual("Publish", outgoingIntents[typeof(MessagePublishedBySaga).FullName]); }
public async Task All_outgoing_message_intents_should_be_captured() { SagaHistory sagaHistory = null; var context = await Define <MyContext>() .WithEndpoint <EndpointThatIsHostingTheSaga>(b => b.When((bus, c) => bus.SendLocal(new MessageInitiatingSaga { Id = "Id" }))) .Done(async c => { var result = await this.TryGet <SagaHistory>($"/api/sagas/{c.SagaId}"); sagaHistory = result; return(c.Done && result); }) .Run(); Assert.NotNull(sagaHistory); Assert.AreEqual(context.SagaId, sagaHistory.SagaId); Assert.AreEqual(typeof(EndpointThatIsHostingTheSaga.MySaga).FullName, sagaHistory.SagaType); var sagaStateChange = sagaHistory.Changes.First(); Assert.AreEqual("Send", sagaStateChange.InitiatingMessage.Intent); var outgoingIntents = new Dictionary <string, string>(); foreach (var message in sagaStateChange.OutgoingMessages) { outgoingIntents[message.MessageType] = message.Intent; } Assert.AreEqual("Reply", outgoingIntents[typeof(MessageReplyBySaga).FullName]); Assert.AreEqual("Reply", outgoingIntents[typeof(MessageReplyToOriginatorBySaga).FullName]); Assert.AreEqual("Send", outgoingIntents[typeof(MessageSentBySaga).FullName]); Assert.AreEqual("Publish", outgoingIntents[typeof(MessagePublishedBySaga).FullName]); }
public SagaExecutionState() { History = new SagaHistory(); ExecutionID = ExecutionID.Empty(); }
public SagaExecutionState() { History = new SagaHistory(); ExecutionID = ExecutionID.Empty(); CanBeResumed = true; }