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.Model; using FluentAssertions; using MongoDB.Driver; using MongoDbGenericRepository; using Moq; using Xunit; namespace CoreUnitTests.DataAccessTests.MongoDbReaderTests; public class GetAllAsyncTests : BaseReaderTests { [Fact] public async Task WithFilter_GetsMatchingDocuments() { // Arrange var collection = MockOf>(); var documents = Fixture.CreateMany().ToList(); Expression> filter = x => x.Id == documents[0].Id; var (context, cursor) = SetupAsyncGet(documents, collection); // Act var result = await Sut.GetAllAsync(filter); // Assert context.Verify(x => x.GetCollection(null), Times.Once); cursor.Verify(x => x.Current, Times.Exactly(documents.Count)); cursor.Verify(x => x.MoveNextAsync(CancellationToken.None), Times.Exactly(documents.Count + 1)); result.Should().NotBeNull(); result.Should().OnlyContain(x => documents.Contains(x)); } [Fact] public async Task WithFilterAndCancellationToken_GetsMatchingDocuments() { // Arrange var collection = MockOf>(); var documents = Fixture.CreateMany().ToList(); var token = new CancellationToken(false); Expression> filter = x => x.Id == documents[0].Id; var (context, cursor) = SetupAsyncGet(documents, collection); // Act var result = await Sut.GetAllAsync(filter, cancellationToken: token); // Assert context.Verify(x => x.GetCollection(null), Times.Once); cursor.Verify(x => x.Current, Times.Exactly(documents.Count)); cursor.Verify(x => x.MoveNextAsync(token), Times.Exactly(documents.Count + 1)); result.Should().NotBeNull(); result.Should().OnlyContain(x => documents.Contains(x)); } [Fact] public async Task WithFilterAndPartitionKey_GetsMatchingDocuments() { // Arrange var collection = MockOf>(); var documents = Fixture.CreateMany().ToList(); var partitionKey = Fixture.Create(); Expression> filter = x => x.Id == documents[0].Id; var (context, cursor) = SetupAsyncGet(documents, collection, partitionKey); // Act var result = await Sut.GetAllAsync(filter, partitionKey); // Assert context.Verify(x => x.GetCollection(partitionKey), Times.Once); cursor.Verify(x => x.Current, Times.Exactly(documents.Count)); cursor.Verify(x => x.MoveNextAsync(CancellationToken.None), Times.Exactly(documents.Count + 1)); result.Should().NotBeNull(); result.Should().OnlyContain(x => documents.Contains(x)); } [Fact] public async Task WithFilterAndPartitionKeyAndCancellationToken_GetsMatchingDocuments() { // Arrange var collection = MockOf>(); var documents = Fixture.CreateMany().ToList(); var partitionKey = Fixture.Create(); var token = new CancellationToken(false); Expression> filter = x => x.Id == documents[0].Id; var (context, cursor) = SetupAsyncGet(documents, collection, partitionKey); // Act var result = await Sut.GetAllAsync(filter, partitionKey, token); // Assert context.Verify(x => x.GetCollection(partitionKey), Times.Once); cursor.Verify(x => x.Current, Times.Exactly(documents.Count)); cursor.Verify(x => x.MoveNextAsync(token), Times.Exactly(documents.Count + 1)); result.Should().NotBeNull(); result.Should().OnlyContain(x => documents.Contains(x)); } [Fact] public async Task WithCondition_GetsMatchingDocuments() { // Arrange var collection = MockOf>(); var documents = Fixture.CreateMany().ToList(); var condition = Builders.Filter.Eq("Id", documents[0].Id); var (context, cursor) = SetupAsyncGet(documents, collection); // Act var result = await Sut.GetAllAsync(condition); // Assert context.Verify(x => x.GetCollection(null), Times.Once); cursor.Verify(x => x.Current, Times.Exactly(documents.Count)); cursor.Verify(x => x.MoveNextAsync(CancellationToken.None), Times.Exactly(documents.Count + 1)); result.Should().NotBeNull(); result.Should().OnlyContain(x => documents.Contains(x)); } [Fact] public async Task WithConditionAndCancellationToken_GetsMatchingDocuments() { // Arrange var collection = MockOf>(); var documents = Fixture.CreateMany().ToList(); var condition = Builders.Filter.Eq("Id", documents[0].Id); var token = new CancellationToken(false); var (context, cursor) = SetupAsyncGet(documents, collection); // Act var result = await Sut.GetAllAsync(condition, cancellationToken: token); // Assert context.Verify(x => x.GetCollection(null), Times.Once); cursor.Verify(x => x.Current, Times.Exactly(documents.Count)); cursor.Verify(x => x.MoveNextAsync(token), Times.Exactly(documents.Count + 1)); result.Should().NotBeNull(); result.Should().OnlyContain(x => documents.Contains(x)); } [Fact] public async Task WithConditionAndPartitionKey_GetsMatchingDocuments() { // Arrange var collection = MockOf>(); var documents = Fixture.CreateMany().ToList(); var condition = Builders.Filter.Eq("Id", documents[0].Id); var partitionKey = Fixture.Create(); var (context, cursor) = SetupAsyncGet(documents, collection, partitionKey); // Act var result = await Sut.GetAllAsync(condition, partitionKey: partitionKey); // Assert context.Verify(x => x.GetCollection(partitionKey), Times.Once); cursor.Verify(x => x.MoveNextAsync(CancellationToken.None), Times.Exactly(documents.Count + 1)); cursor.Verify(x => x.Current, Times.Exactly(documents.Count)); result.Should().NotBeNull(); result.Should().OnlyContain(x => documents.Contains(x)); } [Fact] public async Task WithConditionAndPartitionKeyAndCancellationToken_GetsMatchingDocuments() { // 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(false); var (context, cursor) = SetupAsyncGet(documents, collection, partitionKey); // Act var result = await Sut.GetAllAsync(condition, partitionKey: partitionKey, cancellationToken: token); // Assert context.Verify(x => x.GetCollection(partitionKey), Times.Once); cursor.Verify(x => x.Current, Times.Exactly(documents.Count)); cursor.Verify(x => x.MoveNextAsync(token), Times.Exactly(documents.Count + 1)); result.Should().NotBeNull(); result.Should().OnlyContain(x => documents.Contains(x)); } [Fact] public async Task WithConditionAndFindOptions_GetsMatchingDocuments() { // Arrange var collection = MockOf>(); var documents = Fixture.CreateMany().ToList(); var options = Fixture .Build() .Without(x => x.Comment) .Without(x => x.Hint) .Create(); var condition = Builders.Filter.Eq("Id", documents[0].Id); var (context, cursor) = SetupAsyncGet(documents, collection); // Act var result = await Sut.GetAllAsync(condition, options); // Assert context.Verify(x => x.GetCollection(null), Times.Once); cursor.Verify(x => x.Current, Times.Exactly(documents.Count)); cursor.Verify(x => x.MoveNextAsync(CancellationToken.None), Times.Exactly(documents.Count + 1)); result.Should().NotBeNull(); result.Should().OnlyContain(x => documents.Contains(x)); } [Fact] public async Task WithConditionAndFindOptionsAndCancellationToken_GetsMatchingDocuments() { // Arrange var collection = MockOf>(); var documents = Fixture.CreateMany().ToList(); var options = Fixture .Build() .Without(x => x.Comment) .Without(x => x.Hint) .Create(); var condition = Builders.Filter.Eq("Id", documents[0].Id); var token = new CancellationToken(false); var (context, cursor) = SetupAsyncGet(documents, collection); // Act var result = await Sut.GetAllAsync(condition, options, cancellationToken: token); // Assert context.Verify(x => x.GetCollection(null), Times.Once); cursor.Verify(x => x.Current, Times.Exactly(documents.Count)); cursor.Verify(x => x.MoveNextAsync(token), Times.Exactly(documents.Count + 1)); result.Should().NotBeNull(); result.Should().OnlyContain(x => documents.Contains(x)); } [Fact] public async Task WithConditionAndFindOptionsAndPartitionKeyAndCancellationToken_GetsMatchingDocuments() { // Arrange var collection = MockOf>(); var documents = Fixture.CreateMany().ToList(); var options = Fixture .Build() .Without(x => x.Comment) .Without(x => x.Hint) .Create(); var condition = Builders.Filter.Eq("Id", documents[0].Id); var token = new CancellationToken(false); var partitionKey = Fixture.Create(); var (context, cursor) = SetupAsyncGet(documents, collection, partitionKey); // Act var result = await Sut.GetAllAsync(condition, options, partitionKey, token); // Assert context.Verify(x => x.GetCollection(partitionKey), Times.Once); cursor.Verify(x => x.Current, Times.Exactly(documents.Count)); cursor.Verify(x => x.MoveNextAsync(token), Times.Exactly(documents.Count + 1)); result.Should().NotBeNull(); result.Should().OnlyContain(x => documents.Contains(x)); } private (Mock, Mock>) SetupAsyncGet( List documents, Mock> collection, string partitionKey = null) { var asyncCursor = SetupAsyncCursor(documents); SetupFindAsync(collection, asyncCursor); var context = MockOf(); context .Setup(x => x.GetCollection(partitionKey)) .Returns(collection.Object); return (context, asyncCursor); } }