public void When_publishing_start_message()
        {
            var gotTiredEvent         = new GotTiredEvent(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString());
            var gotTiredEventMetadata = MessageMetadata.New(gotTiredEvent.SourceId, Guid.NewGuid().ToString(), Guid.NewGuid().ToString());

            Node.Pipe.ProcessesPipeActor.Tell(new Initialize(TestActor));
            Node.Pipe.ProcessesPipeActor.Tell(new MessageMetadataEnvelop <DomainEvent>(gotTiredEvent,
                                                                                       gotTiredEventMetadata));

            var answer  = FishForMessage <MessageMetadataEnvelop>(m => true, TimeSpan.FromSeconds(5));
            var command = answer.Message as MakeCoffeCommand;

            //Result_contains_metadata()
            Assert.NotNull(answer.Metadata);
            //Result_contains_message()
            Assert.NotNull(answer.Message);
            //Result_message_has_expected_type()
            Assert.IsAssignableFrom <MakeCoffeCommand>(answer.Message);
            //Result_message_has_expected_value()
            Assert.Equal(gotTiredEvent.PersonId, command.PersonId);
            //Result_metadata_has_command_id_as_casuation_id()
            Assert.Equal(gotTiredEvent.SourceId, answer.Metadata.CasuationId);
            //Result_metadata_has_correlation_id_same_as_command_metadata()
            Assert.Equal(gotTiredEventMetadata.CorrelationId, answer.Metadata.CorrelationId);
            //Result_metadata_has_processed_history_filled_from_aggregate()
            //Assert.Equal(1, answer.Metadata.History?.Steps.Count);
            //Result_metadata_has_processed_correct_filled_history_step()
            //var step = answer.Metadata.History.Steps.First();
            //var name = AggregateActorName.New<SoftwareProgrammingState>(command.ProcessId);
            //
            //Assert.Equal(name.Name, step.Who);
            //Assert.Equal(ProcessManagerActorConstants.ProcessProducedACommand, step.Why);
            //Assert.Equal(ProcessManagerActorConstants.PublishingCommand, step.What);
        }
        public async Task When_process_produce_command_and_waiting_for_it_fault()
        {
            var givenProcessStateAggregate = new ProcessStateAggregate <SoftwareProgrammingState>(new SoftwareProgrammingState(Guid.NewGuid().ToString(),
                                                                                                                               nameof(SoftwareProgrammingProcess.MakingCoffee))
            {
                PersonId = Guid.NewGuid().ToString()
            });

            await Node.SaveToJournal(givenProcessStateAggregate);

            var coffeMakeFailedEvent = new CoffeMakeFailedEvent(Guid.NewGuid().ToString(),
                                                                givenProcessStateAggregate.State.PersonId,
                                                                BusinessDateTime.UtcNow,
                                                                givenProcessStateAggregate.Id);

            await Node.NewDebugWaiter()
            .Expect <ProcessReceivedMessage <SoftwareProgrammingState> >(m => m.State.CurrentStateName == nameof(SoftwareProgrammingProcess.Coding))
            .Create()
            .SendToProcessManagers(coffeMakeFailedEvent, MessageMetadata.New(coffeMakeFailedEvent.SourceId, null, null));

            var processStateAggregate = await this.LoadProcessByActor <SoftwareProgrammingState>(givenProcessStateAggregate.Id);

            //Process_should_be_in_correct_state_after_fault_handling()
            Assert.Equal(nameof(SoftwareProgrammingProcess.Coding), processStateAggregate.CurrentStateName);
            //Process_state_should_contain_data_from_fault_message()
            Assert.Equal(coffeMakeFailedEvent.ForPersonId, processStateAggregate.BadSleepPersonId);
        }
        public async Task When_execute_aggregate_command()
        {
            var command         = new ScheduleEventInFutureCommand(DateTime.Now.AddMilliseconds(100), Guid.NewGuid().ToString(), "12");
            var commandMetadata = MessageMetadata.New(command.Id, Guid.NewGuid().ToString(), null);

            var res = await Node.Prepare(command, commandMetadata)
                      .Expect <ValueChangedSuccessfullyEvent>()
                      .And <JobSucceeded>()
                      .Execute();

            var answer    = res.MessageWithMetadata <ValueChangedSuccessfullyEvent>();
            var jobSucced = res.MessageWithMetadata <JobSucceeded>();

            //Result_contains_metadata()
            Assert.NotNull(answer.Metadata);
            //Result_contains_message()
            Assert.NotNull(answer.Message);
            //Result_message_has_expected_type()
            Assert.IsAssignableFrom <ValueChangedSuccessfullyEvent>(answer.Message);
            //Result_message_has_expected_id()
            Assert.Equal(command.AggregateId, answer.Message.SourceId);
            //Result_metadata_has_command_id_as_casuation_id()
            Assert.Equal((jobSucced.Message.Message as ICommand)?.Id, answer.Metadata.CasuationId);
            //Result_metadata_has_correlation_id_same_as_command_metadata()
            Assert.Equal(commandMetadata.CorrelationId, answer.Metadata.CorrelationId);
            //Result_metadata_has_processed_history_filled_from_aggregate()
            //Assert.Equal(1, answer.Metadata.History?.Steps.Count);
            ////Result_metadata_has_processed_correct_filled_history_step()
            //var step = answer.Metadata.History.Steps.First();
            //
            //Assert.Equal(AggregateActorName.New<TestFutureEventsAggregate>(command.AggregateId).Name, step.Who);
            //Assert.Equal(AggregateActorConstants.CommandExecutionCreatedAnEvent, step.Why);
            //Assert.Equal(AggregateActorConstants.PublishingEvent, step.What);
        }
Example #4
0
        public async Task When_execute_aggregate_command_with_metadata()
        {
            _command         = new InflateNewBallonCommand(1, Guid.NewGuid().ToString());
            _commandMetadata = MessageMetadata.New(_command.Id, Guid.NewGuid().ToString(), null);

            var res = await Node.Prepare(_command, _commandMetadata)
                      .Expect <BalloonCreated>()
                      .And <BalloonCreatedNotification>()
                      .Execute();

            _answer         = res.MessageWithMetadata <BalloonCreatedNotification>();
            _aggregateEvent = res.MessageWithMetadata <BalloonCreated>();
            //Result_contains_metadata()
            Assert.NotNull(_answer.Metadata);
            //Result_message_has_expected_type()
            Assert.IsAssignableFrom <BalloonCreatedNotification>(_answer.Message);
            //Result_message_has_expected_id()
            Assert.Equal(_command.AggregateId, _answer.Message.BallonId);
            //Result_metadata_has_command_id_as_casuation_id()
            Assert.Equal(_aggregateEvent.Metadata.MessageId, _answer.Metadata.CasuationId);
            //Result_metadata_has_correlation_id_same_as_command_metadata()
            Assert.Equal(_commandMetadata.CorrelationId, _answer.Metadata.CorrelationId);
            // Result_metadata_has_processed_history_filled_from_aggregate()
            //Assert.Equal(1, _answer.Metadata.History?.Steps.Count);
            ////Result_metadata_has_processed_correct_filled_history_step()
            //var step = _answer.Metadata.History.Steps.First();
            //Assert.Equal(nameof(BalloonCreatedNotificator), step.Who);
            //Assert.Equal(BalloonCreatedNotificator.Why, step.Why);
            //Assert.Equal(BalloonCreatedNotificator.MessageProcessed, step.What);
        }
Example #5
0
        public async Task When_execute_aggregate_command_with_metadata()
        {
            _command         = new PlanTitleChangeCommand(1, Guid.NewGuid().ToString());
            _commandMetadata = MessageMetadata.New(_command.Id, Guid.NewGuid().ToString(), null);

            var res = await Node.Prepare(_command, _commandMetadata)
                      .Expect <BalloonTitleChanged>()
                      .Execute();

            _answer = res.MessageWithMetadata <BalloonTitleChanged>();
            //Result_contains_metadata()
            Assert.NotNull(_answer.Metadata);
            //Result_contains_message()
            Assert.NotNull(_answer.Message);
            //Result_message_has_expected_type()
            Assert.IsAssignableFrom <BalloonTitleChanged>(_answer.Message);
            //Result_message_has_expected_id()
            Assert.Equal(_command.AggregateId, _answer.Message.SourceId);
            //Result_message_has_expected_value()
            Assert.Equal(_command.Parameter.ToString(), _answer.Message.Value);
            //Result_metadata_has_command_id_as_casuation_id()
            Assert.Equal(_command.Id, _answer.Metadata.CasuationId);
            //Result_metadata_has_correlation_id_same_as_command_metadata()
            Assert.Equal(_commandMetadata.CorrelationId, _answer.Metadata.CorrelationId);
            //Result_metadata_has_processed_history_filled_from_aggregate()
            //Assert.Equal(1, _answer.Metadata.History?.Steps.Count);
            ////Result_metadata_has_processed_correct_filled_history_step()
            //var step = _answer.Metadata.History.Steps.First();
            //Assert.Equal(AggregateActorName.New<Balloon>(_command.AggregateId)
            //                               .Name,
            //    step.Who);
            //Assert.Equal(AggregateActorConstants.CommandExecutionCreatedAnEvent, step.Why);
            //Assert.Equal(AggregateActorConstants.PublishingEvent, step.What);
        }
Example #6
0
        public async Task When_execute_aggregate_command_with_metadata()
        {
            _command         = new InflateNewBallonCommand(1, Guid.NewGuid().ToString());
            _commandMetadata = MessageMetadata.New(_command.Id, Guid.NewGuid().ToString(), null);

            var res = await Node.Prepare(_command, _commandMetadata)
                      .Expect <BalloonCreated>()
                      .Execute();

            var messageMetadata = res.ReceivedMetadata;
            var balloonCreated  = res.Received;

            Assert.NotNull(messageMetadata);
            //Result_contains_message()

            Assert.NotNull(balloonCreated);
            //Result_message_has_expected_type()
            Assert.IsAssignableFrom <BalloonCreated>(balloonCreated);
            //Result_message_has_expected_id()
            Assert.Equal(_command.AggregateId, balloonCreated.SourceId);
            //Result_message_has_expected_value()
            Assert.Equal(_command.Title.ToString(), balloonCreated.Value);
            //Result_metadata_has_command_id_as_casuation_id()
            Assert.Equal(_command.Id, messageMetadata.CasuationId);
            //Result_metadata_has_correlation_id_same_as_command_metadata()
            Assert.Equal(_commandMetadata.CorrelationId, messageMetadata.CorrelationId);
            //Result_metadata_has_processed_history_filled_from_aggregate()
            //Assert.Equal(1, messageMetadata.History?.Steps.Count);
            ////Result_metadata_has_processed_correct_filled_history_step()
            //var step = messageMetadata.History.Steps.First();
            //
            //Assert.Equal(AggregateActorName.New<Balloon>(_command.AggregateId).Name, step.Who);
            //Assert.Equal(AggregateActorConstants.CommandExecutionCreatedAnEvent, step.Why);
            //Assert.Equal(AggregateActorConstants.PublishingEvent, step.What);
        }
        public async Task When_execute_aggregate_command_with_metadata()
        {
            var command         = new InflateNewBallonCommand(1, Guid.NewGuid().ToString());
            var commandMetadata = MessageMetadata.New(command.Id, Guid.NewGuid().ToString(), null);

            var res = await Node.Prepare(command, commandMetadata)
                      .Expect <BalloonCreated>()
                      .And <Fault <BalloonCreated> >()
                      .Execute(null, false);

            var answer         = res.MessageWithMetadata <IFault <BalloonCreated> >();
            var aggregateEvent = res.MessageWithMetadata <BalloonCreated>();

            //Result_contains_metadata()
            Assert.NotNull(answer.Metadata);
            //Result_message_has_expected_type()
            Assert.IsAssignableFrom <IFault <BalloonCreated> >(answer.Message);
            //Produced_fault_produced_by_projection_builder()
            Assert.Equal(typeof(BalloonCreatedFaultyProjection), answer.Message.Processor);
            //Result_message_has_expected_id()
            Assert.Equal(command.AggregateId, answer.Message.Message.SourceId);
            //Result_metadata_has_aggregate_event_id_as_casuation_id()
            Assert.Equal(aggregateEvent.Metadata.MessageId, answer.Metadata.CasuationId);
            //Result_metadata_has_correlation_id_same_as_command_metadata()
            Assert.Equal(commandMetadata.CorrelationId, answer.Metadata.CorrelationId);
            //Result_metadata_has_processed_history_filled_from_aggregate()
            //Assert.Equal(1, answer.Metadata.History?.Steps.Count);
            ////Result_metadata_has_processed_correct_filled_history_step()
            //var step = answer.Metadata.History.Steps.First();
            //
            //Assert.Equal(nameof(BalloonCreatedFaultyProjection), step.Who);
            //Assert.Equal(MessageHandlingConstants.MessageProcessCasuedAnError, step.Why);
            //Assert.Equal(MessageHandlingConstants.PublishingFault, step.What);
        }
        public async Task When_execute_aggregate_command_with_fault_and_metadata()
        {
            var commandMetadata = MessageMetadata.New(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), null);
            var command         = new PlanBoomCommand(Guid.NewGuid(), DateTime.Now.AddMilliseconds(100));

            var res = await Node.Prepare(command, commandMetadata)
                      .Expect <JobFailed>()
                      .And <Fault <RaiseScheduledDomainEventCommand> >()
                      .Execute(null, false);

            var schedulingCommandFault = res.MessageWithMetadata <Fault <RaiseScheduledDomainEventCommand> >();
            var jobFailedEnvelop       = res.MessageWithMetadata <JobFailed>();

            //Result_contains_metadata()
            Assert.NotNull(schedulingCommandFault.Metadata);
            //Result_contains_message()
            Assert.NotNull(schedulingCommandFault.Message);
            //Result_message_has_expected_type()
            Assert.IsAssignableFrom <IFault <RaiseScheduledDomainEventCommand> >(schedulingCommandFault.Message);
            //Result_message_has_expected_id()
            Assert.Equal((jobFailedEnvelop.Message.ProcessingMessage as ICommand)?.Id,
                         schedulingCommandFault.Message.Message.Id);
            //Result_metadata_has_command_id_as_casuation_id()
            Assert.Equal((jobFailedEnvelop.Message.ProcessingMessage as ICommand)?.Id,
                         schedulingCommandFault.Metadata.CasuationId);
            //Result_metadata_has_correlation_id_same_as_command_metadata()
            Assert.Equal(commandMetadata.CorrelationId, schedulingCommandFault.Metadata.CorrelationId);
        }
 public AggregatePersistedHubInfrastructure()
 {
     ChildId            = Guid.NewGuid().ToString();
     ChildCreateMessage = new MessageMetadataEnvelop <ICommand>(new InflateNewBallonCommand(42, ChildId),
                                                                MessageMetadata.New(ChildId, null, null));
     ChildActivateMessage = new MessageMetadataEnvelop <ICommand>(new WriteTitleCommand(100, ChildId),
                                                                  MessageMetadata.New(ChildId, null, null));
 }
            public ProcessHubInfrastructure()
            {
                var processId = Guid.NewGuid().ToString();

                ChildId = processId;
                var gotTired       = new GotTiredEvent(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), processId);
                var coffeMadeEvent = new CoffeMadeEvent(gotTired.FavoriteCoffeMachineId, gotTired.PersonId, null, processId);

                ChildCreateMessage = new MessageMetadataEnvelop <DomainEvent>(gotTired, MessageMetadata.New(gotTired.SourceId, null, null));
                //TODO: second message will not hit same process as created by previos,
                //think how to change it.
                ChildActivateMessage = new MessageMetadataEnvelop <DomainEvent>(coffeMadeEvent,
                                                                                MessageMetadata.New(coffeMadeEvent.SourceId, null, null));
            }
        public async Task When_publishing_start_message()
        {
            var evt      = new SleptWellEvent(Guid.NewGuid().ToString(), Guid.NewGuid().ToString());
            var metadata = MessageMetadata.New(evt.Id, Guid.NewGuid().ToString(), null);
            var res      = await
                           Node.NewDebugWaiter()
                           .Expect <ProcessManagerCreated <SoftwareProgrammingState> >()
                           .Create()
                           .SendToProcessManagers(evt, metadata);

            var processCreatedEvent = res.Message <ProcessManagerCreated <SoftwareProgrammingState> >();

            var state = await this.LoadProcessByActor <SoftwareProgrammingState>(processCreatedEvent.State.Id);

            //Process_data_is_not_null()
            Assert.NotNull(state);
            //Process_has_correct_id()
            Assert.Equal(processCreatedEvent.SourceId, state.Id);
        }
Example #12
0
        public void Aggregate_actor_produce_fault_with_processId_from_command()
        {
            var command = new GoSleepCommand(null, null).CloneForProcess(Guid.NewGuid().ToString());

            var transport = Sys.InitLocalTransportExtension().Transport;

            transport.Subscribe <MessageMetadataEnvelop <Fault <GoSleepCommand> > >(TestActor);
            var handlersActor = Sys.ActorOf(Props.Create(() => new HandlersPipeActor(new HandlersDefaultProcessor(), TestActor)));

            var actor = Sys.ActorOf(Props.Create(() => new AggregateActor <ProgrammerAggregate>(CommandAggregateHandler.New <ProgrammerAggregate>(null),
                                                                                                new SnapshotsPersistencePolicy(1, null, 5, null),
                                                                                                AggregateFactory.Default,
                                                                                                AggregateFactory.Default,
                                                                                                handlersActor)),
                                    EntityActorName.New <ProgrammerAggregate>(command.Id).Name);

            actor.Tell(new MessageMetadataEnvelop <ICommand>(command, MessageMetadata.New(command.Id, null, null)));

            var fault = FishForMessage <MessageMetadataEnvelop>(m => m.Message is Fault <GoSleepCommand>).Message as IFault;

            Assert.Equal(command.ProcessId, fault.ProcessId);
        }
Example #13
0
        public async Task When_execute_aggregate_command_with_fault_and_metadata()
        {
            var command         = new BlowBalloonCommand(Guid.NewGuid().ToString());
            var commandMetadata = MessageMetadata.New(command.Id, Guid.NewGuid().ToString(), null);

            var res = await Node.Prepare(command, commandMetadata)
                      .Expect <Fault <BlowBalloonCommand> >()
                      .Execute(false);

            // Result_contains_metadata()
            var metadata = res.ReceivedMetadata;

            Assert.NotNull(metadata);
            // Result_contains_message()
            var fault = res.Fault;

            Assert.NotNull(fault);
            //Result_message_has_expected_type()
            Assert.IsAssignableFrom <IFault <BlowBalloonCommand> >(fault);

            //Result_message_has_expected_id()
            Assert.Equal(command.Id, ((IFault <BlowBalloonCommand>)fault).Message.Id);
            //Result_message_has_expected_value()
            Assert.Equal(command.GetType(), fault.Message.GetType());
            //Result_metadata_has_command_id_as_casuation_id()
            Assert.Equal(command.Id, metadata.CasuationId);
            //Result_metadata_has_correlation_id_same_as_command_metadata()
            Assert.Equal(commandMetadata.CorrelationId, metadata.CorrelationId);
            //Result_metadata_has_processed_history_filled_from_aggregate()
            //Assert.Equal(1, metadata.History?.Steps.Count);
            ////Result_metadata_has_processed_correct_filled_history_step()
            //var step = metadata.History.Steps.First();
            //
            //Assert.Equal(AggregateActorName.New<Balloon>(command.AggregateId).Name, step.Who);
            //Assert.Equal(AggregateActorConstants.CommandRaisedAnError, step.Why);
            //Assert.Equal(AggregateActorConstants.CommandExecutionFinished, step.What);
        }
Example #14
0
        public async Task Given_default_policy()
        {
            var startEvent = new GotTiredEvent(Guid.NewGuid().ToString(), Guid.NewGuid().ToString(), Guid.NewGuid().ToString());

            var resTask = Node.NewDebugWaiter()
                          .Expect <ProcessReceivedMessage <SoftwareProgrammingState> >()
                          .Create()
                          .SendToProcessManagers(startEvent, MessageMetadata.New(startEvent.Id, null, null));

            var processId = (await resTask).Message <ProcessReceivedMessage <SoftwareProgrammingState> >().SourceId;

            var continueEvent = new CoffeMakeFailedEvent(processId, startEvent.PersonId, BusinessDateTime.UtcNow, processId);

            //to avoid racy state receiving expected message from processing GotTiredEvent
            await Node.NewDebugWaiter()
            .Expect <ProcessReceivedMessage <SoftwareProgrammingState> >(e => e.MessageId == continueEvent.Id)
            .Create()
            .SendToProcessManagers(continueEvent, processId);

            Log.Info("Testcase enforce additional snapshot save & delete, will kill process manager");
            await Node.KillProcessManager <SoftwareProgrammingProcess, SoftwareProgrammingState>(processId);

            var snapshots = await AggregateSnapshotRepository.New(AutoTestNodeDbConfiguration.Default.JournalConnectionString,
                                                                  AggregateFactory.Default)
                            .Load <ProcessStateAggregate <SoftwareProgrammingState> >(processId);

            //Snapshot_should_be_saved_one_time
            Assert.Single(snapshots);
            //Restored_process_state_should_have_correct_ids
            Assert.True(snapshots.All(s => s.Payload.Id == processId));
            //Snapshot_should_have_parameters_from_first_event = created event
            Assert.Equal(nameof(SoftwareProgrammingProcess.Coding),
                         snapshots.First().Payload.State.CurrentStateName);
            //All_snapshots_should_not_have_uncommited_events
            Assert.Empty(snapshots.SelectMany(s => s.Payload.GetEvents()));
        }
        public void When_child_revives_monitor_should_be_created_even_on_collision()
        {
            var ChildId = "testChild";

            var create = new MessageMetadataEnvelop <ICommand>(new InflateNewBallonCommand(42, ChildId),
                                                               MessageMetadata.New(ChildId, null, null));

            _hubRef.Tell(create);

            Task.Run(async() =>
            {
                while (true)
                {
                    var activate = new MessageMetadataEnvelop <ICommand>(new WriteTitleCommand(100, ChildId),
                                                                         MessageMetadata.New(ChildId, null, null));

                    _hubRef.Tell(activate);
                    await Task.Delay(150);
                }
            });

            EventFilter.Exception <InvalidActorNameException>()
            .Expect(0, TimeSpan.FromSeconds(10), () => { });
        }