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 MongoDbGenericRepository.DataAccess.Delete; using Moq; using Xunit; namespace CoreUnitTests.BaseMongoRepositoryTests.DeleteTests; public class DeleteManyAsyncTests : TestMongoRepositoryContext { [Fact] public async Task WithDocuments_ShouldDeleteMany() { // Arrange var documents = Fixture.CreateMany().ToList(); var count = Fixture.Create(); Eraser = new Mock(); Eraser .Setup(x => x.DeleteManyAsync(It.IsAny>(), It.IsAny())) .ReturnsAsync(count); // Act var result = await Sut.DeleteManyAsync(documents); // Assert result.Should().Be(count); Eraser.Verify(x => x.DeleteManyAsync(documents, CancellationToken.None), Times.Once); } [Fact] public async Task WithDocumentsAndCancellationToken_ShouldDeleteMany() { // Arrange var documents = Fixture.CreateMany().ToList(); var count = Fixture.Create(); var cancellationToken = new CancellationToken(true); Eraser = new Mock(); Eraser .Setup(x => x.DeleteManyAsync(It.IsAny>(), It.IsAny())) .ReturnsAsync(count); // Act var result = await Sut.DeleteManyAsync(documents, cancellationToken); // Assert result.Should().Be(count); Eraser.Verify(x => x.DeleteManyAsync(documents, cancellationToken), Times.Once); } [Fact] public async Task WithFilter_ShouldDeleteMany() { // Arrange var content = Fixture.Create(); var count = Fixture.Create(); Expression> filter = x => x.SomeContent == content; Eraser = new Mock(); Eraser .Setup(x => x.DeleteManyAsync( It.IsAny>>(), It.IsAny(), It.IsAny())) .ReturnsAsync(count); // Act var result = await Sut.DeleteManyAsync(filter); // Assert result.Should().Be(count); Eraser.Verify(x => x.DeleteManyAsync(filter, null, CancellationToken.None), Times.Once); } [Fact] public async Task WithFilterAndCancellationToken_ShouldDeleteMany() { // Arrange var content = Fixture.Create(); var count = Fixture.Create(); var token = new CancellationToken(true); Expression> filter = x => x.SomeContent == content; Eraser = new Mock(); Eraser .Setup(x => x.DeleteManyAsync( It.IsAny>>(), It.IsAny(), It.IsAny())) .ReturnsAsync(count); // Act var result = await Sut.DeleteManyAsync(filter, token); // Assert result.Should().Be(count); Eraser.Verify(x => x.DeleteManyAsync(filter, null, token), Times.Once); } [Fact] public async Task WithFilterAndPartitionKey_ShouldDeleteMany() { // Arrange var content = Fixture.Create(); var count = Fixture.Create(); var partitionKey = Fixture.Create(); Expression> filter = x => x.SomeContent == content; Eraser = new Mock(); Eraser .Setup(x => x.DeleteManyAsync( It.IsAny>>(), It.IsAny(), It.IsAny())) .ReturnsAsync(count); // Act var result = await Sut.DeleteManyAsync(filter, partitionKey); // Assert result.Should().Be(count); Eraser.Verify(x => x.DeleteManyAsync(filter, partitionKey, CancellationToken.None), Times.Once); } [Fact] public async Task WithFilterAndPartitionKeyAndCancellationToken_ShouldDeleteMany() { // Arrange var content = Fixture.Create(); var count = Fixture.Create(); var partitionKey = Fixture.Create(); var token = new CancellationToken(true); Expression> filter = x => x.SomeContent == content; Eraser = new Mock(); Eraser .Setup(x => x.DeleteManyAsync( It.IsAny>>(), It.IsAny(), It.IsAny())) .ReturnsAsync(count); // Act var result = await Sut.DeleteManyAsync(filter, partitionKey, token); // Assert result.Should().Be(count); Eraser.Verify(x => x.DeleteManyAsync(filter, partitionKey, token), Times.Once); } #region Keyed [Fact] public async Task Keyed_WithDocuments_ShouldDeleteMany() { // Arrange var documents = Fixture.CreateMany>().ToList(); var count = Fixture.Create(); Eraser = new Mock(); Eraser .Setup(x => x.DeleteManyAsync, int>(It.IsAny>>(), It.IsAny())) .ReturnsAsync(count); // Act var result = await Sut.DeleteManyAsync, int>(documents); // Assert result.Should().Be(count); Eraser.Verify(x => x.DeleteManyAsync, int>(documents, CancellationToken.None), Times.Once); } [Fact] public async Task Keyed_WithDocumentsAndCancellationToken_ShouldDeleteMany() { // Arrange var documents = Fixture.CreateMany>().ToList(); var count = Fixture.Create(); var cancellationToken = new CancellationToken(true); Eraser = new Mock(); Eraser .Setup(x => x.DeleteManyAsync, int>(It.IsAny>>(), It.IsAny())) .ReturnsAsync(count); // Act var result = await Sut.DeleteManyAsync, int>(documents, cancellationToken); // Assert result.Should().Be(count); Eraser.Verify(x => x.DeleteManyAsync, int>(documents, cancellationToken), Times.Once); } [Fact] public async Task Keyed_WithFilter_ShouldDeleteMany() { // Arrange var content = Fixture.Create(); var count = Fixture.Create(); Expression, bool>> filter = x => x.SomeContent == content; Eraser = new Mock(); Eraser .Setup(x => x.DeleteManyAsync, int>( It.IsAny, bool>>>(), It.IsAny(), It.IsAny())) .ReturnsAsync(count); // Act var result = await Sut.DeleteManyAsync, int>(filter); // Assert result.Should().Be(count); Eraser.Verify(x => x.DeleteManyAsync, int>(filter, null, CancellationToken.None), Times.Once); } [Fact] public async Task Keyed_WithFilterAndCancellationToken_ShouldDeleteMany() { // Arrange var content = Fixture.Create(); var count = Fixture.Create(); var token = new CancellationToken(true); Expression, bool>> filter = x => x.SomeContent == content; Eraser = new Mock(); Eraser .Setup(x => x.DeleteManyAsync, int>( It.IsAny, bool>>>(), It.IsAny(), It.IsAny())) .ReturnsAsync(count); // Act var result = await Sut.DeleteManyAsync, int>(filter, token); // Assert result.Should().Be(count); Eraser.Verify(x => x.DeleteManyAsync, int>(filter, null, token), Times.Once); } [Fact] public async Task Keyed_WithFilterAndPartitionKey_ShouldDeleteMany() { // Arrange var content = Fixture.Create(); var count = Fixture.Create(); var partitionKey = Fixture.Create(); Expression, bool>> filter = x => x.SomeContent == content; Eraser = new Mock(); Eraser .Setup(x => x.DeleteManyAsync, int>( It.IsAny, bool>>>(), It.IsAny(), It.IsAny())) .ReturnsAsync(count); // Act var result = await Sut.DeleteManyAsync, int>(filter, partitionKey); // Assert result.Should().Be(count); Eraser.Verify(x => x.DeleteManyAsync, int>(filter, partitionKey, CancellationToken.None), Times.Once); } [Fact] public async Task Keyed_WithFilterAndPartitionKeyAndCancellationToken_ShouldDeleteMany() { // Arrange var content = Fixture.Create(); var count = Fixture.Create(); var partitionKey = Fixture.Create(); var token = new CancellationToken(true); Expression, bool>> filter = x => x.SomeContent == content; Eraser = new Mock(); Eraser .Setup(x => x.DeleteManyAsync, int>( It.IsAny, bool>>>(), It.IsAny(), It.IsAny())) .ReturnsAsync(count); // Act var result = await Sut.DeleteManyAsync, int>(filter, partitionKey, token); // Assert result.Should().Be(count); Eraser.Verify(x => x.DeleteManyAsync, int>(filter, partitionKey, token), Times.Once); } #endregion }