using System; using System.Linq; using System.Linq.Expressions; using System.Threading; using AutoFixture; using CoreUnitTests.Infrastructure.Model; using FluentAssertions; using MongoDB.Driver; using MongoDbGenericRepository; using Moq; using Xunit; namespace CoreUnitTests.DataAccessTests.MongoDbReaderTests; public class CountTests : BaseReaderTests { private readonly Expression> filter = x => x.SomeContent == "SomeContent"; [Fact] public void WithFilter_ReturnsResult() { // Arrange var collection = MockOf>(); var documents = Fixture.CreateMany().ToList(); var context = MockOf(); context .Setup(x => x.GetCollection(null)) .Returns(collection.Object); collection .Setup( x => x.CountDocuments( It.IsAny>(), It.IsAny(), It.IsAny())) .Returns(documents.Count); // Act var result = Sut.Count(filter); // Assert context.Verify(x => x.GetCollection(null), Times.Once); collection.Verify( x => x.CountDocuments(It.Is>(y => y.Expression == filter), It.IsAny(), CancellationToken.None), Times.Once); result.Should().Be(documents.Count); } [Fact] public void WithFilterAndCancellationToken_ReturnsResult() { // Arrange var collection = MockOf>(); var documents = Fixture.CreateMany().ToList(); var token = new CancellationToken(true); var context = MockOf(); context .Setup(x => x.GetCollection(null)) .Returns(collection.Object); collection .Setup( x => x.CountDocuments( It.IsAny>(), It.IsAny(), It.IsAny())) .Returns(documents.Count); // Act var result = Sut.Count(filter, cancellationToken: token); // Assert context.Verify(x => x.GetCollection(null), Times.Once); collection.Verify( x => x.CountDocuments(It.Is>(y => y.Expression == filter), It.IsAny(), token), Times.Once); result.Should().Be(documents.Count); } [Fact] public void WithFilterAndPartitionKey_ReturnsResult() { // Arrange var collection = MockOf>(); var documents = Fixture.CreateMany().ToList(); var partitionKey = Fixture.Create(); var context = MockOf(); context .Setup(x => x.GetCollection(partitionKey)) .Returns(collection.Object); collection .Setup( x => x.CountDocuments( It.IsAny>(), It.IsAny(), It.IsAny())) .Returns(documents.Count); // Act var result = Sut.Count(filter, partitionKey); // Assert context.Verify(x => x.GetCollection(partitionKey), Times.Once); collection.Verify( x => x.CountDocuments(It.Is>(y => y.Expression == filter), It.IsAny(), CancellationToken.None), Times.Once); result.Should().Be(documents.Count); } [Fact] public void WithFilterAndPartitionKeyAndCancellationToken_ReturnsResult() { // Arrange var collection = MockOf>(); var documents = Fixture.CreateMany().ToList(); var partitionKey = Fixture.Create(); var token = new CancellationToken(true); var context = MockOf(); context .Setup(x => x.GetCollection(partitionKey)) .Returns(collection.Object); collection .Setup( x => x.CountDocuments( It.IsAny>(), It.IsAny(), It.IsAny())) .Returns(documents.Count); // Act var result = Sut.Count(filter, partitionKey, token); // Assert context.Verify(x => x.GetCollection(partitionKey), Times.Once); collection.Verify( x => x.CountDocuments(It.Is>(y => y.Expression == filter), It.IsAny(), token), Times.Once); result.Should().Be(documents.Count); } [Fact] public void WithCondition_ReturnsResult() { // Arrange var collection = MockOf>(); var documents = Fixture.CreateMany().ToList(); var condition = Builders.Filter.Eq("Id", documents[0].Id); var context = MockOf(); context .Setup(x => x.GetCollection(null)) .Returns(collection.Object); collection .Setup( x => x.CountDocuments( It.IsAny>(), It.IsAny(), It.IsAny())) .Returns(documents.Count); // Act var result = Sut.Count(condition); // Assert context.Verify(x => x.GetCollection(null), Times.Once); collection.Verify( x => x.CountDocuments(condition, null, CancellationToken.None), Times.Once); result.Should().Be(documents.Count); } [Fact] public void WithConditionAndCancellationToken_ReturnsResult() { // Arrange var collection = MockOf>(); var documents = Fixture.CreateMany().ToList(); var condition = Builders.Filter.Eq("Id", documents[0].Id); var token = new CancellationToken(true); var context = MockOf(); context .Setup(x => x.GetCollection(null)) .Returns(collection.Object); collection .Setup( x => x.CountDocuments( It.IsAny>(), It.IsAny(), It.IsAny())) .Returns(documents.Count); // Act var result = Sut.Count(condition, cancellationToken: token); // Assert context.Verify(x => x.GetCollection(null), Times.Once); collection.Verify( x => x.CountDocuments(condition, null, token), Times.Once); result.Should().Be(documents.Count); } [Fact] public void WithConditionAndPartitionKey_ReturnsResult() { // Arrange var collection = MockOf>(); var documents = Fixture.CreateMany().ToList(); var condition = Builders.Filter.Eq("Id", documents[0].Id); var partitionKey = Fixture.Create(); var context = MockOf(); context .Setup(x => x.GetCollection(partitionKey)) .Returns(collection.Object); collection .Setup( x => x.CountDocuments( It.IsAny>(), It.IsAny(), It.IsAny())) .Returns(documents.Count); // Act var result = Sut.Count(condition, partitionKey: partitionKey); // Assert context.Verify(x => x.GetCollection(partitionKey), Times.Once); collection.Verify( x => x.CountDocuments(condition, null, CancellationToken.None), Times.Once); result.Should().Be(documents.Count); } [Fact] public void WithConditionAndPartitionKeyAndCancellationToken_ReturnsResult() { // Arrange var collection = MockOf>(); var documents = Fixture.CreateMany().ToList(); var condition = Builders.Filter.Eq("Id", documents[0].Id); var partitionKey = Fixture.Create(); var token = new CancellationToken(true); var context = MockOf(); context .Setup(x => x.GetCollection(partitionKey)) .Returns(collection.Object); collection .Setup( x => x.CountDocuments( It.IsAny>(), It.IsAny(), It.IsAny())) .Returns(documents.Count); // Act var result = Sut.Count(condition, partitionKey: partitionKey, cancellationToken: token); // Assert context.Verify(x => x.GetCollection(partitionKey), Times.Once); collection.Verify( x => x.CountDocuments(condition, null, token), Times.Once); result.Should().Be(documents.Count); } }