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 MongoDbGenericRepository.DataAccess.Read; using Moq; using Xunit; namespace CoreUnitTests.KeyedReadOnlyMongoRepositoryTests; public class SumByAsyncTests : TestKeyedReadOnlyMongoRepositoryContext { private readonly Expression> filter = document => document.SomeContent == "SomeContent"; private readonly Expression> intSelector = document => document.SomeValue; private readonly Expression> decimalSelector = document => document.SomeDecimalValue; [Fact] public async Task Int_WithFilterAndSelector_Sums() { // Arrange var expected = Fixture.Create(); SetupReaderInt(expected); // Act var result = await Sut.SumByAsync(filter, intSelector); // Assert result.Should().Be(expected); Reader.Verify( x => x.SumByAsync(filter, intSelector, null, CancellationToken.None), Times.Once); } [Fact] public async Task Int_WithFilterAndSelectorAndCancellationToken_Sums() { // Arrange var expected = Fixture.Create(); var token = new CancellationToken(true); SetupReaderInt(expected); // Act var result = await Sut.SumByAsync(filter, intSelector, token); // Assert result.Should().Be(expected); Reader.Verify( x => x.SumByAsync(filter, intSelector, null, token), Times.Once); } [Fact] public async Task Int_WithFilterAndSelectorAndPartitionKey_Sums() { // Arrange var expected = Fixture.Create(); var partitionKey = Fixture.Create(); SetupReaderInt(expected); // Act var result = await Sut.SumByAsync(filter, intSelector, partitionKey); // Assert result.Should().Be(expected); Reader.Verify( x => x.SumByAsync(filter, intSelector, partitionKey, CancellationToken.None), Times.Once); } [Fact] public async Task Int_WithFilterAndSelectorAndPartitionKeyAndCancellationToken_Sums() { // Arrange var expected = Fixture.Create(); var partitionKey = Fixture.Create(); var token = new CancellationToken(true); SetupReaderInt(expected); // Act var result = await Sut.SumByAsync(filter, intSelector, partitionKey, token); // Assert result.Should().Be(expected); Reader.Verify( x => x.SumByAsync(filter, intSelector, partitionKey, token), Times.Once); } [Fact] public async Task Decimal_WithFilterAndSelector_Sums() { // Arrange var expected = Fixture.Create(); SetupReaderDecimal(expected); // Act var result = await Sut.SumByAsync(filter, decimalSelector); // Assert result.Should().Be(expected); Reader.Verify( x => x.SumByAsync(filter, decimalSelector, null, CancellationToken.None), Times.Once); } [Fact] public async Task Decimal_WithFilterAndSelectorAndCancellationToken_Sums() { // Arrange var expected = Fixture.Create(); var token = new CancellationToken(true); SetupReaderDecimal(expected); // Act var result = await Sut.SumByAsync(filter, decimalSelector, token); // Assert result.Should().Be(expected); Reader.Verify( x => x.SumByAsync(filter, decimalSelector, null, token), Times.Once); } [Fact] public async Task Decimal_WithFilterAndSelectorAndPartitionKey_Sums() { // Arrange var expected = Fixture.Create(); var partitionKey = Fixture.Create(); SetupReaderDecimal(expected); // Act var result = await Sut.SumByAsync(filter, decimalSelector, partitionKey); // Assert result.Should().Be(expected); Reader.Verify( x => x.SumByAsync(filter, decimalSelector, partitionKey, CancellationToken.None), Times.Once); } [Fact] public async Task Decimal_WithFilterAndSelectorAndPartitionKeyAndCancellationToken_Sums() { // Arrange var expected = Fixture.Create(); var partitionKey = Fixture.Create(); var token = new CancellationToken(true); SetupReaderDecimal(expected); // Act var result = await Sut.SumByAsync(filter, decimalSelector, partitionKey, token); // Assert result.Should().Be(expected); Reader.Verify( x => x.SumByAsync(filter, decimalSelector, partitionKey, token), Times.Once); } private void SetupReaderInt(int expected) { Reader = new Mock(); Reader .Setup( x => x.SumByAsync( It.IsAny>>(), It.IsAny>>(), It.IsAny(), It.IsAny())) .ReturnsAsync(expected); } private void SetupReaderDecimal(decimal expected) { Reader = new Mock(); Reader .Setup( x => x.SumByAsync( It.IsAny>>(), It.IsAny>>(), It.IsAny(), It.IsAny())) .ReturnsAsync(expected); } }