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)); } }
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); }
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 ); }
/// <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); }