using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using AutoFixture; using CoreUnitTests.Infrastructure; using CoreUnitTests.Infrastructure.Model; using FluentAssertions; using MongoDB.Driver; using MongoDbGenericRepository; using MongoDbGenericRepository.DataAccess.Create; using Moq; using Xunit; namespace CoreUnitTests.DataAccessTests.MongoDbCreatorTests; public class AddManyAsyncTests : GenericTestContext { [Fact] public async Task WithDocuments_AddsMany() { // Arrange var documents = Fixture.CreateMany().ToList(); var context = MockOf(); var collection = MockOf>(); context .Setup(x => x.GetCollection(It.IsAny())) .Returns(collection.Object); // Act await Sut.AddManyAsync(documents); // Assert collection.Verify( x => x.InsertManyAsync( It.Is>(l => l.All(d => documents.Contains(d))), null, default), Times.Once()); } [Fact] public async Task WithDocumentsHavingNoId_SetsId() { // Arrange var documents = Fixture .Build>() .Without(x => x.Id) .CreateMany() .ToList(); var context = MockOf(); var collection = MockOf>>(); context .Setup(x => x.GetCollection>(It.IsAny())) .Returns(collection.Object); // Act await Sut.AddManyAsync, string>(documents); // Assert collection.Verify( x => x.InsertManyAsync( It.Is>>(l => l.All(d => documents.Contains(d))), null, default), Times.Once()); documents.Should().AllSatisfy(d => d.Id.Should().NotBeNull()); } [Fact] public async Task WithPartitionedDocument_AddsMany() { // Arrange var partitionKey = Fixture.Create(); var documents = Fixture.Build() .With(x => x.PartitionKey, partitionKey) .CreateMany() .ToList(); var context = MockOf(); var collection = MockOf>(); context .Setup(x => x.GetCollection(It.IsAny())) .Returns(collection.Object); // Act await Sut.AddManyAsync(documents); // Assert collection.Verify( x => x.InsertManyAsync( It.Is>(l => l.All(d => documents.Contains(d))), null, default), Times.Once()); context.Verify(x => x.GetCollection(partitionKey), Times.Once()); } [Fact] public async Task WithDocumentsAndCancellationToken_AddsMany() { // Arrange var documents = Fixture.CreateMany().ToList(); var context = MockOf(); var collection = MockOf>(); var token = new CancellationToken(true); context .Setup(x => x.GetCollection(It.IsAny())) .Returns(collection.Object); // Act await Sut.AddManyAsync(documents, token); // Assert collection.Verify( x => x.InsertManyAsync( It.Is>(l => l.All(d => documents.Contains(d))), null, token), Times.Once()); } [Fact] public async Task WithPartitionedDocumentAndCancellationToken_AddsOne() { // Arrange var partitionKey = Fixture.Create(); var documents = Fixture.Build() .With(x => x.PartitionKey, partitionKey) .CreateMany() .ToList(); var token = new CancellationToken(true); var context = MockOf(); var collection = MockOf>(); context .Setup(x => x.GetCollection(It.IsAny())) .Returns(collection.Object); // Act await Sut.AddManyAsync(documents, token); // Assert collection.Verify( x => x.InsertManyAsync( It.Is>(l => l.All(d => documents.Contains(d))), null, token), Times.Once()); context.Verify(x => x.GetCollection(partitionKey), Times.Once()); } }