public void InitializeWorkflowWithRule() { var config = new WorkflowsConfig(); var storage = new MemoryStorage(); config.AddDocument( new WorkflowConfig() { Name = "wrk1", Label = "wrk1 config", Version = 1, } .AddInitializer(new InitializationOnEventConfig() { EventName = "evnt1", }.AddSwitch("State1")) .AddState(new StateConfig() { Name = "State1", Label = "State1", } .AddEvent(new IncomingEventConfig() { Name = "evnt2" } .AddTransition(new TransitionConfig() { TargetStateName = "State2", WhenRule = (c) => c.IncomingEvent.Name == "evnt2" }) ) ) .AddState(new StateConfig() { Name = "State2", Label = "State2" } ) ); var template = new TemplateRepository(typeof(TemplateModels)) { DefaultAction = TemplateModels.DefaultAction, }; var metadatas = new MetadatRepository(typeof(MetadataModels)) { DefaultAction = MetadataModels.DefaultAction.ToDictionary(c => c.Key, c => c.Value), }; var factory = new WorkflowFactory <RunContext>(null, null) { Serializer = new PartialJsonWorkflowSerializer() }; var processor = new WorkflowProcessor <RunContext>(config, factory) { LoadExistingWorkflowsByExternalId = (key) => storage.GetBy <Workflow, string>(key, c => c.ExternalId).ToList(), OutputActions = () => CreateOutput(new PartialJsonWorkflowSerializer(), storage), Templates = template, Metadatas = metadatas, }; var ev = new IncomingEvent() { Name = "evnt1", Uuid = Guid.NewGuid(), ExternalId = Guid.NewGuid().ToString(), EventDate = WorkflowClock.Now(), CreationDate = WorkflowClock.Now(), }; processor.EvaluateEvent(ev); var wrk = storage.GetAll <Workflow>().FirstOrDefault(c => c.ExternalId == ev.ExternalId); Assert.AreEqual(wrk.CurrentState, "State1"); ev = new IncomingEvent() { Name = "evnt2", Uuid = Guid.NewGuid(), ExternalId = Guid.NewGuid().ToString(), EventDate = WorkflowClock.Now(), CreationDate = WorkflowClock.Now(), }; processor.EvaluateEvent(ev); wrk = storage.GetAll <Workflow>().FirstOrDefault(c => c.ExternalId == ev.ExternalId); Assert.AreEqual(wrk, null); }
public void InitializeWorkflowWithPushedAction() { var config = new WorkflowsConfig(); var storage = new MemoryStorage(); config.AddDocument( new WorkflowConfig() { Name = "wrk1", Label = "wrk1 config", Version = 1, } .AddInitializer(new InitializationOnEventConfig() { EventName = "evnt1", Recursive = true }.AddSwitch("State1")) .AddState(new StateConfig() { Name = "State1", Label = "State1", } .AddIncomingActions(null, new ResultActionConfig() { Name = "act_on_state_in_1" }) .AddOutcomingActions(null, new ResultActionConfig() { Name = "act_on_state_out" }) .AddEvent(new IncomingEventConfig() { Name = "evnt1" } .AddAction(null, new ResultActionConfig() { Name = "act_on_event" }) .AddTransition(new TransitionConfig() { TargetStateName = "State2" } .AddAction(null, new ResultActionConfig() { Name = "act_on_transition" }) ) ) ) .AddState(new StateConfig() { Name = "State2", Label = "State2" } .AddIncomingActions(null, new ResultActionConfig() { Name = "act_on_state_in_2" } .AddArgument("name", "@Event.Name") ) ) ); var template = new TemplateRepository(typeof(TemplateModels)) { DefaultAction = TemplateModels.DefaultAction, }; var metadatas = new MetadatRepository(typeof(MetadataModels)) { DefaultAction = MetadataModels.DefaultAction.ToDictionary(c => c.Key, c => c.Value), }; var factory = new WorkflowFactory <RunContext>(null, null) { Serializer = new PartialJsonWorkflowSerializer() }; var processor = new WorkflowProcessor <RunContext>(config, factory) { LoadExistingWorkflowsByExternalId = (key) => storage.GetBy <Workflow, string>(key, c => c.ExternalId).ToList(), OutputActions = () => CreateOutput(new PartialJsonWorkflowSerializer(), storage), Templates = template, Metadatas = metadatas, }; var ev = new IncomingEvent() { Name = "evnt1", Uuid = Guid.NewGuid(), ExternalId = Guid.NewGuid().ToString(), EventDate = WorkflowClock.Now(), CreationDate = WorkflowClock.Now(), }; processor.EvaluateEvent(ev); var wrk = storage.GetAll <Workflow>().FirstOrDefault(c => c.ExternalId == ev.ExternalId); var act = wrk.LastEvent.Actions; act.First(c => c.Name == "act_on_state_in_1"); act.First(c => c.Name == "act_on_state_out"); act.First(c => c.Name == "act_on_event"); act.First(c => c.Name == "act_on_transition"); }