public void Check_StructuredQuery_Invalidation_On_ReportInterface( )
        {
            using (CacheManager.EnforceCacheHitRules(false))
            {
                Report             report;
                ResourceReportNode rootNode;
                ResourceArgument   exprType;

                // Create report
                using (var ctx = DatabaseContext.GetContext(true, preventPostSaveActionsPropagating: true))
                {
                    report   = new EntityModel.Report();
                    rootNode = new ResourceReportNode();
                    var reportType = EntityModel.Entity.Get <EntityType>("test:person");;
                    rootNode.ResourceReportNodeType = reportType;
                    report.RootNode = rootNode.As <ReportNode>();
                    var column = new EntityModel.ReportColumn( );
                    exprType = new ResourceArgument();
                    exprType.ConformsToType = reportType;
                    var expr = new EntityModel.ResourceExpression();
                    expr.ReportExpressionResultType = exprType.As <ActivityArgument>();
                    expr.SourceNode         = rootNode.As <ReportNode>();
                    column.ColumnExpression = expr.As <ReportExpression>();
                    report.ReportColumns.Add(column);
                    report.Save();
                    ctx.CommitTransaction();
                }

                ReportingInterface ri = new ReportingInterface( );
                var settings          = new ReportSettings
                {
                    InitialRow           = 0,
                    PageSize             = 1,
                    RequireFullMetadata  = true,
                    RequireBasicMetadata = true
                };

                // Run and expect 1 column
                var result = ri.RunReport(report.Id, settings);
                Assert.AreEqual(1, result.ReportQueryColumns.Count);

                // Add column
                using (var ctx = DatabaseContext.GetContext(true, preventPostSaveActionsPropagating: true))
                {
                    var column2 = new EntityModel.ReportColumn();
                    var expr2   = new EntityModel.ResourceExpression();
                    expr2.SourceNode = rootNode.As <ReportNode>();
                    expr2.ReportExpressionResultType = exprType.As <ActivityArgument>();
                    column2.ColumnExpression         = expr2.As <ReportExpression>();
                    report.ReportColumns.Add(column2);
                    report.Save();
                    ctx.CommitTransaction();
                }

                // Run and expect 2 columns
                result = ri.RunReport(report.Id, settings);
                Assert.AreEqual(2, result.ReportQueryColumns.Count);
            }
        }
        public void ThatTheReplyWorflowRunsAndHasCorrectInput(bool workflowHasInput)
        {
            var dummyrunner = new DummyWorkflowRunner();


            using (var scope = Factory.Current.BeginLifetimeScope(builder =>
            {
                builder.Register(ctx => dummyrunner).As <IWorkflowRunner>();
            }))
                using (Factory.SetCurrentScope(scope))
                {
                    var workflow = new Workflow {
                        WorkflowRunAsOwner = true
                    };

                    if (workflowHasInput)
                    {
                        var inputArg = new ResourceArgument {
                            Name = "myInput", ConformsToType = ReplyRecord.ReplyRecord_Type
                        };
                        workflow.InputArguments.Add(inputArg.As <ActivityArgument>());
                    }

                    var notification = new Notification();
                    notification.NReplyMapCopy.Add(new ReplyMapEntry {
                        Name = "Reply", RmeWorkflow = workflow
                    });

                    var send = new SendRecord();
                    notification.SendRecords.Add(send);

                    notification.Save();

                    int runs = 0;

                    var reply = new ReplyRecord {
                        RrToSend = send, RrReply = "Reply to anything", RrReplyDate = DateTime.UtcNow
                    };

                    dummyrunner.StartWorkflowAsyncFn = (startEvent) => {
                        runs++;
                        if (workflowHasInput)
                        {
                            Assert.That(startEvent.Arguments.Keys, Has.Member("myInput"));
                            Assert.That(startEvent.Arguments["myInput"] is IEntity, Is.True);
                            Assert.That(((IEntity)startEvent.Arguments["myInput"]).Id, Is.EqualTo(reply.Id));
                        }

                        return("1");
                    };

                    reply.Save();

                    Assert.That(runs, Is.EqualTo(1));
                }
        }
示例#3
0
        protected Workflow CreateEditNameWorkflow()
        {
            var workflow = new Workflow
            {
                Name = "Test Edit Name Workflow " + DateTime.Now
            };

            var input = new ResourceArgument
            {
                Name           = "in",
                ConformsToType = Resource.Resource_Type
            };
            var inputAs = input.As <ActivityArgument>();


            workflow.InputArguments.Add(inputAs);
            workflow.InputArgumentForAction = inputAs;
            workflow
            .AddDefaultExitPoint()
            .AddUpdate("update", "in", new string[] { "in.Name", "in.Name + '1'" })
            ;

            return(workflow);
        }
示例#4
0
        public void PassingValuesBetweenActivities( )
        {
            // This test creates a person with an age of ten and a workflow that takes the persons resource id as inputs, reads that persons age and writes it out to the log embedded in a message.
            // Testing:
            //      Mapping workflow input arguments.
            //      Mapping an output argument to a variable.
            //      Using an expression that contains an input parameter.

            var personType = CodeNameResolver.GetTypeByName("AA_Person").As <EntityType>();
            var ageField   = personType.Fields.First(f => f.Name == "Age");

            var peter = Entity.Create(personType).As <Resource>();

            peter.Name = "Peter" + DateTime.Now;

            peter.SetField(ageField, 10);
            peter.Save( );
            ToDelete.Add(peter.Id);

            var workflow = new Workflow
            {
                Name = "Wf" + DateTime.Now
            };

            workflow.AddDefaultExitPoint( );

            var resourceIdArg = new ResourceArgument
            {
                Name           = "ResourceId",
                ConformsToType = personType
            };
            var resourceIdArgAs = resourceIdArg.As <ActivityArgument>( );

            workflow.InputArguments.Add(resourceIdArg.As <ActivityArgument>( ));
            //workflow.Save( );
            var workflowAs = workflow.As <WfActivity>( );



            // log activity
            var log = new LogActivity
            {
                Name = "log" + DateTime.Now
            };
            var logAs = log.As <WfActivity>( );

            workflow.ContainedActivities.Add(logAs);
            workflow.FirstActivity = logAs;

            ActivityTestHelper.AddExpressionToActivityArgument(workflow, logAs, "Message", "'Peters age is ' + ResourceId.Age", false);

            ActivityTestHelper.AddTermination(workflow, logAs);

            workflow.Save( );
            ToDelete.Add(workflow.Id);

            ActivityImplementationBase nextActivity = workflow.Cast <WfActivity>( ).CreateWindowsActivity( );

            var input = new Dictionary <string, object>
            {
                {
                    "ResourceId", peter
                }
            };

            var run = (RunWorkflow(workflow, input));


            Assert.AreEqual(WorkflowRunState_Enumeration.WorkflowRunCompleted, run.WorkflowRunStatus_Enum, "The workflow run and completed without error");

            //RunActivity( nextActivity, input );
        }
示例#5
0
        /// <summary>Given an arg inst and a value create and activityArgument ready for storage.</summary>
        /// <param name="activity">The <see cref="WfActivity"/> being run. This cannot be null.</param>
        /// <param name="arg">The argument for the activity. This cannot be null.</param>
        /// <param name="value">The value of the argument. Its type is determined by <paramref name="arg"/>. This may be null for certain argument types.</param>
        /// <returns>The converted value.</returns>
        /// <exception cref="ArgumentNullException">Neither <paramref name="activity"/> nor <paramref name="arg"/> can be null.</exception>
        /// <exception cref="ArgumentException"><paramref name="arg"/> must be of a supported type.</exception>
        public static ActivityArgument ConvertArgInstValue(WfActivity activity, ActivityArgument arg, object value)
        {
            if (activity == null)
            {
                throw new ArgumentNullException(nameof(activity));
            }
            if (arg == null)
            {
                throw new ArgumentNullException(nameof(arg));
            }

            ActivityArgument result;

            string name = $"{activity.Name ?? "[Unnamed]"}.{arg.Name ?? "[Unnamed]"}";

            if (arg.Is <ResourceListArgument>())
            {
                var list    = (IEnumerable <IEntity>)value;
                var created = new ResourceListArgument {
                    Name = name
                };
                if (list != null)
                {
                    var cleanList = list.Where(e => e != null).Select(e => e.As <Resource>());
                    created.ResourceListParameterValues.AddRange(cleanList);
                }
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <ResourceArgument>())
            {
                var res     = (IEntity)value;
                var created = new ResourceArgument {
                    Name = name, ResourceParameterValue = res?.As <Resource>()
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <StringArgument>())
            {
                var created = new StringArgument {
                    Name = name, StringParameterValue = (string)value
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <BoolArgument>())
            {
                var created = new BoolArgument {
                    Name = name, BoolParameterValue = (bool?)value ?? false
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <IntegerArgument>())
            {
                var created = new IntegerArgument {
                    Name = name, IntParameterValue = (int?)value ?? 0
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <DecimalArgument>())
            {
                var created = new DecimalArgument {
                    Name = name, DecimalParameterValue = (decimal?)value ?? 0
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <CurrencyArgument>())
            {
                var created = new CurrencyArgument {
                    Name = name, DecimalParameterValue = (decimal?)value ?? 0
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <DateTimeArgument>())
            {
                var created = new DateTimeArgument {
                    Name = name, DateTimeParameterValue = (DateTime?)value
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <DateArgument>())
            {
                var created = new DateArgument {
                    Name = name, DateParameterValue = (DateTime?)value
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <TimeArgument>())
            {
                // ensure that timeparametervalue only ever holds a datetime
                var dt = value is TimeSpan?TimeType.NewTime((TimeSpan)value) : (DateTime?)value;

                var created = new TimeArgument {
                    Name = name, TimeParameterValue = dt
                };
                result = created.As <ActivityArgument>();
            }
            else if (arg.Is <GuidArgument>())
            {
                var created = new GuidArgument {
                    Name = name, GuidParameterValue = (Guid?)value ?? Guid.Empty
                };
                result = created.As <ActivityArgument>();
            }
            else
            {
                throw new ArgumentException($"Unsupported ActivityArgument '{arg.IsOfType.First().Name}' in '{name}'", "arg");
            }

            return(result);
        }