public async Task InProgressStored_SameCompleteReturned_LastCompletedRequestedForUpdatedCurrentBuildRequestedSame() { string requestedPerson = "Nicky"; IList <Build> builds = new List <Build> { new Build { BuildDefinitionId = "1", Status = BuildStatus.Completed, Result = BuildResult.Failed, RequestedFor = requestedPerson } }; SubscribedBuild subscribedBuild = new SubscribedBuild { BuildDefinitionId = "1", AccountDetails = CreateAccountDetails(), LastCompletedBuildRequestedFor = "Someone else", CurrentBuildStatus = BuildStatus.InProgress }; var buildService = InitializeBuildService(builds); await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> { subscribedBuild }); Assert.AreEqual(requestedPerson, subscribedBuild.CurrentBuildRequestedFor); Assert.AreEqual(requestedPerson, subscribedBuild.LastCompletedBuildRequestedFor); }
public async Task NoBuildsStored_OneInProgressNewReturned_OneInProgressUpdate() { IList <Build> builds = new List <Build> { new Build { BuildDefinitionId = "1", Status = BuildStatus.InProgress, Id = "1234", LastChangedDate = DateTime.Now } }; SubscribedBuild subscribedBuild = new SubscribedBuild { BuildDefinitionId = "1", Name = "First Definition", AccountDetails = CreateAccountDetails() }; IBuildService buildService = InitializeBuildService(builds); IList <BuildUpdate> updates = await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> { subscribedBuild }); Assert.AreEqual(1, updates.Count); Assert.AreEqual(BuildStatus.InProgress, updates.First().Status); Assert.IsNull(updates.First().Result); Assert.AreEqual("First Definition", updates.First().Name); Assert.AreEqual(BuildStatus.InProgress, subscribedBuild.CurrentBuildStatus); Assert.AreEqual(null, subscribedBuild.LastCompletedBuildResult); Assert.AreEqual("1234", subscribedBuild.CurrentBuildId); }
public async Task InProgressStored_SameInProgressReturned_NoUpdate() { IList <Build> builds = new List <Build> { new Build { BuildDefinitionId = "1", Status = BuildStatus.InProgress, Id = "1234" } }; SubscribedBuild subscribedBuild = new SubscribedBuild { BuildDefinitionId = "1", CurrentBuildId = "1234", CurrentBuildStatus = BuildStatus.InProgress, AccountDetails = CreateAccountDetails() }; var buildService = InitializeBuildService(builds); IList <BuildUpdate> updates = await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> { subscribedBuild }); Assert.AreEqual(0, updates.Count); Assert.AreEqual(BuildStatus.InProgress, subscribedBuild.CurrentBuildStatus); Assert.AreEqual(null, subscribedBuild.LastCompletedBuildResult); Assert.AreEqual("1234", subscribedBuild.CurrentBuildId); }
public async Task NoBuildsStored_OneCompletedOldReturned_NoUpdate() { IList <Build> builds = new List <Build> { new Build { BuildDefinitionId = "1", Id = "1234", Status = BuildStatus.Completed, Result = BuildResult.Canceled, LastChangedDate = DateTime.Now.AddDays(-1) } }; SubscribedBuild subscribedBuild = new SubscribedBuild { BuildDefinitionId = "1", AccountDetails = CreateAccountDetails() }; var buildService = InitializeBuildService(builds); IList <BuildUpdate> updates = await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> { subscribedBuild }); Assert.AreEqual(0, updates.Count); Assert.AreEqual(BuildStatus.Completed, subscribedBuild.CurrentBuildStatus); Assert.AreEqual(BuildResult.Canceled, subscribedBuild.LastCompletedBuildResult); Assert.AreEqual("1234", subscribedBuild.CurrentBuildId); }
public async Task NoBuildStored_OneNewInComplete_CurrentBuildAndLastCompletedRequestedForUpdated() { string requestedPerson = "Nicky"; IList <Build> builds = new List <Build> { new Build { BuildDefinitionId = "1", Status = BuildStatus.Completed, Result = BuildResult.Failed, RequestedFor = requestedPerson } }; SubscribedBuild subscribedBuild = new SubscribedBuild { BuildDefinitionId = "1", AccountDetails = CreateAccountDetails() }; var buildService = InitializeBuildService(builds); await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> { subscribedBuild }); Assert.AreEqual(requestedPerson, subscribedBuild.CurrentBuildRequestedFor); Assert.AreEqual(requestedPerson, subscribedBuild.LastCompletedBuildRequestedFor); }
private BuildUpdate CreateUpdate(SubscribedBuild subscribedBuild, Build build) { return(new BuildUpdate { Name = subscribedBuild.Name, Id = subscribedBuild.BuildDefinitionId, RequestedFor = build.RequestedFor, Result = build.Result, Status = build.Status, BuildUrl = build.BuildUrl }); }
private IList <BuildUpdate> CheckForUpdateInternal(List <Build> buildList, SubscribedBuild subscribedBuild) { IList <BuildUpdate> updates = new List <BuildUpdate>(); List <Build> orderedBuilds = buildList.OrderByDescending(b => b.LastChangedDate).ToList(); Build latestBuild = orderedBuilds.First(); // this method is only called if at least one build Build secondLatestBuild = orderedBuilds.Count < 2 ? null : orderedBuilds.Last(); bool haveNotSeenEitherBuild = subscribedBuild.CurrentBuildId == null || (!subscribedBuild.CurrentBuildId.Equals(latestBuild?.Id) && !subscribedBuild.CurrentBuildId.Equals(secondLatestBuild?.Id)); bool oneBuildIsCurrent = subscribedBuild.CurrentBuildId != null && (subscribedBuild.CurrentBuildId.Equals(latestBuild.Id) || (secondLatestBuild != null && subscribedBuild.CurrentBuildId.Equals(secondLatestBuild.Id))); Build currentBuild = oneBuildIsCurrent ? (subscribedBuild.CurrentBuildId.Equals(latestBuild.Id) ? latestBuild : secondLatestBuild) : null; if (haveNotSeenEitherBuild) { UpdateSubscribedBuild(subscribedBuild, latestBuild); if (latestBuild != null && latestBuild.LastChangedDate > DateTime.Now.AddSeconds(-10)) { updates.Add(CreateUpdate(subscribedBuild, latestBuild)); } } else if (oneBuildIsCurrent) { // Send update if older build changed if (currentBuild == secondLatestBuild && secondLatestBuild.Status != subscribedBuild.CurrentBuildStatus) { subscribedBuild.LastCompletedBuildResult = secondLatestBuild.Result; UpdateSubscribedBuild(subscribedBuild, secondLatestBuild); updates.Add(CreateUpdate(subscribedBuild, secondLatestBuild)); } if (currentBuild == secondLatestBuild || latestBuild.Status != subscribedBuild.CurrentBuildStatus) { UpdateSubscribedBuild(subscribedBuild, latestBuild); updates.Add(CreateUpdate(subscribedBuild, latestBuild)); } } return(updates); }
public async Task <IList <BuildUpdate> > CheckForUpdatedBuilds(IList <SubscribedBuild> subscribedBuilds) { List <List <SubscribedBuild> > groupedBuilds = subscribedBuilds.GroupBy(b => new { b.AccountDetails.AccountName, b.AccountDetails.ProjectId }) .Select(grp => grp.ToList()) .ToList(); var updates = new List <BuildUpdate>(); foreach (List <SubscribedBuild> groupedBuild in groupedBuilds) { IList <Build> buildsForAccount = await _vsoClient.GetBuilds(groupedBuild.First().AccountDetails, groupedBuild.Select(g => g.BuildDefinitionId).ToList()); List <List <Build> > buildsByDefinition = buildsForAccount .GroupBy(b => b.BuildDefinitionId) .Select(grp => grp.ToList()) .ToList(); foreach (List <Build> buildList in buildsByDefinition) { if (!buildList.Any()) { continue; } SubscribedBuild subscribedBuildToUpdate = subscribedBuilds.Single(sb => sb.BuildDefinitionId == buildList.First().BuildDefinitionId); updates.AddRange(CheckForUpdateInternal(buildList, subscribedBuildToUpdate)); } } SaveSubscribedBuilds(subscribedBuilds); if (!GetNotifyOnStart()) { updates.RemoveAll(u => u.Result == null); } if (!GetNotifyOnFinish()) { updates.RemoveAll(u => u.Result != null); } return(updates); }
private void UpdateSubscribedBuilds(AccountSubscriptionUpdate update) { IList <Account> accounts = update.Accounts; IList <SubscribedBuild> existingSubscribedBuilds = GetSubscribedBuilds(); IList <SubscribedBuild> newSubscribedBuilds = new List <SubscribedBuild>(); foreach (Account account in accounts) { foreach (Project project in account.Projects) { foreach (BuildDefinition buildDefinition in project.Builds) { if (buildDefinition.IsSelected == null || !buildDefinition.IsSelected.Value) { continue; } SubscribedBuild existingSubscribedBuild = existingSubscribedBuilds.SingleOrDefault( x => x.BuildDefinitionId == buildDefinition.Id && x.AccountDetails.ProjectId == project.Id && x.AccountDetails.AccountName == account.Name); if (existingSubscribedBuild != null) { newSubscribedBuilds.Add(existingSubscribedBuild); } else { newSubscribedBuilds.Add(new SubscribedBuild { AccountDetails = new AccountDetails { AccountName = account.Name, ProjectId = project.Id, EncodedCredentials = account.EncodedCredentials, ProjectName = project.Name }, BuildDefinitionId = buildDefinition.Id, Name = buildDefinition.Name }); } } } } SaveSubscribedBuilds(newSubscribedBuilds); }
public async Task InProgressStored_SameCompleteFailOldCompleteReturned_OneCompleteFailUpdate() { IList <Build> builds = new List <Build> { new Build { BuildDefinitionId = "1", Result = BuildResult.Failed, Status = BuildStatus.Completed, Id = "1234", LastChangedDate = DateTime.Now }, new Build { BuildDefinitionId = "1", Result = BuildResult.Succeeded, Status = BuildStatus.Completed, Id = "4567", LastChangedDate = DateTime.Now.AddMinutes(-1) } }; SubscribedBuild subscribedBuild = new SubscribedBuild { BuildDefinitionId = "1", CurrentBuildId = "1234", CurrentBuildStatus = BuildStatus.InProgress, Name = "First Definition", AccountDetails = CreateAccountDetails() }; var buildService = InitializeBuildService(builds); IList <BuildUpdate> updates = await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> { subscribedBuild }); Assert.AreEqual(1, updates.Count); Assert.AreEqual(BuildStatus.Completed, updates.First().Status); Assert.AreEqual(BuildResult.Failed, updates.First().Result); Assert.AreEqual("First Definition", updates.First().Name); Assert.AreEqual(BuildStatus.Completed, subscribedBuild.CurrentBuildStatus); Assert.AreEqual(BuildResult.Failed, subscribedBuild.LastCompletedBuildResult); Assert.AreEqual("1234", subscribedBuild.CurrentBuildId); }
public async Task InProgressStored_SameCompleteNewInProgressReturned_CompleteInProgressUpdates() { IList <Build> builds = new List <Build> { new Build { BuildDefinitionId = "1", Status = BuildStatus.InProgress, Id = "1234", LastChangedDate = DateTime.Now }, new Build { BuildDefinitionId = "1", Result = BuildResult.Succeeded, Status = BuildStatus.Completed, Id = "4567", LastChangedDate = DateTime.Now.AddMinutes(-1) } }; SubscribedBuild subscribedBuild = new SubscribedBuild { BuildDefinitionId = "1", CurrentBuildId = "4567", CurrentBuildStatus = BuildStatus.InProgress, LastCompletedBuildResult = BuildResult.Failed, Name = "First Definition", AccountDetails = CreateAccountDetails() }; var buildService = InitializeBuildService(builds); IList <BuildUpdate> updates = await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> { subscribedBuild }); Assert.AreEqual(2, updates.Count); Assert.IsTrue(updates.Any(u => u.Status == BuildStatus.Completed && u.Result == BuildResult.Succeeded && u.Name == "First Definition")); Assert.IsTrue(updates.Any(u => u.Status == BuildStatus.InProgress && u.Result == null && u.Name == "First Definition")); Assert.AreEqual(BuildStatus.InProgress, subscribedBuild.CurrentBuildStatus); Assert.AreEqual(BuildResult.Succeeded, subscribedBuild.LastCompletedBuildResult); Assert.AreEqual("1234", subscribedBuild.CurrentBuildId); }
private void UpdateSubscribedBuild(SubscribedBuild subscribedBuild, Build build) { if (subscribedBuild.CurrentBuildStatus != build.Status) { subscribedBuild.LastBuildStatusChangeTime = build.LastChangedDate; if (build.Result != null) { subscribedBuild.LastCompletedBuildResult = build.Result; subscribedBuild.LastCompletedBuildRequestedFor = build.RequestedFor; subscribedBuild.LastBuildResultChangeTime = build.LastChangedDate; } } subscribedBuild.CurrentBuildId = build.Id; subscribedBuild.CurrentBuildStatus = build.Status; subscribedBuild.CurrentBuildRequestedFor = build.RequestedFor; }
public async Task SuccessStored_TwoCompleteReturnedNotNew_NoUpdate() { IList <Build> builds = new List <Build> { new Build { BuildDefinitionId = "1", Status = BuildStatus.Completed, Result = BuildResult.Succeeded, Id = "1234", LastChangedDate = DateTime.Now }, new Build { BuildDefinitionId = "1", Status = BuildStatus.Completed, Result = BuildResult.Succeeded, Id = "5678", LastChangedDate = DateTime.Now.AddMinutes(-1) } }; SubscribedBuild subscribedBuild = new SubscribedBuild { BuildDefinitionId = "1", CurrentBuildId = "1234", LastCompletedBuildResult = BuildResult.Succeeded, CurrentBuildStatus = BuildStatus.Completed, Name = "First Definition", AccountDetails = CreateAccountDetails() }; var buildService = InitializeBuildService(builds); IList <BuildUpdate> updates = await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> { subscribedBuild }); Assert.AreEqual(0, updates.Count); Assert.AreEqual(BuildStatus.Completed, subscribedBuild.CurrentBuildStatus); Assert.AreEqual(BuildResult.Succeeded, subscribedBuild.LastCompletedBuildResult); Assert.AreEqual("1234", subscribedBuild.CurrentBuildId); }
public async Task InProgressStored_SameCompleteAndNewInProgressReturned_BothRequestedForUpdated() { string firstRequestedPerson = "Nicky"; string secondRequestedPerson = "Another Nicky"; IList <Build> builds = new List <Build> { new Build { BuildDefinitionId = "1", Status = BuildStatus.InProgress, RequestedFor = secondRequestedPerson, LastChangedDate = DateTime.Now, Id = "5678" }, new Build { BuildDefinitionId = "1", Status = BuildStatus.Completed, Result = BuildResult.PartiallySucceeded, RequestedFor = firstRequestedPerson, LastChangedDate = DateTime.Now.AddMinutes(-1), Id = "1234" } }; SubscribedBuild subscribedBuild = new SubscribedBuild { BuildDefinitionId = "1", AccountDetails = CreateAccountDetails(), CurrentBuildStatus = BuildStatus.InProgress, LastCompletedBuildRequestedFor = "Someone", CurrentBuildRequestedFor = "Someone else", CurrentBuildId = "1234" }; var buildService = InitializeBuildService(builds); await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> { subscribedBuild }); Assert.AreEqual(secondRequestedPerson, subscribedBuild.CurrentBuildRequestedFor); Assert.AreEqual(firstRequestedPerson, subscribedBuild.LastCompletedBuildRequestedFor); }
public async Task CompleteStored_NewInProgressReturned_CurrentRequestedForUdatedOnly() { string firstRequestedPerson = "Nicky"; string secondRequestedPerson = "Another Nicky"; IList <Build> builds = new List <Build> { new Build { BuildDefinitionId = "1", Status = BuildStatus.InProgress, RequestedFor = secondRequestedPerson, Id = "5678" }, new Build { BuildDefinitionId = "1", Status = BuildStatus.Completed, Result = BuildResult.PartiallySucceeded, RequestedFor = firstRequestedPerson, Id = "1234" } }; SubscribedBuild subscribedBuild = new SubscribedBuild { BuildDefinitionId = "1", AccountDetails = CreateAccountDetails(), CurrentBuildStatus = BuildStatus.Completed, LastCompletedBuildRequestedFor = firstRequestedPerson, CurrentBuildRequestedFor = firstRequestedPerson, CurrentBuildId = "1234" }; var buildService = InitializeBuildService(builds); await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> { subscribedBuild }); Assert.AreEqual(secondRequestedPerson, subscribedBuild.CurrentBuildRequestedFor); Assert.AreEqual(firstRequestedPerson, subscribedBuild.LastCompletedBuildRequestedFor); }
public async Task NoBuildsStored_NoBuildsReturned_NoUpdate() { IList <Build> builds = new List <Build>(); SubscribedBuild subscribedBuild = new SubscribedBuild { BuildDefinitionId = "1", AccountDetails = CreateAccountDetails() }; IBuildService buildService = InitializeBuildService(builds); IList <BuildUpdate> updates = await buildService.CheckForUpdatedBuilds(new List <SubscribedBuild> { subscribedBuild }); Assert.AreEqual(0, updates.Count); Assert.AreEqual(null, subscribedBuild.CurrentBuildStatus); Assert.AreEqual(null, subscribedBuild.LastCompletedBuildResult); Assert.AreEqual(null, subscribedBuild.CurrentBuildId); }