using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; 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.Delete; using Moq; using Xunit; namespace CoreUnitTests.DataAccessTests.MongoDbEraserTests; public class DeleteManyAsyncTests : GenericTestContext { [Fact] public async Task WithEmptyDocuments_DeletesNothing() { // Arrange var documents = new List(0); var token = new CancellationToken(true); var collection = MockOf>(); var dbContext = MockOf(); dbContext .Setup(x => x.GetCollection(null)) .Returns(collection.Object); // Act var result = await Sut.DeleteManyAsync(documents, token); // Assert result.Should().Be(0); var idsToDelete = documents.Select(e => e.Id).ToArray(); Expression> expectedFilter = x => idsToDelete.Contains(x.Id); collection.Verify( x => x.DeleteManyAsync( It.Is>(f => f.EquivalentTo(expectedFilter)), token), Times.Never); } [Fact] public async Task WithDocumentsAndCancellationToken_DeletesMany() { // Arrange var count = Fixture.Create(); var documents = Fixture.CreateMany().ToList(); var token = new CancellationToken(true); var collection = MockOf>(); collection .Setup(x => x.DeleteManyAsync(It.IsAny>(), It.IsAny())) .ReturnsAsync(new DeleteResult.Acknowledged(count)); var dbContext = MockOf(); dbContext .Setup(x => x.GetCollection(null)) .Returns(collection.Object); // Act var result = await Sut.DeleteManyAsync(documents, token); // Assert result.Should().Be(count); var idsToDelete = documents.Select(e => e.Id).ToArray(); Expression> expectedFilter = x => idsToDelete.Contains(x.Id); collection.Verify( x => x.DeleteManyAsync( It.Is>(f => f.EquivalentTo(expectedFilter)), token), Times.Once); } [Fact] public async Task WithPartitionDocumentsAndCancellationToken_DeletesMany() { // Arrange var count = Fixture.Create(); var partitionKey = Fixture.Create(); var documents = Fixture .Build() .With(x => x.PartitionKey, partitionKey) .CreateMany() .ToList(); var token = new CancellationToken(true); var collection = MockOf>(); collection .Setup(x => x.DeleteManyAsync(It.IsAny>(), It.IsAny())) .ReturnsAsync(new DeleteResult.Acknowledged(count)); var dbContext = MockOf(); dbContext .Setup(x => x.GetCollection(It.IsAny())) .Returns(collection.Object); // Act var result = await Sut.DeleteManyAsync(documents, token); // Assert result.Should().Be(count); var idsToDelete = documents.Select(e => e.Id).ToArray(); Expression> expectedFilter = x => idsToDelete.Contains(x.Id); collection.Verify( x => x.DeleteManyAsync( It.Is>(f => f.EquivalentTo(expectedFilter)), token), Times.Once); dbContext.Verify(x => x.GetCollection(partitionKey), Times.Once); } [Fact] public async Task WithFilterAndPartitionKeyAndCancellationToken_DeletesOne() { // Arrange var count = Fixture.Create(); var id = Fixture.Create(); var partitionKey = Fixture.Create(); var token = new CancellationToken(true); var collection = MockOf>(); collection .Setup(x => x.DeleteManyAsync(It.IsAny>(), It.IsAny())) .ReturnsAsync(new DeleteResult.Acknowledged(count)); var dbContext = MockOf(); dbContext .Setup(x => x.GetCollection(It.IsAny())) .Returns(collection.Object); Expression> filter = d => d.Id == id; // Act var result = await Sut.DeleteManyAsync(filter, partitionKey, token); // Assert result.Should().Be(count); collection.Verify( x => x.DeleteManyAsync( It.Is>(f => f.EquivalentTo(filter)), token), Times.Once); dbContext.Verify(x => x.GetCollection(partitionKey), Times.Once); } }