public async Task GivenSqlBulkImporter_WhenImportDataWithUnExceptedExceptionInErrorLogUpload_ThenChannelShouldBeCompleteAndExceptionShouldThrow()
        {
            Channel <ImportResource> inputs = Channel.CreateUnbounded <ImportResource>();
            await inputs.Writer.WriteAsync(new ImportResource(0, 0, "Error message"));

            inputs.Writer.Complete();

            ISqlImportOperation               testFhirDataBulkOperation = Substitute.For <ISqlImportOperation>();
            ISqlBulkCopyDataWrapperFactory    dataWrapperFactory        = Substitute.For <ISqlBulkCopyDataWrapperFactory>();
            IImportErrorSerializer            errorSerializer           = Substitute.For <IImportErrorSerializer>();
            List <TableBulkCopyDataGenerator> generators = new List <TableBulkCopyDataGenerator>();

            IOptions <OperationsConfiguration> operationsConfiguration = Substitute.For <IOptions <OperationsConfiguration> >();

            operationsConfiguration.Value.Returns(new OperationsConfiguration());

            SqlResourceBulkImporter importer = new SqlResourceBulkImporter(testFhirDataBulkOperation, dataWrapperFactory, errorSerializer, generators, operationsConfiguration, NullLogger <SqlResourceBulkImporter> .Instance);

            List <string>     errorLogs        = new List <string>();
            IImportErrorStore importErrorStore = Substitute.For <IImportErrorStore>();

            importErrorStore.UploadErrorsAsync(Arg.Any <string[]>(), Arg.Any <CancellationToken>())
            .Returns((_) => throw new InvalidOperationException());

            (Channel <ImportProcessingProgress> progressChannel, Task importTask) = importer.Import(inputs, importErrorStore, CancellationToken.None);

            await foreach (ImportProcessingProgress progress in progressChannel.Reader.ReadAllAsync())
            {
                // Do nothing...
            }

            await Assert.ThrowsAsync <InvalidOperationException>(() => importTask);
        }
        private async Task <ImportProcessingProgress> UploadImportErrorsAsync(IImportErrorStore importErrorStore, long succeedCount, long failedCount, string[] importErrors, long lastIndex, CancellationToken cancellationToken)
        {
            try
            {
                await importErrorStore.UploadErrorsAsync(importErrors, cancellationToken);
            }
            catch (Exception ex)
            {
                _logger.LogInformation(ex, "Failed to upload error logs.");
                throw;
            }

            ImportProcessingProgress progress = new ImportProcessingProgress();

            progress.SucceedImportCount = succeedCount;
            progress.FailedImportCount  = failedCount;
            progress.CurrentIndex       = lastIndex + 1;

            // Return progress for checkpoint progress
            return(progress);
        }