using System; 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.DataAccess.Read; using Moq; using Xunit; namespace CoreUnitTests.ReadOnlyMongoRepositoryTests; public class CountAsyncTests : TestReadOnlyMongoRepositoryContext { private readonly Expression> expression = document => document.SomeContent == "SomeContent"; [Fact] public async Task WithExpression_Counts() { // Arrange var count = Fixture.Create(); SetupReader(count); // Act var result = await Sut.CountAsync(expression); // Assert result.Should().Be(count); Reader.Verify( x => x.CountAsync(expression, null, CancellationToken.None), Times.Once); } [Fact] public async Task WithExpressionAndCancellationToken_Counts() { // Arrange var count = Fixture.Create(); var token = new CancellationToken(true); SetupReader(count); // Act var result = await Sut.CountAsync(expression, token); // Assert result.Should().Be(count); Reader.Verify( x => x.CountAsync(expression, null, token), Times.Once); } [Fact] public async Task WithExpressionAndPartitionKey_Counts() { // Arrange var count = Fixture.Create(); var partitionKey = Fixture.Create(); SetupReader(count); // Act var result = await Sut.CountAsync(expression, partitionKey); // Assert result.Should().Be(count); Reader.Verify( x => x.CountAsync(expression, partitionKey, CancellationToken.None), Times.Once); } [Fact] public async Task WithExpressionAndPartitionKeyAndCancellationToken_Counts() { // Arrange var count = Fixture.Create(); var partitionKey = Fixture.Create(); var token = new CancellationToken(true); SetupReader(count); // Act var result = await Sut.CountAsync(expression, partitionKey, token); // Assert result.Should().Be(count); Reader.Verify( x => x.CountAsync(expression, partitionKey, token), Times.Once); } private void SetupReader(long count) { Reader = new Mock(); Reader .Setup( x => x.CountAsync( It.IsAny>>(), It.IsAny(), It.IsAny())) .ReturnsAsync(count); } #region Keyed private readonly Expression, bool>> keyedExpression = document => document.SomeContent == "SomeContent"; private readonly FilterDefinition> keyedFilter = Builders>.Filter.Eq(document => document.Id, 1); [Fact] public async Task Keyed_WithExpression_Counts() { // Arrange var count = Fixture.Create(); SetupKeyedReaderWithExpression(count); // Act var result = await Sut.CountAsync, int>(keyedExpression); // Assert result.Should().Be(count); Reader.Verify( x => x.CountAsync, int>(keyedExpression, null, CancellationToken.None), Times.Once); } [Fact] public async Task Keyed_WithExpressionAndCancellationToken_Counts() { // Arrange var count = Fixture.Create(); var token = new CancellationToken(true); SetupKeyedReaderWithExpression(count); // Act var result = await Sut.CountAsync, int>(keyedExpression, token); // Assert result.Should().Be(count); Reader.Verify( x => x.CountAsync, int>(keyedExpression, null, token), Times.Once); } [Fact] public async Task Keyed_WithExpressionAndPartitionKey_Counts() { // Arrange var count = Fixture.Create(); var partitionKey = Fixture.Create(); SetupKeyedReaderWithExpression(count); // Act var result = await Sut.CountAsync, int>(keyedExpression, partitionKey); // Assert result.Should().Be(count); Reader.Verify( x => x.CountAsync, int>(keyedExpression, partitionKey, CancellationToken.None), Times.Once); } [Fact] public async Task Keyed_WithExpressionAndPartitionKeyAndCancellationToken_Counts() { // Arrange var count = Fixture.Create(); var partitionKey = Fixture.Create(); var token = new CancellationToken(true); SetupKeyedReaderWithExpression(count); // Act var result = await Sut.CountAsync, int>(keyedExpression, partitionKey, token); // Assert result.Should().Be(count); Reader.Verify( x => x.CountAsync, int>(keyedExpression, partitionKey, token), Times.Once); } [Fact] public async Task Keyed_WithFilter_Counts() { // Arrange var count = Fixture.Create(); SetupKeyedReaderWithFilter(count); // Act var result = await Sut.CountAsync, int>(keyedFilter); // Assert result.Should().Be(count); Reader.Verify( x => x.CountAsync, int>(keyedFilter, null, null, CancellationToken.None), Times.Once); } [Fact] public async Task Keyed_WithFilterAndCountOptions_Counts() { // Arrange var count = Fixture.Create(); var countOptions = new CountOptions(); SetupKeyedReaderWithFilter(count); // Act var result = await Sut.CountAsync, int>(keyedFilter, countOptions); // Assert result.Should().Be(count); Reader.Verify( x => x.CountAsync, int>(keyedFilter, countOptions, null, CancellationToken.None), Times.Once); } [Fact] public async Task Keyed_WithFilterAndCancellationToken_Counts() { // Arrange var count = Fixture.Create(); var token = new CancellationToken(true); SetupKeyedReaderWithFilter(count); // Act var result = await Sut.CountAsync, int>(keyedFilter, token); // Assert result.Should().Be(count); Reader.Verify( x => x.CountAsync, int>(keyedFilter, null, null, token), Times.Once); } [Fact] public async Task Keyed_WithFilterAndCountOptionsAndCancellationToken_Counts() { // Arrange var count = Fixture.Create(); var token = new CancellationToken(true); var countOptions = new CountOptions(); SetupKeyedReaderWithFilter(count); // Act var result = await Sut.CountAsync, int>(keyedFilter, countOptions, token); // Assert result.Should().Be(count); Reader.Verify( x => x.CountAsync, int>(keyedFilter, countOptions, null, token), Times.Once); } [Fact] public async Task Keyed_WithFilterAndPartitionKey_Counts() { // Arrange var count = Fixture.Create(); var partitionKey = Fixture.Create(); SetupKeyedReaderWithFilter(count); // Act var result = await Sut.CountAsync, int>(keyedFilter, partitionKey); // Assert result.Should().Be(count); Reader.Verify( x => x.CountAsync, int>(keyedFilter, null, partitionKey, CancellationToken.None), Times.Once); } [Fact] public async Task Keyed_WithFilterAndCountOptionsAndPartitionKey_Counts() { // Arrange var count = Fixture.Create(); var partitionKey = Fixture.Create(); var countOptions = new CountOptions(); SetupKeyedReaderWithFilter(count); // Act var result = await Sut.CountAsync, int>(keyedFilter, countOptions, partitionKey); // Assert result.Should().Be(count); Reader.Verify( x => x.CountAsync, int>(keyedFilter, countOptions, partitionKey, CancellationToken.None), Times.Once); } [Fact] public async Task Keyed_WithFilterAndPartitionKeyAndCancellationToken_Counts() { // Arrange var count = Fixture.Create(); var partitionKey = Fixture.Create(); var token = new CancellationToken(true); SetupKeyedReaderWithFilter(count); // Act var result = await Sut.CountAsync, int>(keyedFilter, partitionKey, token); // Assert result.Should().Be(count); Reader.Verify( x => x.CountAsync, int>(keyedFilter, null, partitionKey, token), Times.Once); } [Fact] public async Task Keyed_WithFilterAndCountOptionsPartitionKeyAndCancellationToken_Counts() { // Arrange var count = Fixture.Create(); var partitionKey = Fixture.Create(); var token = new CancellationToken(true); var countOptions = new CountOptions(); SetupKeyedReaderWithFilter(count); // Act var result = await Sut.CountAsync, int>(keyedFilter, countOptions, partitionKey, token); // Assert result.Should().Be(count); Reader.Verify( x => x.CountAsync, int>(keyedFilter, countOptions, partitionKey, token), Times.Once); } private void SetupKeyedReaderWithExpression(long count) { Reader = new Mock(); Reader .Setup( x => x.CountAsync, int>( It.IsAny, bool>>>(), It.IsAny(), It.IsAny())) .ReturnsAsync(count); } private void SetupKeyedReaderWithFilter(long count) { Reader = new Mock(); Reader .Setup( x => x.CountAsync, int>( It.IsAny>>(), It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(count); } #endregion }