public async Task RunWorker_ShouldSendRetryableDocumentsIntoRetryChannel_ReplaceIsProcessedWithRetryableErrors_HasRetryChannel(int batchSize) { // Arrange var replacements = Enumerable.Range(0, batchSize).Select(_ => new BsonDocument { ["_id"] = _fixture.Create <string>(), ["Value"] = _fixture.Create <string>() }); var batch = replacements.Select(d => new ReplaceOneModel <BsonDocument>(d.GetFilterBy("_id"), d)).ToList(); var exception = new ReplaceManyException( batch.Select((b, idx) => new ReplaceErrorInfo(idx, WriteWorkerFactory.ErrorUpdateWithMoveToAnotherShard)).ToList(), batch.Count); _destinationRepositoryMock.Setup(r => r.ReplaceManyAsync(batch, It.IsAny <CancellationToken>())) .Throws(exception); var retryChannel = Channel.CreateUnbounded <ReplaceOneModel <BsonDocument> >(); // Act await WriteBatchAndCloseChannelAsync(_channel, batch); await _sut.RunWorker(retryChannel, new Mock <ILogger>().Object, CancellationToken.None); retryChannel.Writer.Complete(); // Assert var actual = await ReadModelsFromChannelAsync(retryChannel); actual.Should().BeEquivalentTo(batch); }
public async Task RunWorker_ShouldReturnCountOfFailedDocumentsReplacements_ReplaceIsProcessedWithRetryableErrors_NullRetryChannel(int batchSize) { // Arrange var replacements = Enumerable.Range(0, batchSize).Select(_ => new BsonDocument { ["_id"] = _fixture.Create <string>(), ["Value"] = _fixture.Create <string>() }); var batch = replacements.Select(d => new ReplaceOneModel <BsonDocument>(d.GetFilterBy("_id"), d)).ToList(); var exception = new ReplaceManyException( batch.Select((b, idx) => new ReplaceErrorInfo(idx, WriteWorkerFactory.ErrorUpdateWithMoveToAnotherShard)).ToList(), batch.Count); _destinationRepositoryMock.Setup(r => r.ReplaceManyAsync(batch, It.IsAny <CancellationToken>())) .Throws(exception); // Act await WriteBatchAndCloseChannelAsync(_channel, batch); var(successful, failed) = await _sut.RunWorker(null, new Mock <ILogger>().Object, CancellationToken.None); // Assert failed.Should().Be(batchSize); }