コード例 #1
0
        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
                                                   ));
        }
コード例 #2
0
        private void GoTo5(TransitionContext context)
        {
            this.AssignToSystem(context);

            var stepper = context.GetInstance <Stepper>();

            _messageBus.PublishAsync(WorkItemMessage.Create(
                                         GOTO5_TRIGGER,
                                         stepper.Id,
                                         stepper.Type
                                         ));
        }
コード例 #3
0
        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);
        }