Пример #1
0
        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));
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
            };
        }