using MongoDB.Driver; using MongoDbGenericRepository; using MongoDbGenericRepository.Models; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Linq.Expressions; using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; using Xunit; namespace CoreIntegrationTests.Infrastructure { public abstract partial class MongoDbDocumentTestBase : IClassFixture> where T : TestDoc, new() { #region Update One [Fact] public void UpdateOne() { // Arrange var document = CreateTestDocument(); SUT.AddOne(document); var content = GetContent(); document.SomeContent = content; // Act var result = SUT.UpdateOne(document); // Assert Assert.True(result); var updatedDocument = SUT.GetById(document.Id, PartitionKey); Assert.True(null != updatedDocument, GetTestName()); Assert.True(content == updatedDocument.SomeContent, GetTestName()); } [Fact] public async Task UpdateOneAsync() { // Arrange var document = CreateTestDocument(); SUT.AddOne(document); var content = GetContent(); document.SomeContent = content; // Act var result = await SUT.UpdateOneAsync(document); // Assert Assert.True(result); var updatedDocument = SUT.GetById(document.Id, PartitionKey); Assert.True(null != updatedDocument, GetTestName()); Assert.True(content == updatedDocument.SomeContent, GetTestName()); } [Fact] public void UpdateOneField() { // Arrange var document = CreateTestDocument(); SUT.AddOne(document); var content = GetContent(); // Act var result = SUT.UpdateOne(document, x => x.SomeContent, content); // Assert Assert.True(result, GetTestName()); var updatedDocument = SUT.GetById(document.Id, PartitionKey); Assert.True(null != updatedDocument, GetTestName()); Assert.True(content == updatedDocument.SomeContent, GetTestName()); } [Fact] public async Task UpdateOneFieldAsync() { // Arrange var document = CreateTestDocument(); SUT.AddOne(document); var content = GetContent(); // Act var result = await SUT.UpdateOneAsync(document, x => x.SomeContent, content); // Assert Assert.True(result, GetTestName()); var updatedDocument = SUT.GetById(document.Id, PartitionKey); Assert.True(null != updatedDocument, GetTestName()); Assert.True(content == updatedDocument.SomeContent, GetTestName()); } [Fact] public void UpdateOneFieldWithFilter() { // Arrange var document = CreateTestDocument(); SUT.AddOne(document); var content = GetContent(); // Act var result = SUT.UpdateOne(x => x.Id.Equals(document.Id), x => x.SomeContent, content, PartitionKey); // Assert Assert.True(result, GetTestName()); var updatedDocument = SUT.GetById(document.Id, PartitionKey); Assert.True(null != updatedDocument, GetTestName()); Assert.True(content == updatedDocument.SomeContent, GetTestName()); } [Fact] public async Task UpdateOneFieldWithFilterAsync() { // Arrange var document = CreateTestDocument(); SUT.AddOne(document); var content = GetContent(); // Act var result = await SUT.UpdateOneAsync(x => x.Id.Equals(document.Id), x => x.SomeContent, content, PartitionKey); // Assert Assert.True(result, GetTestName()); var updatedDocument = SUT.GetById(document.Id, PartitionKey); Assert.True(null != updatedDocument, GetTestName()); Assert.True(content == updatedDocument.SomeContent, GetTestName()); } [Fact] public async Task UpdateOneAsyncWithUpdateDefinition() { // Arrange var document = CreateTestDocument(); SUT.AddOne(document); var childrenToAdd = new List { new Child("testType1", "testValue1"), new Child("testType2", "testValue2") }; var updateDef = MongoDB.Driver.Builders.Update.AddToSetEach(p => p.Children, childrenToAdd); // Act var result = await SUT.UpdateOneAsync(document, updateDef); // Assert Assert.True(result); var updatedDocument = SUT.GetById(document.Id, PartitionKey); Assert.True(null != updatedDocument); Assert.True(childrenToAdd[0].Type == updatedDocument.Children[0].Type, GetTestName()); Assert.True(childrenToAdd[0].Value == updatedDocument.Children[0].Value, GetTestName()); Assert.True(childrenToAdd[1].Type == updatedDocument.Children[1].Type, GetTestName()); Assert.True(childrenToAdd[1].Value == updatedDocument.Children[1].Value, GetTestName()); } [Fact] public void UpdateOneWithUpdateDefinition() { // Arrange var document = CreateTestDocument(); SUT.AddOne(document); var childrenToAdd = new List { new Child("testType1", "testValue1"), new Child("testType2", "testValue2") }; var updateDef = MongoDB.Driver.Builders.Update.AddToSetEach(p => p.Children, childrenToAdd); // Act var result = SUT.UpdateOne(document, updateDef); // Assert Assert.True(result); var updatedDocument = SUT.GetById(document.Id, PartitionKey); Assert.True(null != updatedDocument); Assert.True(childrenToAdd[0].Type == updatedDocument.Children[0].Type, GetTestName()); Assert.True(childrenToAdd[0].Value == updatedDocument.Children[0].Value, GetTestName()); Assert.True(childrenToAdd[1].Type == updatedDocument.Children[1].Type, GetTestName()); Assert.True(childrenToAdd[1].Value == updatedDocument.Children[1].Value, GetTestName()); } #endregion Update One #region Update Many [Fact] public async Task UpdateManyWithLinqFilterAsync() { // Arrange var documents = CreateTestDocuments(2); SUT.AddMany(documents); var docIds = documents.Select(u => u.Id).ToArray(); var content = GetContent(); // Act var result = await SUT.UpdateManyAsync(x => docIds.Contains(x.Id), x => x.SomeContent, content, PartitionKey); // Assert Assert.True(result == 2, GetTestName()); var updatedDocument = SUT.GetAll(x => docIds.Contains(x.Id), PartitionKey); Assert.True(updatedDocument.Count == 2); Assert.True(updatedDocument.All(u => u.SomeContent == content), GetTestName()); } [Fact] public async Task UpdateManyWithFilterDefinitionAsync() { // Arrange var documents = CreateTestDocuments(2); SUT.AddMany(documents); var docIds = documents.Select(u => u.Id).ToArray(); var filterDefinition = Builders.Filter.Where(x => docIds.Contains(x.Id)); var content = GetContent(); // Act var result = await SUT.UpdateManyAsync(filterDefinition, x => x.SomeContent, content, PartitionKey); // Assert Assert.True(result == 2, GetTestName()); var updatedDocument = SUT.GetAll(x => docIds.Contains(x.Id), PartitionKey); Assert.True(updatedDocument.Count == 2); Assert.True(updatedDocument.All(u => u.SomeContent == content), GetTestName()); } [Fact] public async Task UpdateManyWithLinqFilterAndUpdateDefinitionAsync() { // Arrange var documents = CreateTestDocuments(2); SUT.AddMany(documents); var docIds = documents.Select(u => u.Id).ToArray(); var childrenToAdd = new List { new Child("testType1", "testValue1"), new Child("testType2", "testValue2") }; var updateDef = Builders.Update.AddToSetEach(p => p.Children, childrenToAdd); var content = GetContent(); // Act var result = await SUT.UpdateManyAsync(x => docIds.Contains(x.Id), updateDef, PartitionKey); // Assert Assert.True(result == 2, GetTestName()); var updatedDocuments = SUT.GetAll(x => docIds.Contains(x.Id), PartitionKey); Assert.True(updatedDocuments.Count == 2); updatedDocuments.ForEach(updatedDocument => { Assert.True(childrenToAdd[0].Type == updatedDocument.Children[0].Type, GetTestName()); Assert.True(childrenToAdd[0].Value == updatedDocument.Children[0].Value, GetTestName()); Assert.True(childrenToAdd[1].Type == updatedDocument.Children[1].Type, GetTestName()); Assert.True(childrenToAdd[1].Value == updatedDocument.Children[1].Value, GetTestName()); }); } [Fact] public async Task UpdateManyWithFilterAndUpdateDefinitionsAsync() { // Arrange var documents = CreateTestDocuments(2); SUT.AddMany(documents); var childrenToAdd = new List { new Child("testType1", "testValue1"), new Child("testType2", "testValue2") }; var updateDef = Builders.Update.AddToSetEach(p => p.Children, childrenToAdd); var docIds = documents.Select(u => u.Id).ToArray(); var filterDefinition = Builders.Filter.Where(x => docIds.Contains(x.Id)); var content = GetContent(); // Act var result = await SUT.UpdateManyAsync(filterDefinition, updateDef, PartitionKey); // Assert Assert.True(result == 2, GetTestName()); var updatedDocuments = SUT.GetAll(x => docIds.Contains(x.Id), PartitionKey); Assert.True(updatedDocuments.Count == 2); updatedDocuments.ForEach(updatedDocument => { Assert.True(childrenToAdd[0].Type == updatedDocument.Children[0].Type, GetTestName()); Assert.True(childrenToAdd[0].Value == updatedDocument.Children[0].Value, GetTestName()); Assert.True(childrenToAdd[1].Type == updatedDocument.Children[1].Type, GetTestName()); Assert.True(childrenToAdd[1].Value == updatedDocument.Children[1].Value, GetTestName()); }); } [Fact] public void UpdateManyWithLinqFilter() { // Arrange var documents = CreateTestDocuments(2); SUT.AddMany(documents); var docIds = documents.Select(u => u.Id).ToArray(); var content = GetContent(); // Act var result = SUT.UpdateMany(x => docIds.Contains(x.Id), x => x.SomeContent, content, PartitionKey); // Assert Assert.True(result == 2, GetTestName()); var updatedDocument = SUT.GetAll(x => docIds.Contains(x.Id), PartitionKey); Assert.True(updatedDocument.Count == 2); Assert.True(updatedDocument.All(u => u.SomeContent == content), GetTestName()); } [Fact] public void UpdateManyWithFilterDefinition() { // Arrange var documents = CreateTestDocuments(2); SUT.AddMany(documents); var docIds = documents.Select(u => u.Id).ToArray(); var filterDefinition = Builders.Filter.Where(x => docIds.Contains(x.Id)); var content = GetContent(); // Act var result = SUT.UpdateMany(filterDefinition, x => x.SomeContent, content, PartitionKey); // Assert Assert.True(result == 2, GetTestName()); var updatedDocument = SUT.GetAll(x => docIds.Contains(x.Id), PartitionKey); Assert.True(updatedDocument.Count == 2); Assert.True(updatedDocument.All(u => u.SomeContent == content), GetTestName()); } [Fact] public void UpdateManyWithLinqFilterAndUpdateDefinition() { // Arrange var documents = CreateTestDocuments(2); SUT.AddMany(documents); var docIds = documents.Select(u => u.Id).ToArray(); var childrenToAdd = new List { new Child("testType1", "testValue1"), new Child("testType2", "testValue2") }; var updateDef = Builders.Update.AddToSetEach(p => p.Children, childrenToAdd); var content = GetContent(); // Act var result = SUT.UpdateMany(x => docIds.Contains(x.Id), updateDef, PartitionKey); // Assert Assert.True(result == 2, GetTestName()); var updatedDocuments = SUT.GetAll(x => docIds.Contains(x.Id), PartitionKey); Assert.True(updatedDocuments.Count == 2); updatedDocuments.ForEach(updatedDocument => { Assert.True(childrenToAdd[0].Type == updatedDocument.Children[0].Type, GetTestName()); Assert.True(childrenToAdd[0].Value == updatedDocument.Children[0].Value, GetTestName()); Assert.True(childrenToAdd[1].Type == updatedDocument.Children[1].Type, GetTestName()); Assert.True(childrenToAdd[1].Value == updatedDocument.Children[1].Value, GetTestName()); }); } [Fact] public void UpdateManyWithFilterAndUpdateDefinitions() { // Arrange var documents = CreateTestDocuments(2); SUT.AddMany(documents); var childrenToAdd = new List { new Child("testType1", "testValue1"), new Child("testType2", "testValue2") }; var updateDef = Builders.Update.AddToSetEach(p => p.Children, childrenToAdd); var docIds = documents.Select(u => u.Id).ToArray(); var filterDefinition = Builders.Filter.Where(x => docIds.Contains(x.Id)); var content = GetContent(); // Act var result = SUT.UpdateMany(filterDefinition, updateDef, PartitionKey); // Assert Assert.True(result == 2, GetTestName()); var updatedDocuments = SUT.GetAll(x => docIds.Contains(x.Id), PartitionKey); Assert.True(updatedDocuments.Count == 2); updatedDocuments.ForEach(updatedDocument => { Assert.True(childrenToAdd[0].Type == updatedDocument.Children[0].Type, GetTestName()); Assert.True(childrenToAdd[0].Value == updatedDocument.Children[0].Value, GetTestName()); Assert.True(childrenToAdd[1].Type == updatedDocument.Children[1].Type, GetTestName()); Assert.True(childrenToAdd[1].Value == updatedDocument.Children[1].Value, GetTestName()); }); } #endregion Update Many } }