using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; using AutoFixture; using CoreUnitTests.Infrastructure.Model; using FluentAssertions; using MongoDB.Driver; using MongoDbGenericRepository; using Moq; using Xunit; namespace CoreUnitTests.DataAccessTests.MongoDbReaderTests; public class GetMinValueTests : BaseReaderTests { private readonly Expression> filter = x => x.SomeContent == "SomeContent"; private readonly Expression> selector = x => x.SomeValue; [Fact] public void WithFilterAndSelector_GetsMatchingDocument() { // Arrange var value = Fixture.Create(); var collection = MockOf>(); var (context, cursor) = SetupSyncGet(value, collection); // Act var result = Sut.GetMinValue(filter, selector); // Assert context.Verify(x => x.GetCollection(null), Times.Once); cursor.Verify(x => x.Current, Times.Once); cursor.Verify(x => x.MoveNext(CancellationToken.None), Times.Once); result.Should().Be(value); } [Fact] public void WithFilterAndSelectorAndCancellationToken_GetsMatchingDocument() { // Arrange var value = Fixture.Create(); var collection = MockOf>(); var token = new CancellationToken(true); var (context, cursor) = SetupSyncGet(value, collection); // Act var result = Sut.GetMinValue(filter, selector, cancellationToken: token); // Assert context.Verify(x => x.GetCollection(null), Times.Once); cursor.Verify(x => x.Current, Times.Once); cursor.Verify(x => x.MoveNext(token), Times.Once); result.Should().Be(value); } [Fact] public void WithFilterAndSelectorAndPartitionKey_GetsMatchingDocument() { // Arrange var value = Fixture.Create(); var collection = MockOf>(); var partitionKey = Fixture.Create(); var (context, cursor) = SetupSyncGet(value, collection, partitionKey); // Act var result = Sut.GetMinValue(filter, selector, partitionKey); // Assert context.Verify(x => x.GetCollection(partitionKey), Times.Once); cursor.Verify(x => x.Current, Times.Once); cursor.Verify(x => x.MoveNext(CancellationToken.None), Times.Once); result.Should().Be(value); } [Fact] public void WithFilterAndSelectorAndPartitionKeyAndCancellationToken_GetsMatchingDocument() { // Arrange var value = Fixture.Create(); var collection = MockOf>(); var partitionKey = Fixture.Create(); var token = new CancellationToken(true); var (context, cursor) = SetupSyncGet(value, collection, partitionKey); // Act var result = Sut.GetMinValue(filter, selector, partitionKey, token); // Assert context.Verify(x => x.GetCollection(partitionKey), Times.Once); cursor.Verify(x => x.Current, Times.Once); cursor.Verify(x => x.MoveNext(token), Times.Once); result.Should().Be(value); } private (Mock, Mock>) SetupSyncGet( TValue result, Mock> collection, string partitionKey = null) { var asyncCursor = SetupSyncCursor(new List {result}); SetupFindSync(collection, asyncCursor); var context = MockOf(); context .Setup(x => x.GetCollection(partitionKey)) .Returns(collection.Object); return (context, asyncCursor); } }