public async Task AddChild_Succeeds() { int workItemId = 1; client.GetWorkItemAsync(workItemId, expand: WorkItemExpand.All).Returns(new WorkItem { Id = workItemId, Fields = new Dictionary <string, object> { { "System.WorkItemType", "User Story" }, { "System.Title", "Hello" }, } }); string ruleCode = @" var parent = self; var newChild = store.NewWorkItem(""Task""); newChild.Title = ""Brand new""; parent.Relations.AddChild(newChild); "; var engine = new RuleEngine(logger, ruleCode.Mince(), SaveMode.Default, dryRun: true); string result = await engine.ExecuteAsync(CollectionUrl, projectId, ProjectName, PersonalAccessToken, workItemId, client, CancellationToken.None); Assert.Null(result); logger.Received().WriteInfo($"Found a request for a new Task workitem in {ProjectName}"); logger.Received().WriteInfo($"Found a request to update workitem {workItemId} in {ProjectName}"); logger.Received().WriteWarning("Dry-run mode: no updates sent to Azure DevOps."); logger.Received().WriteInfo("Changes saved to Azure DevOps (mode Default): 1 created, 1 updated."); }
public async Task TouchDescription_Succeeds() { int workItemId = 42; client.GetWorkItemAsync(workItemId, expand: WorkItemExpand.All).Returns(new WorkItem { Id = workItemId, Fields = new Dictionary <string, object> { { "System.Description", "Hello" }, } }); string ruleCode = @" self.Description = self.Description + "".""; return self.Description; "; var engine = new RuleEngine(logger, ruleCode.Mince(), SaveMode.Default, dryRun: true); string result = await engine.ExecuteAsync(CollectionUrl, projectId, ProjectName, PersonalAccessToken, workItemId, client, CancellationToken.None); Assert.Equal("Hello.", result); logger.Received().WriteInfo($"Found a request to update workitem {workItemId} in {ProjectName}"); logger.Received().WriteWarning("Dry-run mode: no updates sent to Azure DevOps."); logger.Received().WriteInfo("Changes saved to Azure DevOps (mode Default): 0 created, 1 updated."); }
public async void LanguageDirective_Fails() { int workItemId = 42; string ruleCode = @".lang=WHAT return string.Empty; "; var engine = new RuleEngine(logger, ruleCode.Mince(), SaveMode.Item); string result = await engine.ExecuteAsync(collectionUrl, projectId, projectName, personalAccessToken, workItemId, client); Assert.Equal(EngineState.Error, engine.State); }
public async Task Parent_Succeeds() { int workItemId = 2; client.GetWorkItemAsync(workItemId, expand: WorkItemExpand.All).Returns(new WorkItem { Id = workItemId, Fields = new Dictionary <string, object> { { "System.WorkItemType", "Bug" }, { "System.Title", "Hello" }, }, Relations = new List <WorkItemRelation> { new WorkItemRelation { Rel = "System.LinkTypes.Hierarchy-Reverse", Url = $"{workItemsBaseUrl}/1" } }, }); client.GetWorkItemAsync(1, expand: WorkItemExpand.All).Returns(new WorkItem { Id = 1, Fields = new Dictionary <string, object> { { "System.WorkItemType", "User Story" }, { "System.TeamProject", ProjectName }, }, Relations = new List <WorkItemRelation> { new WorkItemRelation { Rel = "System.LinkTypes.Hierarchy-Forward", Url = FormattableString.Invariant($"{workItemsBaseUrl}/{workItemId}") } }, }); string ruleCode = @" string message = """"; var parent = self.Parent; if (parent != null) { message = $""Parent is {parent.Id}""; } return message; "; var engine = new RuleEngine(logger, ruleCode.Mince(), SaveMode.Default, dryRun: true); string result = await engine.ExecuteAsync(CollectionUrl, projectId, ProjectName, PersonalAccessToken, workItemId, client, CancellationToken.None); Assert.Equal("Parent is 1", result); }
public async void HelloWorldRule_Succeeds() { int workItemId = 42; string ruleCode = @" return $""Hello { self.WorkItemType } #{ self.Id } - { self.Title }!""; "; var engine = new RuleEngine(logger, ruleCode.Mince(), SaveMode.Item); string result = await engine.ExecuteAsync(collectionUrl, projectId, projectName, personalAccessToken, workItemId, client); Assert.Equal("Hello Bug #42 - Hello!", result); }
public async void New_Succeeds() { int workItemId = 1; string ruleCode = @" var wi = store.NewWorkItem(""Task""); wi.Title = ""Brand new""; "; var engine = new RuleEngine(logger, ruleCode.Mince(), SaveMode.Item); string result = await engine.ExecuteAsync(collectionUrl, projectId, projectName, personalAccessToken, workItemId, client); Assert.Null(result); Assert.Contains( logger.GetMessages(), m => m.Message == "Changes saved to Azure DevOps (mode Item): 1 created, 0 updated." && m.Level == "Info"); }
public async void Parent_Succeeds() { int workItemId = 42; string ruleCode = @" string message = """"; var parent = self.Parent; if (parent != null) { message = $""Parent is {parent.Id}""; } return message; "; var engine = new RuleEngine(logger, ruleCode.Mince(), SaveMode.Item); string result = await engine.ExecuteAsync(collectionUrl, projectId, projectName, personalAccessToken, workItemId, client); Assert.Equal("Parent is 1", result); }
public async Task LanguageDirective_Fails() { int workItemId = 42; client.GetWorkItemAsync(workItemId, expand: WorkItemExpand.All).Returns(new WorkItem { Id = workItemId, Fields = new Dictionary <string, object> { { "System.WorkItemType", "Bug" }, { "System.Title", "Hello" }, } }); string ruleCode = @".lang=WHAT return string.Empty; "; var engine = new RuleEngine(logger, ruleCode.Mince(), SaveMode.Default, dryRun: true); string result = await engine.ExecuteAsync(CollectionUrl, projectId, ProjectName, PersonalAccessToken, workItemId, client, CancellationToken.None); Assert.Equal(EngineState.Error, engine.State); }
public async Task HelloWorldRule_Succeeds() { int workItemId = 42; client.GetWorkItemAsync(workItemId, expand: WorkItemExpand.All).Returns(new WorkItem { Id = workItemId, Fields = new Dictionary <string, object> { { "System.WorkItemType", "Bug" }, { "System.Title", "Hello" }, } }); string ruleCode = @" return $""Hello { self.WorkItemType } #{ self.Id } - { self.Title }!""; "; var engine = new RuleEngine(logger, ruleCode.Mince(), SaveMode.Default, dryRun: true); string result = await engine.ExecuteAsync(CollectionUrl, projectId, ProjectName, PersonalAccessToken, workItemId, client, CancellationToken.None); Assert.Equal("Hello Bug #42 - Hello!", result); }
public async Task ImportDirective_Fail() { int workItemId = 42; client.GetWorkItemAsync(workItemId, expand: WorkItemExpand.All).Returns(new WorkItem { Id = workItemId, Fields = new Dictionary <string, object> { { "System.WorkItemType", "Bug" }, { "System.Title", "Hello" }, } }); string ruleCode = @" Debug.WriteLine(""test""); return string.Empty; "; var engine = new RuleEngine(logger, ruleCode.Mince(), SaveMode.Default, dryRun: true); await Assert.ThrowsAsync <Microsoft.CodeAnalysis.Scripting.CompilationErrorException>( () => engine.ExecuteAsync(CollectionUrl, projectId, ProjectName, PersonalAccessToken, workItemId, client, CancellationToken.None) ); }
public async Task ImportDirective_Succeeds() { int workItemId = 42; client.GetWorkItemAsync(workItemId, expand: WorkItemExpand.All).Returns(new WorkItem { Id = workItemId, Fields = new Dictionary <string, object> { { "System.WorkItemType", "Bug" }, { "System.Title", "Hello" }, } }); string ruleCode = @".import=System.Diagnostics Debug.WriteLine(""test""); return string.Empty; "; var engine = new RuleEngine(logger, ruleCode.Mince(), SaveMode.Default, dryRun: true); string result = await engine.ExecuteAsync(CollectionUrl, projectId, ProjectName, PersonalAccessToken, workItemId, client, CancellationToken.None); Assert.Equal(EngineState.Success, engine.State); Assert.Equal(string.Empty, result); }