public void CanConfigureProcessorWithPipelineAndRegistry()
        {
            string preFilterNames = "FetchDataFilter;ValidParticipantFilter;";
            string postFilterNames = "SaveDataFilter";

            var parameters = new Dictionary<string, object>();
            parameters.Add("FilterOrder", string.Empty);
            parameters.Add("FetchDataFired", false);
            parameters.Add("SaveDataFired", false);
            parameters.Add("ValidFired", false);

            var step = new Step("13", "12", "Manager Approve", "Request Promotion",
                                    "Approve", DateTime.Now, "Spock", "Spock;Kirk",
                                    parameters);
            step.CanProcess = true;

            var filterRegistry = new FilterRegistry<Step>();
            var processor = new WorkflowProcessor(step, filterRegistry, new Workflow());
            processor.ConfigurePipeline(preFilterNames, postFilterNames);

            var filterNames = processor.GetFilterNames();
            filterNames.ForEach(x => Console.WriteLine(x));

            Assert.AreEqual(4, filterNames.Count);
        }
        public void CanReportErrorsWithProcessor()
        {
            string source = @"F:\vs10dev\ApprovaFlowSimpleWorkflowProcessor\TestSuite\TestData\RequestPromotion.json";
            string preFilterNames = "FetchDataFilter;ValidParticipantFilter;";
            string postFilterNames = "SaveDataFilter";

            var workflow = DeserializeWorkflow(source);

            var parameters = new Dictionary<string, object>();
            parameters.Add("FilterOrder", string.Empty);
            parameters.Add("FetchDataFired", false);
            parameters.Add("SaveDataFired", false);
            parameters.Add("ValidFired", false);

            var step = new Step("13", "12", "ManagerReview", "RequestPromotionForm",
                                    "Approve", DateTime.Now, "Data", "Spock;Kirk",
                                    parameters);
            step.CanProcess = true;

            var filterRegistry = new FilterRegistry<Step>();

            var processor = new WorkflowProcessor(step, filterRegistry, workflow);
            string newState = processor.ConfigurePipeline(preFilterNames, postFilterNames)
                        .ConfigureStateMachine()
                        .ProcessAnswer()
                        .GetCurrentState();

            Assert.AreEqual("ManagerReview", newState);
            Assert.AreEqual(1, processor.GetErrorList().Count);
        }
示例#3
0
        public void CanFetchAndExecuteFilter()
        {
            string source = @"F:\vs10dev\ApprovaFlowSimpleWorkflowProcessor\Plugins\bin\Debug\Plugins.dll";

            var filterRegistry = new FilterRegistry<Step>();
            filterRegistry.LoadPlugIn(source);

            var filters = filterRegistry.GetFilters("Plugins.CaptainUnfitForCommandFilter")
                                        .ToList();

            Assert.AreEqual(1, filters.Count);

            var parameters = new Dictionary<string, object>();
            parameters.Add("KirkInfected", true);

            var step = new Step("12w", "231a", "CaptainApproval", "FirstOfficeReview",
                                "Deny", DateTime.Now, "Kirk", "Kirk",
                                parameters);
            step.CanProcess = true;

            step = filters[0].Execute(step);

            Assert.AreEqual(false, step.CanProcess);
            Assert.AreEqual(1, step.ErrorList.Count);
            Assert.IsTrue((bool)step.Parameters["MedicalOverride"]);
            Console.WriteLine(step.ErrorList[0]);
        }
        public WorkflowProcessor(Step theStep, FilterRegistry<Step> registry, Workflow workflow)
        {
            this.step = theStep;
            this.filterRegistry = registry;
            this.workflow = workflow;

            this.pipeline = new Pipeline<Step>();
        }
        public void CanConfigureProcessorStateMachine()
        {
            string source = @"F:\vs10dev\ApprovaFlowSimpleWorkflowProcessor\TestSuite\TestData\RequestPromotion.json";
            var workflow = DeserializeWorkflow(source);

            var step = new Step("13", "12", "Manager Approve", "Request Promotion",
                                    "Approve", DateTime.Now, "Spock", "Spock;Kirk",
                                    new Dictionary<string, object>());
            var filterRegistry = new FilterRegistry<Step>();

            var processor = new WorkflowProcessor(step, filterRegistry, workflow);
            processor.ConfigureStateMachine();

            Assert.AreEqual("Manager Approve", processor.GetCurrentState());
        }
        public void CanRegisterActionAsFilter()
        {
            var parameters = new Dictionary<string, object>();
            var actionWrapper = new ActionWrapperFilter(this.ActionFunction);
            var step = new Step("13", "12", "Manager Approve", "Request Promotion",
                                    "Approve", DateTime.Now, "Spock", "Spock;Kirk",
                                    parameters);
            step.CanProcess = true;

            var pipeline = new Pipeline<Step>();
            pipeline.Register(actionWrapper)
                    .Execute(step);

            Assert.AreEqual("ActionFunction fired", step.Parameters["ActionResults"].ToString());
        }
        public void CanExecutePipeline()
        {
            var parameters = new Dictionary<string, object>();
            parameters.Add("FilterOrder", string.Empty);

            var step = new Step("13", "12", "Manager Approve", "Request Promotion",
                                    "Approve", DateTime.Now, "Spock", "Spock;Kirk",
                                    parameters);
            step.CanProcess = true;

            string filterNames = "ValidParticipantFilter;SaveDataFilter;FetchDataFilter;";
            string reverseOrderFilterNames = "FetchDataFilter;SaveDataFilter;ValidParticipantFilter;";

            var filterRegistry = new FilterRegistry<Step>();
            var pipeline = new Pipeline<Step>();
            pipeline.RegisterFromList(filterNames, filterRegistry)
                        .Execute(step);

            Assert.IsTrue((bool)step.Parameters["ValidFired"]);
            Assert.IsTrue((bool)step.Parameters["SaveDataFired"]);
            Assert.IsTrue((bool)step.Parameters["FetchDataFired"]);

            Assert.AreEqual(filterNames, step.Parameters["FilterOrder"].ToString());

            //  Change up order
            step.Parameters.Clear();
            step.Parameters.Add("FilterOrder", string.Empty);

            var revPipeline = new Pipeline<Step>();
            revPipeline.RegisterFromList(reverseOrderFilterNames, filterRegistry)
                                .Execute(step);

            Assert.IsTrue((bool)step.Parameters["ValidFired"]);
            Assert.IsTrue((bool)step.Parameters["SaveDataFired"]);
            Assert.IsTrue((bool)step.Parameters["FetchDataFired"]);

            Assert.AreEqual(reverseOrderFilterNames,
                            step.Parameters["FilterOrder"].ToString());
        }
        private Step ActionFunction(Step input)
        {
            input.Parameters.Add("ActionResults", "ActionFunction fired");

            return input;
        }
        public void CanAllowMcCoyToIssueUnfitForDuty()
        {
            string source = @"F:\vs10dev\ApprovaFlowSimpleWorkflowProcessor\TestSuite\TestData\RedShirtPromotion.json";
            string pluginSource = @"F:\vs10dev\ApprovaFlowSimpleWorkflowProcessor\TestSuite\TestPlugins";
            string preFilterNames = "FetchDataFilter;MorePlugins.TransporterDiagnosisFilter;ValidParticipantFilter;";
            string postFilterNames = "MorePlugins.TransporterRepairFilter;Plugins.CaptainUnfitForCommandFilter;SaveDataFilter;";

            var workflow = DeserializeWorkflow(source);

            var parameters = new Dictionary<string, object>();
            parameters.Add("FilterOrder", string.Empty);
            parameters.Add("FetchDataFired", false);
            parameters.Add("SaveDataFired", false);
            parameters.Add("ValidFired", false);

            //  Mission to beam down issue and the red shirt wants off
            var step = new Step("13", "12", "RequestPromotionForm", "",
                                    "Complete", DateTime.Now, "RedShirtGuy", "Data;RedShirtGuy",
                                    parameters);
            step.CanProcess = true;

            var filterRegistry = new FilterRegistry<Step>();
            filterRegistry.LoadPlugInsFromShare(pluginSource);

            var processor = new WorkflowProcessor(step, filterRegistry, workflow);
            string newState = processor.ConfigurePipeline(preFilterNames, postFilterNames)
                        .ConfigureStateMachine()
                        .ProcessAnswer()
                        .GetCurrentState();

            //  Spock says he'll evaluate request
            Assert.AreEqual("FirstOfficerReview", newState);

            step.Answer = "Approve";
            step.AnsweredBy = "Spock";
            step.Participants = "Spock;Kirk";
            step.State = newState;

            processor = new WorkflowProcessor(step, filterRegistry, workflow);
            newState = processor.ConfigurePipeline(preFilterNames, postFilterNames)
                        .ConfigureStateMachine()
                        .ProcessAnswer()
                        .GetCurrentState();

            Assert.AreEqual("CaptainApproval", newState);

            //  Captain Kirt denies request, but McCoy issues unfit for command
            parameters.Add("KirkInfected", true);

            step.Answer = "Deny";
            step.AnsweredBy = "Kirk";
            step.Participants = "Kirk";
            step.State = newState;

            processor = new WorkflowProcessor(step, filterRegistry, workflow);
            newState = processor.ConfigurePipeline(preFilterNames, postFilterNames)
                        .ConfigureStateMachine()
                        .ProcessAnswer()
                        .GetCurrentState();

            //  Medical override issued and email to Starfleet generated
            bool medicalOverride = (bool)parameters["MedicalOverride"];
            bool emailSent = (bool)parameters["StarfleetEmail"];

            Assert.IsTrue(medicalOverride);
            Assert.IsTrue(emailSent);
        }
        public void CanPromoteRedShirtOffLandingParty()
        {
            string source = @"F:\vs10dev\ApprovaFlowSimpleWorkflowProcessor\TestSuite\TestData\RedShirtPromotion.json";
            string preFilterNames = "FetchDataFilter;ValidParticipantFilter;";
            string postFilterNames = "SaveDataFilter";

            var workflow = DeserializeWorkflow(source);

            var parameters = new Dictionary<string, object>();
            parameters.Add("FilterOrder", string.Empty);
            parameters.Add("FetchDataFired", false);
            parameters.Add("SaveDataFired", false);
            parameters.Add("ValidFired", false);

            var step = new Step("13", "12", "RequestPromotionForm", "",
                                    "Complete", DateTime.Now, "RedShirtGuy", "Data;RedShirtGuy",
                                    parameters);
            step.CanProcess = true;

            var filterRegistry = new FilterRegistry<Step>();

            var processor = new WorkflowProcessor(step, filterRegistry, workflow);
            string newState = processor.ConfigurePipeline(preFilterNames, postFilterNames)
                        .ConfigureStateMachine()
                        .ProcessAnswer()
                        .GetCurrentState();

            Assert.AreEqual("FirstOfficerReview", newState);

            step.Answer = "Approve";
            step.AnsweredBy = "Spock";
            step.Participants = "Spock;Kirk";
            step.State = newState;

            processor = new WorkflowProcessor(step, filterRegistry, workflow);
            newState = processor.ConfigurePipeline(preFilterNames, postFilterNames)
                        .ConfigureStateMachine()
                        .ProcessAnswer()
                        .GetCurrentState();

            Assert.AreEqual("CaptainApproval", newState);

            step.Answer = "Approve";
            step.AnsweredBy = "Kirk";
            step.Participants = "Kirk";
            step.State = newState;

            processor = new WorkflowProcessor(step, filterRegistry, workflow);
            newState = processor.ConfigurePipeline(preFilterNames, postFilterNames)
                        .ConfigureStateMachine()
                        .ProcessAnswer()
                        .GetCurrentState();

            Assert.AreEqual("PromotedOffLandingParty", newState);
        }
        public void CanPreventMcCoyFromOverridingKirk()
        {
            string source = @"F:\vs10dev\ApprovaFlowSimpleWorkflowProcessor\TestSuite\TestData\RedShirtPromotion.json";
            string preFilterNames = "FetchDataFilter;ValidParticipantFilter;";
            string postFilterNames = "SaveDataFilter";

            var workflow = DeserializeWorkflow(source);

            var parameters = new Dictionary<string, object>();
            parameters.Add("FilterOrder", string.Empty);
            parameters.Add("FetchDataFired", false);
            parameters.Add("SaveDataFired", false);
            parameters.Add("ValidFired", false);

            var step = new Step("13", "12", "RequestPromotionForm", "",
                                    "Complete", DateTime.Now, "RedShirtGuy", "Data;RedShirtGuy",
                                    parameters);
            step.CanProcess = true;

            var filterRegistry = new FilterRegistry<Step>();

            var processor = new WorkflowProcessor(step, filterRegistry, workflow);
            string newState = processor.ConfigurePipeline(preFilterNames, postFilterNames)
                        .ConfigureStateMachine()
                        .ProcessAnswer()
                        .GetCurrentState();

            Assert.AreEqual("FirstOfficerReview", newState);

            step.Answer = "Approve";
            step.AnsweredBy = "Spock";
            step.Participants = "Spock;Kirk";
            step.State = newState;

            processor = new WorkflowProcessor(step, filterRegistry, workflow);
            newState = processor.ConfigurePipeline(preFilterNames, postFilterNames)
                        .ConfigureStateMachine()
                        .ProcessAnswer()
                        .GetCurrentState();

            Assert.AreEqual("CaptainApproval", newState);

            //  Workflow will not process the trigger because
            //  the ValidParticipant filter will set setp.CanProcess to false
            step.Answer = "Approve";
            step.AnsweredBy = "McCoy";
            step.Participants = "Kirk";
            step.State = newState;

            processor = new WorkflowProcessor(step, filterRegistry, workflow);
            newState = processor.ConfigurePipeline(preFilterNames, postFilterNames)
                        .ConfigureStateMachine()
                        .ProcessAnswer()
                        .GetCurrentState();

            Assert.AreEqual("CaptainApproval", newState);
            Assert.IsFalse(step.CanProcess);
            Assert.AreEqual(1, processor.GetErrorList().Count);
            Console.WriteLine(processor.GetErrorList()[0]);
        }
        public void CanIssueSpecialOrdersWithPlugin()
        {
            string source = @"F:\vs10dev\ApprovaFlowSimpleWorkflowProcessor\TestSuite\TestData\RedShirtPromotion.json";
            string pluginSource = @"F:\vs10dev\ApprovaFlowSimpleWorkflowProcessor\TestSuite\TestPlugins";
            string preFilterNames = "FetchDataFilter;MorePlugins.TransporterDiagnosisFilter;ValidParticipantFilter;";
            string postFilterNames = "MorePlugins.TransporterRepairFilter;SaveDataFilter;";

            var workflow = DeserializeWorkflow(source);

            var parameters = new Dictionary<string, object>();
            parameters.Add("FilterOrder", string.Empty);
            parameters.Add("FetchDataFired", false);
            parameters.Add("SaveDataFired", false);
            parameters.Add("ValidFired", false);

            var step = new Step("13", "12", "RequestPromotionForm", "",
                                    "Complete", DateTime.Now, "RedShirtGuy", "Data;RedShirtGuy",
                                    parameters);
            step.CanProcess = true;

            var filterRegistry = new FilterRegistry<Step>();
            filterRegistry.LoadPlugInsFromShare(pluginSource);

            var processor = new WorkflowProcessor(step, filterRegistry, workflow);
            string newState = processor.ConfigurePipeline(preFilterNames, postFilterNames)
                        .ConfigureStateMachine()
                        .ProcessAnswer()
                        .GetCurrentState();

            Assert.AreEqual("FirstOfficerReview", newState);

            step.Answer = "Approve";
            step.AnsweredBy = "Spock";
            step.Participants = "Spock;Kirk";
            step.State = newState;

            processor = new WorkflowProcessor(step, filterRegistry, workflow);
            newState = processor.ConfigurePipeline(preFilterNames, postFilterNames)
                        .ConfigureStateMachine()
                        .ProcessAnswer()
                        .GetCurrentState();

            Assert.AreEqual("CaptainApproval", newState);

            //  Captain Kirt denies request, special order issued
            step.Answer = "Deny";
            step.AnsweredBy = "Kirk";
            step.Participants = "Kirk";
            step.State = newState;

            processor = new WorkflowProcessor(step, filterRegistry, workflow);
            newState = processor.ConfigurePipeline(preFilterNames, postFilterNames)
                        .ConfigureStateMachine()
                        .ProcessAnswer()
                        .GetCurrentState();

            Assert.AreEqual("Report to Shuttle Bay", step.Parameters["SpecialOrders"].ToString());
        }
示例#13
0
        /// <summary>
        /// Given the current Step, execute the StateMachine to transition
        /// to the subsequent target state
        /// </summary>
        /// <param name="input">Current step as Step</param>
        /// <returns></returns>
        private Step ExecuteTriggerFilter(Step input)
        {
            this.stateMachine.Fire(input.Answer);

            return input;
        }