public async Task Migrate_ParitallyMigratedItemsUpdated_Succeeds() { // Arrange int numberOfWorkItems = 5; var reader = new CodePlexReaderMock(); var destManager = new Mock <IWorkItemDestination>(); var logger = new Mock <ILogger>(); reader.BuildWorkItemLists(numberOfWorkItems); var partiallyMigratedItems = new List <MigratedWorkItem>(); foreach (WorkItemSummary summary in reader.Summaries) { var status = new MigratedWorkItem(summary.Id, MigrationState.PartiallyMigrated); partiallyMigratedItems.Add(status); } destManager.Setup(m => m.GetMigratedWorkItemsAsync()).ReturnsAsync(partiallyMigratedItems); // Act await WorkItemMigrator.MigrateAsync(reader.mockReader.Object, destManager.Object, MigrationSettings.DefaultSettings, logger.Object); //Assert reader.VerifyReaderCalledForWorkItems(); destManager.Verify(m => m.WriteWorkItemAsync(It.IsAny <WorkItemDetails>()), Times.Never); destManager.Verify(m => m.UpdateWorkItemAsync(It.IsAny <WorkItemDetails>()), Times.Exactly(numberOfWorkItems)); }
public async Task Migrate_NonHttpRequestFailedExceptionOnUpdateWorkItemAsync_NotRetried_Throws() { // Arrange var reader = new CodePlexReaderMock(); var destManager = new Mock <IWorkItemDestination>(); var logger = new Mock <ILogger>(); reader.BuildWorkItemLists(1); var partiallyMigratedItems = new List <MigratedWorkItem>(); foreach (WorkItemSummary summary in reader.Summaries) { var status = new MigratedWorkItem(summary.Id, MigrationState.PartiallyMigrated); partiallyMigratedItems.Add(status); } destManager.Setup(m => m.GetMigratedWorkItemsAsync()).ReturnsAsync(partiallyMigratedItems); destManager.Setup(m => m.UpdateWorkItemAsync(It.IsAny <WorkItemDetails>())).ThrowsAsync(new WorkItemMigratorTestsException("Mock exception")); // Act and Assert await Assert.ThrowsAsync <WorkItemMigratorTestsException>(() => WorkItemMigrator.MigrateAsync(reader.mockReader.Object, destManager.Object, MigrationSettings.DefaultSettings, logger.Object)); destManager.Verify(m => m.UpdateWorkItemAsync(It.IsAny <WorkItemDetails>()), Times.Once); logger.Verify(m => m.LogMessage(LogLevel.Error, It.IsAny <string>(), It.IsAny <object[]>()), Times.Once); }
public async Task Migrate_OnDuplicateCodePlexWorkItemIds_Throws() { // Arrange var reader = new CodePlexReaderMock(); var destManager = new Mock <IWorkItemDestination>(); var logger = new Mock <ILogger>(); reader.BuildWorkItemLists(1); var migratedItems = new List <MigratedWorkItem>(); foreach (WorkItemSummary summary in reader.Summaries) { var status = new MigratedWorkItem(summary.Id, MigrationState.Migrated); migratedItems.Add(status); migratedItems.Add(status); // Add same issue twice so we get a duplicae CodePlex work item. } destManager.Setup(m => m.GetMigratedWorkItemsAsync()).ReturnsAsync(migratedItems); // Act and Assert await Assert.ThrowsAsync <WorkItemIdentificationException>(() => WorkItemMigrator.MigrateAsync(reader.mockReader.Object, destManager.Object, MigrationSettings.DefaultSettings, logger.Object)); destManager.Verify(m => m.GetMigratedWorkItemsAsync(), Times.Once); logger.Verify(m => m.LogMessage(LogLevel.Error, It.IsAny <string>(), It.IsAny <object[]>()), Times.Once); }
public async Task Migrate_HttpRequestFailedExceptionOnUpdateWorkItemAsync_Retried_AfterRetriesThrows() { // Arrange var reader = new CodePlexReaderMock(); var destManager = new Mock <IWorkItemDestination>(); var logger = new Mock <ILogger>(); var migrationSettings = MigrationSettings.DefaultSettings; migrationSettings.RetryDelay = TimeSpan.Zero; reader.BuildWorkItemLists(1); var partiallyMigratedItems = new List <MigratedWorkItem>(); foreach (WorkItemSummary summary in reader.Summaries) { var status = new MigratedWorkItem(summary.Id, MigrationState.PartiallyMigrated); partiallyMigratedItems.Add(status); } destManager.Setup(m => m.GetMigratedWorkItemsAsync()).ReturnsAsync(partiallyMigratedItems); destManager.Setup(m => m.UpdateWorkItemAsync(It.IsAny <WorkItemDetails>())).ThrowsAsync(new HttpRequestFailedException("Mock exception")); // Act and Assert await Assert.ThrowsAsync <HttpRequestFailedException>(() => WorkItemMigrator.MigrateAsync(reader.mockReader.Object, destManager.Object, migrationSettings, logger.Object)); // MaxRetryCount = 3 however this is retries, we also call once for the initial trial... destManager.Verify(m => m.UpdateWorkItemAsync(It.IsAny <WorkItemDetails>()), Times.Exactly(4)); logger.Verify(m => m.LogMessage(LogLevel.Error, It.IsAny <string>(), It.IsAny <object[]>()), Times.Once); }
public async Task Migrate_MixOfParialFullyAndNotMigratedStatus_Success() { // Arrange int numberOfWorkItems = 5; var reader = new CodePlexReaderMock(); var destManager = new Mock <IWorkItemDestination>(); var logger = new Mock <ILogger>(); reader.BuildWorkItemLists(numberOfWorkItems); var migrationStatusList = new List <MigratedWorkItem>(); var migratedItem = new MigratedWorkItem(1, MigrationState.Migrated); migrationStatusList.Add(migratedItem); var partialItem = new MigratedWorkItem(2, MigrationState.PartiallyMigrated); migrationStatusList.Add(partialItem); destManager.Setup(m => m.GetMigratedWorkItemsAsync()).ReturnsAsync(migrationStatusList); // Act await WorkItemMigrator.MigrateAsync(reader.mockReader.Object, destManager.Object, MigrationSettings.DefaultSettings, logger.Object); //Assert reader.mockReader.Verify(m => m.GetWorkItemsAsync(It.IsAny <Func <int, bool> >()), Times.Once); reader.mockReader.Verify(m => m.GetWorkItemAsync(It.IsAny <WorkItemSummary>()), Times.Exactly(4)); destManager.Verify(m => m.WriteWorkItemAsync(It.IsAny <WorkItemDetails>()), Times.Exactly(3)); destManager.Verify(m => m.UpdateWorkItemAsync(It.IsAny <WorkItemDetails>()), Times.Once); }
public async Task Migrate_FullyMigratedItemsNotReMigrated() { // Arrange int numberOfWorkItems = 5; var reader = new CodePlexReaderMock(); var destManager = new Mock <IWorkItemDestination>(); var logger = new Mock <ILogger>(); reader.BuildWorkItemLists(numberOfWorkItems); var fullyMigratedList = new List <MigratedWorkItem>(); foreach (WorkItemSummary summary in reader.Summaries) { var status = new MigratedWorkItem(summary.Id, MigrationState.Migrated); fullyMigratedList.Add(status); } destManager.Setup(m => m.GetMigratedWorkItemsAsync()).ReturnsAsync(fullyMigratedList); // Act await WorkItemMigrator.MigrateAsync(reader.mockReader.Object, destManager.Object, MigrationSettings.DefaultSettings, logger.Object); //Assert reader.mockReader.Verify(m => m.GetWorkItemsAsync(It.IsAny <Func <int, bool> >()), Times.Once); reader.mockReader.Verify(m => m.GetWorkItemAsync(It.IsAny <WorkItemSummary>()), Times.Never); destManager.Verify(m => m.WriteWorkItemAsync(It.IsAny <WorkItemDetails>()), Times.Never); destManager.Verify(m => m.UpdateWorkItemAsync(It.IsAny <WorkItemDetails>()), Times.Never); }
private void AddToMigrationQueue(Queue <MigratedWorkItem> queue, MigratedWorkItem item) { var existing = queue.FirstOrDefault(i => i.SourceId == item.SourceId); if (existing == null) { queue.Enqueue(item); } }
private async Task <WorkItem> MigrateWorkItemAsync(MigrationContext context, MigratedWorkItem item, CancellationToken cancellationToken) { using (var logger = Logger.BeginScope("MigrateWorkItem")) { //Get the work item var sourceItem = await context.SourceService.GetWorkItemAsync(item.SourceId, true, false, cancellationToken).ConfigureAwait(false); if (sourceItem == null) { Logger.Warning($"Work item not found"); item.Skipped = true; return(null); } ; // Migrate the history item.Target = await MigrateWorkItemHistoryAsync(context, sourceItem, cancellationToken).ConfigureAwait(false); cancellationToken.ThrowIfCancellationRequested(); // Migrate the relationships if (sourceItem.Relations.HasAny()) { await MigrateWorkItemRelationsAsync(context, sourceItem.Relations, item.Target, cancellationToken).ConfigureAwait(false); } // Migrate attachement files if (sourceItem.Relations.HasAny(r => r.IsAttachment()) && Settings.IncludeAttachmentFiles) { await MigrateWorkItemAttachmentAsync(context, sourceItem.Relations, item.Target, cancellationToken).ConfigureAwait(false); } // Migrate GitCommit link if (sourceItem.Relations.HasAny(r => r.IsGitCommit()) && Settings.IncludeGitCommit) { await MigrateWorkItemGitCommitLinkAsync(context, sourceItem.Relations, item.Target, cancellationToken).ConfigureAwait(false); } // Add note about migration into history await AddMigrationCommentAsync(context, sourceItem, item.Target, cancellationToken).ConfigureAwait(false); return(item.Target); }; }