public async Task ProcessAsync(ProcessStepViewModel model) { var stepper = await this.Find(model.Id); await this.messageBus.PublishAsync(WorkItemMessage.Create( model.Trigger, stepper.Id, stepper.Type )); }
private void GoTo5(TransitionContext context) { this.AssignToSystem(context); var stepper = context.GetInstance <Stepper>(); _messageBus.PublishAsync(WorkItemMessage.Create( GOTO5_TRIGGER, stepper.Id, stepper.Type )); }
public void TestCreateUpdateDelete() { _client.Clear().Wait(ScrumClient.TestTimeout); // Create a new work item in the INFRA/Logging, assigned to joe // Query for associated entities var userQuery = _client.Users.Where(user => user.UserName == "joe"); var userQuery2 = _client.Users.Where(user => user.UserName == "gail"); var projectQuery = _client.Projects.Where(p => p.Key == "INFRA").Include(p => p.Areas).Include(p => p.Versions); _client.InvokeAsync(userQuery, userQuery2, projectQuery).Wait(ScrumClient.TestTimeout); User joeUser = userQuery.Single(); User gailUser = userQuery2.Single(); Project infraProject = projectQuery.Single(); ProjectArea loggingArea = infraProject.Areas.Single(area => area.Name == "Logging"); var affectsVersions = infraProject.Versions.Where(version => version.IsReleased); // Create the new workitem WorkItem workItem = new WorkItem(infraProject, joeUser, Priority.High) { Project = infraProject, Areas = { loggingArea }, AssignedTo = { joeUser }, Title = "Logger isn't logging", Description = "I think this is because it's not configured in app.config.", AffectsVersions = { affectsVersions.First() } }; // Create an associated message WorkItemMessage message = new WorkItemMessage(workItem, joeUser) { Message = "Yep, I verified that it's not configured correctly." }; workItem.Messages.Add(message); // This adds the whole tree of related items and links _client.WorkItems.Add(workItem); // Verify that SaveChanges works Assert.Equal(0, workItem.ID); // New Assert.Equal(0, message.ID); // New Assert.Equal(EntityState.Added, _client.WorkItems.GetEntityState(workItem)); Assert.Equal(EntityState.Added, _client.WorkItemMessages.GetEntityState(message)); Assert.Equal(9, _client.ReportChanges(null, null)); // 2 entities and 7 links Assert.True(_client.SaveChanges().Wait(ScrumClient.TestTimeout)); Assert.True(workItem.ID > 1); // First WorkItem in db initializer should be ID 1, so adding this should always create a larger ID Assert.True(message.ID >= 1); Assert.Equal(EntityState.Unmodified, _client.WorkItems.GetEntityState(workItem)); Assert.Equal(EntityState.Unmodified, _client.WorkItemMessages.GetEntityState(message)); // Verify update works workItem.Description += Environment.NewLine + "Please add a better bug description"; workItem.Due = DateTime.Now.AddDays(5); Assert.Equal(EntityState.Modified, _client.WorkItems.GetEntityState(workItem)); Assert.Equal(1, _client.ReportChanges(null, null)); // 1 entity Assert.True(_client.SaveChanges().Wait(ScrumClient.TestTimeout)); Assert.Equal(EntityState.Unmodified, _client.WorkItems.GetEntityState(workItem)); // Adds a link to an existing item workItem.Subscribers.Add(gailUser); Assert.Equal(EntityState.Modified, _client.WorkItems.GetEntityState(workItem)); Assert.Equal(1, _client.ReportChanges(null, null)); // 1 link Assert.True(_client.SaveChanges().Wait(ScrumClient.TestTimeout)); Assert.Equal(EntityState.Unmodified, _client.WorkItems.GetEntityState(workItem)); Assert.Equal(0, _client.ReportChanges(null, null)); // Verify adding child objects works WorkItemMessage message2 = new WorkItemMessage(workItem, gailUser) { Created = DateTime.Now.AddHours(1), Message = "This message was written in the future." }; workItem.Messages.Add(message2); Assert.Equal(EntityState.Modified, _client.WorkItems.GetEntityState(workItem)); // Since WorkItem.Messages implement INotifyCollectionChanged, message2 should be added to the repository as soon as it's added to workItem.Messages, // since workItem is being tracked: Assert.Equal(EntityState.Added, _client.WorkItemMessages.GetEntityState(message2)); Assert.True(_client.SaveChanges().Wait(ScrumClient.TestTimeout)); Assert.True(message2.ID >= 1); Assert.Equal(EntityState.Unmodified, _client.WorkItems.GetEntityState(workItem)); Assert.Equal(EntityState.Unmodified, _client.WorkItemMessages.GetEntityState(message2)); // Clear all the local caches Assert.Contains(message, _client.WorkItemMessages.Local); Assert.True(_client.Clear().Wait(ScrumClient.TestTimeout)); Assert.DoesNotContain(message, _client.WorkItemMessages.Local); Assert.Equal(EntityState.Detached, _client.WorkItems.GetEntityState(workItem)); // Query for this WorkItem and connected objects, check that everything is there var query = _client.WorkItems.Where(wi => wi.ID == workItem.ID) .Include(wi => wi.Areas) .Include(wi => wi.Subscribers) .Include(wi => wi.Project.Include(p => p.Areas).Include(p => p.Versions)) .Include(wi => wi.Messages.Include(m => m.Author).Include(m => m.WorkItem)); Assert.True(_client.InvokeAsync(query).Wait(ScrumClient.TestTimeout)); WorkItem workItemQueried = query.Single(); Assert.Equal(2, workItemQueried.Messages.Count); WorkItemMessage messageQueried = workItemQueried.Messages.ElementAt(1); Assert.Equal(message2, messageQueried); Assert.Same(workItemQueried, messageQueried.WorkItem); Assert.Equal(workItem, messageQueried.WorkItem); Assert.NotSame(workItem, messageQueried.WorkItem); Assert.Contains(gailUser, workItemQueried.Subscribers); Assert.DoesNotContain(joeUser, workItemQueried.Subscribers); Assert.Contains(message, _client.WorkItemMessages.Local); Assert.Contains(message2, _client.WorkItemMessages.Local); // TODO: Delete is currently commented out. Not quite working... it's tricky due to DB reference constraints. //// Verify delete works //// TODO: Cascade delete should be somehow described/implemented in the model. I should be able to delete the WorkItem, //// and have the WorkItemMessages deleted, but not the users, subscribers, etc (though the links should be deleted). //// For now, I have to manually delete each entity. //Assert.True(_client.WorkItems.Delete(workItemQueried)); //foreach (var workItemMessage in workItemQueried.Messages) //{ // Assert.True(_client.WorkItemMessages.Delete(workItemMessage)); //} //// REVIEW: There should be a cascade delete of the messages, but that may not be the case. //Assert.True(_client.SaveChanges().Wait(ScrumClient.TestTimeout)); //// Try running the same query again //Assert.True(_client.InvokeAsync(query).Wait(ScrumClient.TestTimeout)); //workItemQueried = query.SingleOrDefault(); //Assert.Null(workItemQueried); //// REVIEW: Not sure what this will do //Assert.DoesNotContain(message, _client.WorkItemMessages.Local); _client.Clear().Wait(ScrumClient.TestTimeout); }