diff --git a/CoreUnitTests/.editorconfig b/CoreUnitTests/.editorconfig new file mode 100644 index 0000000..4db872d --- /dev/null +++ b/CoreUnitTests/.editorconfig @@ -0,0 +1,218 @@ +# All Files +[*] +charset = utf-8 +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true + +######################################### +# File Extension Settings +########################################## + +# .NET Style Rules +# https://docs.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/language-rules#net-style-rules +[*.cs] +# "this." and "Me." qualifiers +dotnet_style_qualification_for_field = false:warning +dotnet_style_qualification_for_property = false:warning +dotnet_style_qualification_for_method = false:warning +dotnet_style_qualification_for_event = false:warning +# Language keywords instead of framework type names for type references +dotnet_style_predefined_type_for_locals_parameters_members = true:warning +dotnet_style_predefined_type_for_member_access = true:warning +# Modifier preferences +dotnet_style_require_accessibility_modifiers = always:warning +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:warning +visual_basic_preferred_modifier_order = Partial,Default,Private,Protected,Public,Friend,NotOverridable,Overridable,MustOverride,Overloads,Overrides,MustInherit,NotInheritable,Static,Shared,Shadows,ReadOnly,WriteOnly,Dim,Const,WithEvents,Widening,Narrowing,Custom,Async:warning +dotnet_style_readonly_field = true:warning +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:warning +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:warning +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:warning +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:warning +# Expression-level preferences +dotnet_style_object_initializer = true:warning +dotnet_style_collection_initializer = true:warning +dotnet_style_explicit_tuple_names = true:warning +dotnet_style_prefer_inferred_tuple_names = true:warning +dotnet_style_prefer_inferred_anonymous_type_member_names = true:warning +dotnet_style_prefer_auto_properties = true:warning +dotnet_style_prefer_conditional_expression_over_assignment = false:suggestion +dotnet_diagnostic.IDE0045.severity = suggestion +dotnet_style_prefer_conditional_expression_over_return = false:suggestion +dotnet_diagnostic.IDE0046.severity = suggestion +dotnet_style_prefer_compound_assignment = true:warning +dotnet_style_prefer_simplified_interpolation = true:warning +dotnet_style_prefer_simplified_boolean_expressions = true:warning +# Null-checking preferences +dotnet_style_coalesce_expression = true:warning +dotnet_style_null_propagation = true:warning +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning +# File header preferences +# file_header_template = \n© PROJECT-AUTHOR\n +# If you use StyleCop, you'll need to disable SA1636: File header copyright text should match. +# dotnet_diagnostic.SA1636.severity = none +# Undocumented +dotnet_style_operator_placement_when_wrapping = end_of_line:warning +csharp_style_prefer_null_check_over_type_check = true:warning +dotnet_analyzer_diagnostic.severity = warning +dotnet_code_quality_unused_parameters = all:warning +dotnet_remove_unnecessary_suppression_exclusions = none:warning +dotnet_sort_system_directives_first = true +dotnet_separate_import_directive_groups = false +dotnet_style_namespace_match_folder = true:suggestion +dotnet_diagnostic.IDE0130.severity = suggestion +dotnet_naming_style.camel_case_style.capitalization = camel_case +dotnet_naming_style.pascal_case_style.capitalization = pascal_case +dotnet_naming_style.first_upper_style.capitalization = first_word_upper +dotnet_naming_style.prefix_interface_with_i_style.capitalization = pascal_case +dotnet_naming_style.prefix_interface_with_i_style.required_prefix = I +dotnet_naming_style.prefix_type_parameters_with_t_style.capitalization = pascal_case +dotnet_naming_style.prefix_type_parameters_with_t_style.required_prefix = T +dotnet_naming_style.disallowed_style.capitalization = pascal_case +dotnet_naming_style.disallowed_style.required_prefix = ____RULE_VIOLATION____ +dotnet_naming_style.disallowed_style.required_suffix = ____RULE_VIOLATION____ +dotnet_naming_style.internal_error_style.capitalization = pascal_case +dotnet_naming_style.internal_error_style.required_prefix = ____INTERNAL_ERROR____ +dotnet_naming_style.internal_error_style.required_suffix = ____INTERNAL_ERROR____ +dotnet_naming_symbols.public_protected_constant_fields_group.applicable_accessibilities = public, protected, protected_internal +dotnet_naming_symbols.public_protected_constant_fields_group.required_modifiers = const +dotnet_naming_symbols.public_protected_constant_fields_group.applicable_kinds = field +dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.symbols = public_protected_constant_fields_group +dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.style = pascal_case_style +dotnet_naming_rule.public_protected_constant_fields_must_be_pascal_case_rule.severity = warning +dotnet_naming_symbols.public_protected_static_readonly_fields_group.applicable_accessibilities = public, protected, protected_internal +dotnet_naming_symbols.public_protected_static_readonly_fields_group.required_modifiers = static, readonly +dotnet_naming_symbols.public_protected_static_readonly_fields_group.applicable_kinds = field +dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.symbols = public_protected_static_readonly_fields_group +dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.style = pascal_case_style +dotnet_naming_rule.public_protected_static_readonly_fields_must_be_pascal_case_rule.severity = warning +dotnet_naming_symbols.other_public_protected_fields_group.applicable_accessibilities = public, protected, protected_internal +dotnet_naming_symbols.other_public_protected_fields_group.applicable_kinds = field +dotnet_naming_rule.other_public_protected_fields_disallowed_rule.symbols = other_public_protected_fields_group +dotnet_naming_rule.other_public_protected_fields_disallowed_rule.style = disallowed_style +dotnet_naming_rule.other_public_protected_fields_disallowed_rule.severity = error +dotnet_naming_symbols.stylecop_constant_fields_group.applicable_accessibilities = public, internal, protected_internal, protected, private_protected, private +dotnet_naming_symbols.stylecop_constant_fields_group.required_modifiers = const +dotnet_naming_symbols.stylecop_constant_fields_group.applicable_kinds = field +dotnet_naming_rule.stylecop_constant_fields_must_be_pascal_case_rule.symbols = stylecop_constant_fields_group +dotnet_naming_rule.stylecop_constant_fields_must_be_pascal_case_rule.style = pascal_case_style +dotnet_naming_rule.stylecop_constant_fields_must_be_pascal_case_rule.severity = warning +dotnet_naming_symbols.stylecop_static_readonly_fields_group.applicable_accessibilities = public, internal, protected_internal, protected, private_protected, private +dotnet_naming_symbols.stylecop_static_readonly_fields_group.required_modifiers = static, readonly +dotnet_naming_symbols.stylecop_static_readonly_fields_group.applicable_kinds = field +dotnet_naming_rule.stylecop_static_readonly_fields_must_be_pascal_case_rule.symbols = stylecop_static_readonly_fields_group +dotnet_naming_rule.stylecop_static_readonly_fields_must_be_pascal_case_rule.style = pascal_case_style +dotnet_naming_rule.stylecop_static_readonly_fields_must_be_pascal_case_rule.severity = warning +dotnet_naming_symbols.stylecop_fields_must_be_private_group.applicable_accessibilities = public, internal, protected_internal, protected, private_protected +dotnet_naming_symbols.stylecop_fields_must_be_private_group.applicable_kinds = field +dotnet_naming_rule.stylecop_instance_fields_must_be_private_rule.symbols = stylecop_fields_must_be_private_group +dotnet_naming_rule.stylecop_instance_fields_must_be_private_rule.style = disallowed_style +dotnet_naming_rule.stylecop_instance_fields_must_be_private_rule.severity = error +dotnet_naming_symbols.stylecop_private_fields_group.applicable_accessibilities = private +dotnet_naming_symbols.stylecop_private_fields_group.applicable_kinds = field +dotnet_naming_rule.stylecop_private_fields_must_be_camel_case_rule.symbols = stylecop_private_fields_group +dotnet_naming_rule.stylecop_private_fields_must_be_camel_case_rule.style = camel_case_style +dotnet_naming_rule.stylecop_private_fields_must_be_camel_case_rule.severity = warning +dotnet_naming_symbols.stylecop_local_fields_group.applicable_accessibilities = local +dotnet_naming_symbols.stylecop_local_fields_group.applicable_kinds = local +dotnet_naming_rule.stylecop_local_fields_must_be_camel_case_rule.symbols = stylecop_local_fields_group +dotnet_naming_rule.stylecop_local_fields_must_be_camel_case_rule.style = camel_case_style +dotnet_naming_rule.stylecop_local_fields_must_be_camel_case_rule.severity = silent +dotnet_naming_symbols.sanity_check_uncovered_field_case_group.applicable_accessibilities = * +dotnet_naming_symbols.sanity_check_uncovered_field_case_group.applicable_kinds = field +dotnet_naming_rule.sanity_check_uncovered_field_case_rule.symbols = sanity_check_uncovered_field_case_group +dotnet_naming_rule.sanity_check_uncovered_field_case_rule.style = internal_error_style +dotnet_naming_rule.sanity_check_uncovered_field_case_rule.severity = error +dotnet_naming_symbols.element_group.applicable_kinds = namespace, class, enum, struct, delegate, event, method, property +dotnet_naming_rule.element_rule.symbols = element_group +dotnet_naming_rule.element_rule.style = pascal_case_style +dotnet_naming_rule.element_rule.severity = warning +dotnet_naming_symbols.interface_group.applicable_kinds = interface +dotnet_naming_rule.interface_rule.symbols = interface_group +dotnet_naming_rule.interface_rule.style = prefix_interface_with_i_style +dotnet_naming_rule.interface_rule.severity = warning +dotnet_naming_symbols.type_parameter_group.applicable_kinds = type_parameter +dotnet_naming_rule.type_parameter_rule.symbols = type_parameter_group +dotnet_naming_rule.type_parameter_rule.style = prefix_type_parameters_with_t_style +dotnet_naming_rule.type_parameter_rule.severity = warning +dotnet_naming_symbols.parameters_group.applicable_kinds = parameter +dotnet_naming_rule.parameters_rule.symbols = parameters_group +dotnet_naming_rule.parameters_rule.style = camel_case_style +dotnet_naming_rule.parameters_rule.severity = warning +csharp_style_var_for_built_in_types = true:warning +csharp_style_var_when_type_is_apparent = true:warning +csharp_style_var_elsewhere = true:warning +csharp_style_expression_bodied_methods = true:warning +csharp_style_expression_bodied_constructors = true:warning +csharp_style_expression_bodied_operators = true:warning +csharp_style_expression_bodied_properties = true:warning +csharp_style_expression_bodied_indexers = true:warning +csharp_style_expression_bodied_accessors = true:warning +csharp_style_expression_bodied_lambdas = true:warning +csharp_style_expression_bodied_local_functions = true:warning +csharp_style_pattern_matching_over_is_with_cast_check = true:warning +csharp_style_pattern_matching_over_as_with_null_check = true:warning +csharp_style_prefer_switch_expression = true:warning +csharp_style_prefer_pattern_matching = true:warning +csharp_style_prefer_not_pattern = true:warning +csharp_style_inlined_variable_declaration = true:warning +csharp_prefer_simple_default_expression = true:warning +csharp_style_pattern_local_over_anonymous_function = true:warning +csharp_style_deconstructed_variable_declaration = true:warning +csharp_style_prefer_index_operator = true:warning +csharp_style_prefer_range_operator = true:warning +csharp_style_implicit_object_creation_when_type_is_apparent = true:warning +csharp_style_throw_expression = true:warning +csharp_style_conditional_delegate_call = true:warning +csharp_prefer_braces = true:warning +csharp_prefer_simple_using_statement = true:suggestion +dotnet_diagnostic.IDE0063.severity = suggestion +csharp_using_directive_placement = outside_namespace +csharp_prefer_static_local_function = true:warning +csharp_style_unused_value_expression_statement_preference = discard_variable:suggestion +dotnet_diagnostic.IDE0058.severity = suggestion +csharp_style_unused_value_assignment_preference = discard_variable:suggestion +dotnet_diagnostic.IDE0059.severity = suggestion +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_between_query_expression_clauses = true +csharp_indent_case_contents = true +csharp_indent_switch_labels = true +csharp_indent_labels = no_change +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents_when_block = false +csharp_space_after_cast = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_between_parentheses = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_around_binary_operators = before_and_after +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_after_comma = true +csharp_space_before_comma = false +csharp_space_after_dot = false +csharp_space_before_dot = false +csharp_space_after_semicolon_in_for_statement = true +csharp_space_before_semicolon_in_for_statement = false +csharp_space_around_declaration_statements = false +csharp_space_before_open_square_brackets = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_square_brackets = false +csharp_preserve_single_line_statements = false +csharp_preserve_single_line_blocks = true +csharp_style_namespace_declarations = file_scoped:warning +dotnet_diagnostic.CA1707.severity = none + + diff --git a/CoreUnitTests/BaseMongoRepositoryTests/AddTests/AddManyTests.cs b/CoreUnitTests/BaseMongoRepositoryTests/AddTests/AddManyTests.cs index 292e451..3fd2788 100644 --- a/CoreUnitTests/BaseMongoRepositoryTests/AddTests/AddManyTests.cs +++ b/CoreUnitTests/BaseMongoRepositoryTests/AddTests/AddManyTests.cs @@ -12,13 +12,13 @@ namespace CoreUnitTests.BaseMongoRepositoryTests.AddTests; public class AddManyTests : TestMongoRepositoryContext { - + [Fact] public async Task AddManyAsync_EnsureTokenPassed() { // Arrange Creator = new Mock(); - var token = new CancellationToken(); + var token = new CancellationToken(true); var documents = new List { new(), new(), new() @@ -30,4 +30,4 @@ public class AddManyTests : TestMongoRepositoryContext // Assert Creator.Verify(x => x.AddManyAsync(documents, token)); } -} \ No newline at end of file +} diff --git a/CoreUnitTests/BaseMongoRepositoryTests/AddTests/AddOneTests.cs b/CoreUnitTests/BaseMongoRepositoryTests/AddTests/AddOneTests.cs index dc290da..6396c7f 100644 --- a/CoreUnitTests/BaseMongoRepositoryTests/AddTests/AddOneTests.cs +++ b/CoreUnitTests/BaseMongoRepositoryTests/AddTests/AddOneTests.cs @@ -16,7 +16,7 @@ public class AddOneTests : TestMongoRepositoryContext { // Arrange Creator = new Mock(); - var token = new CancellationToken(); + var token = new CancellationToken(true); var document = new TestDocument(); // Act @@ -25,4 +25,4 @@ public class AddOneTests : TestMongoRepositoryContext // Assert Creator.Verify(x => x.AddOneAsync(document, token)); } -} \ No newline at end of file +} diff --git a/CoreUnitTests/BaseMongoRepositoryTests/DeleteTests/DeleteManyAsyncTests.cs b/CoreUnitTests/BaseMongoRepositoryTests/DeleteTests/DeleteManyAsyncTests.cs index 83b8f21..2feed33 100644 --- a/CoreUnitTests/BaseMongoRepositoryTests/DeleteTests/DeleteManyAsyncTests.cs +++ b/CoreUnitTests/BaseMongoRepositoryTests/DeleteTests/DeleteManyAsyncTests.cs @@ -42,7 +42,7 @@ public class DeleteManyAsyncTests : TestMongoRepositoryContext // Arrange var documents = Fixture.CreateMany().ToList(); var count = Fixture.Create(); - var cancellationToken = new CancellationToken(); + var cancellationToken = new CancellationToken(true); Eraser = new Mock(); Eraser @@ -89,7 +89,7 @@ public class DeleteManyAsyncTests : TestMongoRepositoryContext // Arrange var content = Fixture.Create(); var count = Fixture.Create(); - var token = new CancellationToken(); + var token = new CancellationToken(true); Expression> filter = x => x.SomeContent == content; @@ -144,7 +144,7 @@ public class DeleteManyAsyncTests : TestMongoRepositoryContext var content = Fixture.Create(); var count = Fixture.Create(); var partitionKey = Fixture.Create(); - var token = new CancellationToken(); + var token = new CancellationToken(true); Expression> filter = x => x.SomeContent == content; @@ -193,19 +193,20 @@ public class DeleteManyAsyncTests : TestMongoRepositoryContext // Arrange var documents = Fixture.CreateMany>().ToList(); var count = Fixture.Create(); - var cancellationToken = new CancellationToken(); + var cancellationToken = new CancellationToken(true); Eraser = new Mock(); Eraser - .Setup(x => x.DeleteManyAsync, int>(It.IsAny>>(), It.IsAny())) - .ReturnsAsync(count); + .Setup(x => x.DeleteManyAsync, int>(documents, cancellationToken)) + .ReturnsAsync(count) + .Verifiable(); // Act var result = await Sut.DeleteManyAsync, int>(documents, cancellationToken); // Assert result.Should().Be(count); - Eraser.Verify(x => x.DeleteManyAsync, int>(documents, cancellationToken), Times.Once); + Eraser.Verify(); } [Fact] @@ -240,7 +241,7 @@ public class DeleteManyAsyncTests : TestMongoRepositoryContext // Arrange var content = Fixture.Create(); var count = Fixture.Create(); - var token = new CancellationToken(); + var token = new CancellationToken(true); Expression, bool>> filter = x => x.SomeContent == content; @@ -295,7 +296,7 @@ public class DeleteManyAsyncTests : TestMongoRepositoryContext var content = Fixture.Create(); var count = Fixture.Create(); var partitionKey = Fixture.Create(); - var token = new CancellationToken(); + var token = new CancellationToken(true); Expression, bool>> filter = x => x.SomeContent == content; @@ -317,4 +318,4 @@ public class DeleteManyAsyncTests : TestMongoRepositoryContext } #endregion -} \ No newline at end of file +} diff --git a/CoreUnitTests/BaseMongoRepositoryTests/DeleteTests/DeleteOneAsyncTests.cs b/CoreUnitTests/BaseMongoRepositoryTests/DeleteTests/DeleteOneAsyncTests.cs index d99e762..9f0fcfe 100644 --- a/CoreUnitTests/BaseMongoRepositoryTests/DeleteTests/DeleteOneAsyncTests.cs +++ b/CoreUnitTests/BaseMongoRepositoryTests/DeleteTests/DeleteOneAsyncTests.cs @@ -40,7 +40,7 @@ public class DeleteOneAsyncTests : TestMongoRepositoryContext // Arrange var document = Fixture.Create(); var count = Fixture.Create(); - var token = new CancellationToken(); + var token = new CancellationToken(true); Eraser = new Mock(); @@ -85,7 +85,7 @@ public class DeleteOneAsyncTests : TestMongoRepositoryContext // Arrange var count = Fixture.Create(); var content = Fixture.Create(); - var token = new CancellationToken(); + var token = new CancellationToken(true); Expression> filter = x => x.SomeContent == content; @@ -134,7 +134,7 @@ public class DeleteOneAsyncTests : TestMongoRepositoryContext var count = Fixture.Create(); var content = Fixture.Create(); var partitionKey = Fixture.Create(); - var token = new CancellationToken(); + var token = new CancellationToken(true); Expression> filter = x => x.SomeContent == content; @@ -180,7 +180,7 @@ public class DeleteOneAsyncTests : TestMongoRepositoryContext // Arrange var document = Fixture.Create>(); var count = Fixture.Create(); - var token = new CancellationToken(); + var token = new CancellationToken(true); Eraser = new Mock(); @@ -225,7 +225,7 @@ public class DeleteOneAsyncTests : TestMongoRepositoryContext // Arrange var count = Fixture.Create(); var content = Fixture.Create(); - var token = new CancellationToken(); + var token = new CancellationToken(true); Expression, bool>> filter = x => x.SomeContent == content; @@ -274,7 +274,7 @@ public class DeleteOneAsyncTests : TestMongoRepositoryContext var count = Fixture.Create(); var content = Fixture.Create(); var partitionKey = Fixture.Create(); - var token = new CancellationToken(); + var token = new CancellationToken(true); Expression, bool>> filter = x => x.SomeContent == content; @@ -293,4 +293,4 @@ public class DeleteOneAsyncTests : TestMongoRepositoryContext } #endregion -} \ No newline at end of file +} diff --git a/CoreUnitTests/BaseMongoRepositoryTests/DeleteTests/DeleteOneTests.cs b/CoreUnitTests/BaseMongoRepositoryTests/DeleteTests/DeleteOneTests.cs index 5d6385c..bb23e69 100644 --- a/CoreUnitTests/BaseMongoRepositoryTests/DeleteTests/DeleteOneTests.cs +++ b/CoreUnitTests/BaseMongoRepositoryTests/DeleteTests/DeleteOneTests.cs @@ -1,15 +1,16 @@ -using System; +namespace CoreUnitTests.BaseMongoRepositoryTests.DeleteTests; + +using System; using System.Linq.Expressions; +using System.Threading; using AutoFixture; -using CoreUnitTests.Infrastructure; -using CoreUnitTests.Infrastructure.Model; using FluentAssertions; +using Infrastructure; +using Infrastructure.Model; using MongoDbGenericRepository.DataAccess.Delete; using Moq; using Xunit; -namespace CoreUnitTests.BaseMongoRepositoryTests.DeleteTests; - public class DeleteOneTests : TestMongoRepositoryContext { [Fact] @@ -21,7 +22,7 @@ public class DeleteOneTests : TestMongoRepositoryContext Eraser = new Mock(); Eraser - .Setup(x => x.DeleteOne(It.IsAny())) + .Setup(x => x.DeleteOne(It.IsAny(), It.IsAny())) .Returns(count); // Act @@ -29,7 +30,28 @@ public class DeleteOneTests : TestMongoRepositoryContext // Assert result.Should().Be(count); - Eraser.Verify(x => x.DeleteOne(document), Times.Once); + Eraser.Verify(x => x.DeleteOne(document, CancellationToken.None), Times.Once); + } + + [Fact] + public void WithDocumentAndCancellationToken_ShouldDeleteOne() + { + // Arrange + var document = Fixture.Create(); + var count = Fixture.Create(); + var token = new CancellationToken(true); + Eraser = new Mock(); + + Eraser + .Setup(x => x.DeleteOne(It.IsAny(), It.IsAny())) + .Returns(count); + + // Act + var result = Sut.DeleteOne(document, token); + + // Assert + result.Should().Be(count); + Eraser.Verify(x => x.DeleteOne(document, token), Times.Once); } [Fact] @@ -44,7 +66,7 @@ public class DeleteOneTests : TestMongoRepositoryContext Eraser = new Mock(); Eraser - .Setup(x => x.DeleteOne(It.IsAny>>(), It.IsAny())) + .Setup(x => x.DeleteOne(It.IsAny>>(), It.IsAny(), It.IsAny())) .Returns(count); // Act @@ -52,7 +74,35 @@ public class DeleteOneTests : TestMongoRepositoryContext // Assert result.Should().Be(count); - Eraser.Verify(x => x.DeleteOne(filter, null), Times.Once); + Eraser.Verify(x => x.DeleteOne(filter, null, CancellationToken.None), Times.Once); + } + + [Fact] + public void WithFilterAndCancellationToken_ShouldDeleteOne() + { + // Arrange + var count = Fixture.Create(); + var content = Fixture.Create(); + var token = new CancellationToken(true); + + Expression> filter = x => x.SomeContent == content; + + Eraser = new Mock(); + + Eraser + .Setup( + x => x.DeleteOne( + It.IsAny>>(), + It.IsAny(), + It.IsAny())) + .Returns(count); + + // Act + var result = Sut.DeleteOne(filter, token); + + // Assert + result.Should().Be(count); + Eraser.Verify(x => x.DeleteOne(filter, null, token), Times.Once); } [Fact] @@ -68,7 +118,11 @@ public class DeleteOneTests : TestMongoRepositoryContext Eraser = new Mock(); Eraser - .Setup(x => x.DeleteOne(It.IsAny>>(), It.IsAny())) + .Setup( + x => x.DeleteOne( + It.IsAny>>(), + It.IsAny(), + It.IsAny())) .Returns(count); // Act @@ -76,7 +130,36 @@ public class DeleteOneTests : TestMongoRepositoryContext // Assert result.Should().Be(count); - Eraser.Verify(x => x.DeleteOne(filter, partitionKey), Times.Once); + Eraser.Verify(x => x.DeleteOne(filter, partitionKey, CancellationToken.None), Times.Once); + } + + [Fact] + public void WithFilterAndPartitionKeyAndCancellationToken_ShouldDeleteOne() + { + // Arrange + var count = Fixture.Create(); + var content = Fixture.Create(); + var partitionKey = Fixture.Create(); + var token = new CancellationToken(true); + + Expression> filter = x => x.SomeContent == content; + + Eraser = new Mock(); + + Eraser + .Setup( + x => x.DeleteOne( + It.IsAny>>(), + It.IsAny(), + It.IsAny())) + .Returns(count); + + // Act + var result = Sut.DeleteOne(filter, partitionKey, token); + + // Assert + result.Should().Be(count); + Eraser.Verify(x => x.DeleteOne(filter, partitionKey, token), Times.Once); } [Fact] @@ -88,7 +171,7 @@ public class DeleteOneTests : TestMongoRepositoryContext Eraser = new Mock(); Eraser - .Setup(x => x.DeleteOne, int>(It.IsAny>())) + .Setup(x => x.DeleteOne, int>(It.IsAny>(), It.IsAny())) .Returns(count); // Act @@ -96,8 +179,30 @@ public class DeleteOneTests : TestMongoRepositoryContext // Assert result.Should().Be(count); - Eraser.Verify(x => x.DeleteOne, int>(document), Times.Once); + Eraser.Verify(x => x.DeleteOne, int>(document, CancellationToken.None), Times.Once); } + + [Fact] + public void WithKeyedDocumentAndCancellationToken_ShouldDeleteOne() + { + // Arrange + var document = Fixture.Create>(); + var count = Fixture.Create(); + var token = new CancellationToken(true); + Eraser = new Mock(); + + Eraser + .Setup(x => x.DeleteOne, int>(It.IsAny>(), It.IsAny())) + .Returns(count); + + // Act + var result = Sut.DeleteOne, int>(document, token); + + // Assert + result.Should().Be(count); + Eraser.Verify(x => x.DeleteOne, int>(document, token), Times.Once); + } + [Fact] public void Keyed_WithFilter_ShouldDeleteOne() { @@ -110,7 +215,11 @@ public class DeleteOneTests : TestMongoRepositoryContext Eraser = new Mock(); Eraser - .Setup(x => x.DeleteOne, int>(It.IsAny, bool>>>(), It.IsAny())) + .Setup( + x => x.DeleteOne, int>( + It.IsAny, bool>>>(), + It.IsAny(), + It.IsAny())) .Returns(count); // Act @@ -118,7 +227,35 @@ public class DeleteOneTests : TestMongoRepositoryContext // Assert result.Should().Be(count); - Eraser.Verify(x => x.DeleteOne, int>(filter, null), Times.Once); + Eraser.Verify(x => x.DeleteOne, int>(filter, null, CancellationToken.None), Times.Once); + } + + [Fact] + public void Keyed_WithFilterAndCancellationToken_ShouldDeleteOne() + { + // Arrange + var count = Fixture.Create(); + var content = Fixture.Create(); + var token = new CancellationToken(true); + + Expression, bool>> filter = x => x.SomeContent == content; + + Eraser = new Mock(); + + Eraser + .Setup( + x => x.DeleteOne, int>( + It.IsAny, bool>>>(), + It.IsAny(), + It.IsAny())) + .Returns(count); + + // Act + var result = Sut.DeleteOne, int>(filter, token); + + // Assert + result.Should().Be(count); + Eraser.Verify(x => x.DeleteOne, int>(filter, null, token), Times.Once); } [Fact] @@ -134,7 +271,11 @@ public class DeleteOneTests : TestMongoRepositoryContext Eraser = new Mock(); Eraser - .Setup(x => x.DeleteOne, int>(It.IsAny, bool>>>(), It.IsAny())) + .Setup( + x => x.DeleteOne, int>( + It.IsAny, bool>>>(), + It.IsAny(), + It.IsAny())) .Returns(count); // Act @@ -142,6 +283,35 @@ public class DeleteOneTests : TestMongoRepositoryContext // Assert result.Should().Be(count); - Eraser.Verify(x => x.DeleteOne, int>(filter, partitionKey), Times.Once); + Eraser.Verify(x => x.DeleteOne, int>(filter, partitionKey, CancellationToken.None), Times.Once); } -} \ No newline at end of file + + [Fact] + public void Keyed_WithFilterAndPartitionKeyAndCancellationToken_ShouldDeleteOne() + { + // Arrange + var count = Fixture.Create(); + var content = Fixture.Create(); + var partitionKey = Fixture.Create(); + var token = new CancellationToken(true); + + Expression, bool>> filter = x => x.SomeContent == content; + + Eraser = new Mock(); + + Eraser + .Setup( + x => x.DeleteOne, int>( + It.IsAny, bool>>>(), + It.IsAny(), + It.IsAny())) + .Returns(count); + + // Act + var result = Sut.DeleteOne, int>(filter, partitionKey, token); + + // Assert + result.Should().Be(count); + Eraser.Verify(x => x.DeleteOne, int>(filter, partitionKey, token), Times.Once); + } +} diff --git a/CoreUnitTests/BaseMongoRepositoryTests/IndexTests/CreateAscendingIndexTests.cs b/CoreUnitTests/BaseMongoRepositoryTests/IndexTests/CreateAscendingIndexTests.cs index abdb22c..85b5b70 100644 --- a/CoreUnitTests/BaseMongoRepositoryTests/IndexTests/CreateAscendingIndexTests.cs +++ b/CoreUnitTests/BaseMongoRepositoryTests/IndexTests/CreateAscendingIndexTests.cs @@ -16,7 +16,7 @@ public class CreateAscendingIndexTests : BaseIndexTests { // Arrange IndexHandler = new Mock(); - var token = new CancellationToken(); + var token = new CancellationToken(true); // Act Expression> fieldExpression = t => t.SomeContent2; @@ -26,4 +26,4 @@ public class CreateAscendingIndexTests : BaseIndexTests IndexHandler.Verify(x => x.CreateAscendingIndexAsync( fieldExpression, null, null, token)); }*/ -} \ No newline at end of file +} diff --git a/CoreUnitTests/BaseMongoRepositoryTests/IndexTests/CreateTextIndexTests.cs b/CoreUnitTests/BaseMongoRepositoryTests/IndexTests/CreateTextIndexTests.cs index 0d216d3..e7dd3be 100644 --- a/CoreUnitTests/BaseMongoRepositoryTests/IndexTests/CreateTextIndexTests.cs +++ b/CoreUnitTests/BaseMongoRepositoryTests/IndexTests/CreateTextIndexTests.cs @@ -67,7 +67,7 @@ public class CreateTextIndexTests : BaseIndexTests { // Arrange IndexHandler = new Mock(); - var token = new CancellationToken(); + var token = new CancellationToken(true); // Act await Sut.CreateTextIndexAsync(_fieldExpression, token); @@ -82,7 +82,7 @@ public class CreateTextIndexTests : BaseIndexTests { // Arrange IndexHandler = new Mock(); - var token = new CancellationToken(); + var token = new CancellationToken(true); var options = new IndexCreationOptions { Name = "theIndexName" }; // Act @@ -99,7 +99,7 @@ public class CreateTextIndexTests : BaseIndexTests { // Arrange const string partitionKey = "thePartitionKey"; - var token = new CancellationToken(); + var token = new CancellationToken(true); IndexHandler = new Mock(); // Act @@ -130,7 +130,7 @@ public class CreateTextIndexTests : BaseIndexTests { // Arrange IndexHandler = new Mock(); - var token = new CancellationToken(); + var token = new CancellationToken(true); // Act await Sut.CreateTextIndexAsync(t => t.SomeContent2, token); @@ -179,7 +179,7 @@ public class CreateTextIndexTests : BaseIndexTests // Arrange const string partitionKey = "thePartitionKey"; const string indexName = "theIndexName"; - var token = new CancellationToken(); + var token = new CancellationToken(true); var options = new IndexCreationOptions { Name = indexName }; IndexHandler = new Mock(); @@ -192,4 +192,4 @@ public class CreateTextIndexTests : BaseIndexTests t => t.SomeContent2, options, partitionKey, token)); } */ -} \ No newline at end of file +} diff --git a/CoreUnitTests/BaseMongoRepositoryTests/IndexTests/GetIndexNamesTests.cs b/CoreUnitTests/BaseMongoRepositoryTests/IndexTests/GetIndexNamesTests.cs index 9fbae96..a23350a 100644 --- a/CoreUnitTests/BaseMongoRepositoryTests/IndexTests/GetIndexNamesTests.cs +++ b/CoreUnitTests/BaseMongoRepositoryTests/IndexTests/GetIndexNamesTests.cs @@ -37,7 +37,7 @@ public class GetIndexNamesTests : BaseIndexTests { // Arrange const string indexName = "theIndexName"; - var token = new CancellationToken(); + var token = new CancellationToken(true); IndexHandler = new Mock(); IndexHandler .Setup(x => x.GetIndexesNamesAsync(null, token)) @@ -78,7 +78,7 @@ public class GetIndexNamesTests : BaseIndexTests // Arrange const string partitionKey = "thePartitionKey"; const string indexName = "theIndexName"; - var token = new CancellationToken(); + var token = new CancellationToken(true); IndexHandler = new Mock(); IndexHandler @@ -117,7 +117,7 @@ public class GetIndexNamesTests : BaseIndexTests { // Arrange const string indexName = "theIndexName"; - var token = new CancellationToken(); + var token = new CancellationToken(true); IndexHandler = new Mock(); IndexHandler .Setup(x => x.GetIndexesNamesAsync(null, token)) @@ -157,7 +157,7 @@ public class GetIndexNamesTests : BaseIndexTests // Arrange const string indexName = "theIndexName"; const string partitionKey = "thePartitionKey"; - var token = new CancellationToken(); + var token = new CancellationToken(true); IndexHandler = new Mock(); IndexHandler @@ -171,4 +171,4 @@ public class GetIndexNamesTests : BaseIndexTests Assert.NotNull(result); Assert.Contains(result, x => x == indexName); }*/ -} \ No newline at end of file +} diff --git a/CoreUnitTests/BaseMongoRepositoryTests/MainTests/AnyTests.cs b/CoreUnitTests/BaseMongoRepositoryTests/MainTests/AnyTests.cs index a697fe5..7d8c18d 100644 --- a/CoreUnitTests/BaseMongoRepositoryTests/MainTests/AnyTests.cs +++ b/CoreUnitTests/BaseMongoRepositoryTests/MainTests/AnyTests.cs @@ -16,7 +16,7 @@ public class AnyTests : TestMongoRepositoryContext public async Task AnyAsync_EnsureTokenPassed() { // Arrange - var token = new CancellationToken(); + var token = new CancellationToken(true); Reader = new Mock(); Reader @@ -31,4 +31,4 @@ public class AnyTests : TestMongoRepositoryContext .Verify(x => x.AnyAsync( t => string.IsNullOrWhiteSpace(t.SomeContent2), null, token)); }*/ -} \ No newline at end of file +} diff --git a/CoreUnitTests/BaseMongoRepositoryTests/MainTests/CountTests.cs b/CoreUnitTests/BaseMongoRepositoryTests/MainTests/CountTests.cs index f84db84..7c5c0c2 100644 --- a/CoreUnitTests/BaseMongoRepositoryTests/MainTests/CountTests.cs +++ b/CoreUnitTests/BaseMongoRepositoryTests/MainTests/CountTests.cs @@ -16,7 +16,7 @@ public class CountTests : TestMongoRepositoryContext public async Task CountAsync_EnsureTokenPassed() { // Arrange - var token = new CancellationToken(); + var token = new CancellationToken(true); Reader = new Mock(); Reader @@ -31,4 +31,4 @@ public class CountTests : TestMongoRepositoryContext Reader.Verify(x => x.CountAsync( t => string.IsNullOrWhiteSpace(t.SomeContent2), null, token)); }*/ -} \ No newline at end of file +} diff --git a/CoreUnitTests/CoreUnitTests.csproj b/CoreUnitTests/CoreUnitTests.csproj index 3e3ce97..d417073 100644 --- a/CoreUnitTests/CoreUnitTests.csproj +++ b/CoreUnitTests/CoreUnitTests.csproj @@ -5,10 +5,13 @@ warnings false + true + latest + diff --git a/CoreUnitTests/DataAccessTests/MongoDbEraserTests/DeleteOneTests.cs b/CoreUnitTests/DataAccessTests/MongoDbEraserTests/DeleteOneTests.cs new file mode 100644 index 0000000..a3506be --- /dev/null +++ b/CoreUnitTests/DataAccessTests/MongoDbEraserTests/DeleteOneTests.cs @@ -0,0 +1,202 @@ +using System; +using System.Linq.Expressions; +using System.Threading; +using AutoFixture; +using CoreUnitTests.Infrastructure; +using CoreUnitTests.Infrastructure.Model; +using FluentAssertions; +using MongoDB.Driver; +using MongoDbGenericRepository; +using MongoDbGenericRepository.DataAccess.Delete; +using Moq; +using Xunit; + +namespace CoreUnitTests.DataAccessTests.MongoDbEraserTests; + +public class DeleteOneTests : GenericTestContext +{ + [Fact] + public void WithDocument_DeletesOne() + { + // Arrange + var count = Fixture.Create(); + var document = Fixture.Create(); + var collection = MockOf>(); + + collection + .Setup(x => x.DeleteOne(It.IsAny>(), It.IsAny())) + .Returns(new DeleteResult.Acknowledged(count)); + + var dbContext = MockOf(); + dbContext + .Setup(x => x.GetCollection(null)) + .Returns(Fixture.Create>()); + + // Act + var result = Sut.DeleteOne(document); + + // Assert + result.Should().Be(count); + + var expectedFilter = Builders.Filter.Eq("Id", document.Id); + collection.Verify( + x => x.DeleteOne( + It.Is>(f => f.EquivalentTo(expectedFilter)), + CancellationToken.None)); + } + + [Fact] + public void WithDocumentAndCancellationToken_DeletesOne() + { + // Arrange + var count = Fixture.Create(); + var document = Fixture.Create(); + var token = new CancellationToken(true); + + var collection = MockOf>(); + collection + .Setup(x => x.DeleteOne(It.IsAny>(), It.IsAny())) + .Returns(new DeleteResult.Acknowledged(count)); + + var dbContext = MockOf(); + dbContext + .Setup(x => x.GetCollection(null)) + .Returns(Fixture.Create>()); + + // Act + var result = Sut.DeleteOne(document, token); + + // Assert + result.Should().Be(count); + + var expectedFilter = Builders.Filter.Eq("Id", document.Id); + collection.Verify( + x => x.DeleteOne( + It.Is>(f => f.EquivalentTo(expectedFilter)), + token)); + } + + [Fact] + public void WithFilter_DeletesOne() + { + // Arrange + var count = Fixture.Create(); + var document = Fixture.Create(); + + var collection = MockOf>(); + collection + .Setup(x => x.DeleteOne(It.IsAny>(), It.IsAny())) + .Returns(new DeleteResult.Acknowledged(count)); + + var dbContext = MockOf(); + dbContext + .Setup(x => x.GetCollection(null)) + .Returns(Fixture.Create>()); + + Expression> filter = d => d.SomeContent == document.SomeContent; + + // Act + var result = Sut.DeleteOne(filter); + + // Assert + result.Should().Be(count); + collection.Verify( + x => x.DeleteOne( + It.Is>(f => f.EquivalentTo(filter)), CancellationToken.None)); + } + + [Fact] + public void WithFilterAndCancellationToken_DeletesOne() + { + // Arrange + var count = Fixture.Create(); + var document = Fixture.Create(); + var token = new CancellationToken(true); + + var collection = MockOf>(); + collection + .Setup(x => x.DeleteOne(It.IsAny>(), It.IsAny())) + .Returns(new DeleteResult.Acknowledged(count)); + + var dbContext = MockOf(); + dbContext + .Setup(x => x.GetCollection(null)) + .Returns(Fixture.Create>()); + + Expression> filter = d => d.Id == document.Id; + + // Act + var result = Sut.DeleteOne(filter, cancellationToken: token); + + // Assert + result.Should().Be(count); + collection.Verify( + x => x.DeleteOne( + It.Is>(f => f.EquivalentTo(filter)), token)); + } + + [Fact] + public void WithFilterAndPartitionKey_DeletesOne() + { + // Arrange + var count = Fixture.Create(); + var document = Fixture.Create(); + var partitionKey = Fixture.Create(); + + var collection = MockOf>(); + collection + .Setup(x => x.DeleteOne(It.IsAny>(), It.IsAny())) + .Returns(new DeleteResult.Acknowledged(count)); + + var dbContext = MockOf(); + dbContext + .Setup(x => x.GetCollection(It.IsAny())) + .Returns(Fixture.Create>()); + + Expression> filter = d => d.Id == document.Id; + + // Act + var result = Sut.DeleteOne(filter, partitionKey); + + // Assert + result.Should().Be(count); + collection.Verify( + x => x.DeleteOne( + It.Is>(f => f.EquivalentTo(filter)), CancellationToken.None)); + + dbContext.Verify(x => x.GetCollection(partitionKey)); + } + + [Fact] + public void WithFilterAndPartitionKeyAndCancellationToken_DeletesOne() + { + // Arrange + var count = Fixture.Create(); + var document = Fixture.Create(); + var partitionKey = Fixture.Create(); + var token = new CancellationToken(true); + + var collection = MockOf>(); + collection + .Setup(x => x.DeleteOne(It.IsAny>(), It.IsAny())) + .Returns(new DeleteResult.Acknowledged(count)); + + var dbContext = MockOf(); + dbContext + .Setup(x => x.GetCollection(It.IsAny())) + .Returns(Fixture.Create>()); + + Expression> filter = d => d.Id == document.Id; + + // Act + var result = Sut.DeleteOne(filter, partitionKey, token); + + // Assert + result.Should().Be(count); + collection.Verify( + x => x.DeleteOne( + It.Is>(f => f.EquivalentTo(filter)), token)); + + dbContext.Verify(x => x.GetCollection(partitionKey)); + } +} diff --git a/CoreUnitTests/Infrastructure/FilterDefinitionExtensions.cs b/CoreUnitTests/Infrastructure/FilterDefinitionExtensions.cs new file mode 100644 index 0000000..adcaca5 --- /dev/null +++ b/CoreUnitTests/Infrastructure/FilterDefinitionExtensions.cs @@ -0,0 +1,14 @@ +namespace CoreUnitTests.Infrastructure; + +using MongoDB.Bson; +using MongoDB.Bson.Serialization; +using MongoDB.Driver; + +public static class FilterDefinitionExtensions +{ + public static string RenderToJson(this FilterDefinition filter) + => filter.Render(BsonSerializer.SerializerRegistry.GetSerializer(), BsonSerializer.SerializerRegistry).ToJson(); + + public static bool EquivalentTo(this FilterDefinition filter, FilterDefinition other) + => filter.RenderToJson() == other.RenderToJson(); +} diff --git a/CoreUnitTests/Infrastructure/GenericTestContext.cs b/CoreUnitTests/Infrastructure/GenericTestContext.cs new file mode 100644 index 0000000..9b0a708 --- /dev/null +++ b/CoreUnitTests/Infrastructure/GenericTestContext.cs @@ -0,0 +1,23 @@ +using AutoFixture; +using AutoFixture.AutoMoq; +using Moq; + +namespace CoreUnitTests.Infrastructure; + +public class GenericTestContext +{ + public GenericTestContext() + { + Fixture = new Fixture().Customize(new AutoMoqCustomization()); + } + + protected Mock MockOf() + where T : class + { + return Fixture.Freeze>(); + } + + protected IFixture Fixture { get; set; } + + protected TSut Sut { get => Fixture.Create(); } +} \ No newline at end of file diff --git a/CoreUnitTests/Infrastructure/Model/PartitionedTestDocument.cs b/CoreUnitTests/Infrastructure/Model/PartitionedTestDocument.cs new file mode 100644 index 0000000..da6e69f --- /dev/null +++ b/CoreUnitTests/Infrastructure/Model/PartitionedTestDocument.cs @@ -0,0 +1,9 @@ +using MongoDbGenericRepository.Models; + +namespace CoreUnitTests.Infrastructure.Model; + +public class PartitionedTestDocument : TestDocument, IPartitionedDocument +{ + /// + public string PartitionKey { get; set; } = "PartitionedTestDocument"; +} \ No newline at end of file diff --git a/CoreUnitTests/KeyTypedRepositoryTests/DeleteTests/DeleteManyAsyncTests.cs b/CoreUnitTests/KeyTypedRepositoryTests/DeleteTests/DeleteManyAsyncTests.cs index 4b95709..22981c8 100644 --- a/CoreUnitTests/KeyTypedRepositoryTests/DeleteTests/DeleteManyAsyncTests.cs +++ b/CoreUnitTests/KeyTypedRepositoryTests/DeleteTests/DeleteManyAsyncTests.cs @@ -42,7 +42,7 @@ public class DeleteManyAsyncTests : TestKeyedMongoRepositoryContext // Arrange var documents = Fixture.CreateMany>().ToList(); var count = Fixture.Create(); - var cancellationToken = new CancellationToken(); + var cancellationToken = new CancellationToken(true); Eraser = new Mock(); Eraser @@ -89,7 +89,7 @@ public class DeleteManyAsyncTests : TestKeyedMongoRepositoryContext // Arrange var content = Fixture.Create(); var count = Fixture.Create(); - var token = new CancellationToken(); + var token = new CancellationToken(true); Expression, bool>> filter = x => x.SomeContent == content; @@ -144,7 +144,7 @@ public class DeleteManyAsyncTests : TestKeyedMongoRepositoryContext var content = Fixture.Create(); var count = Fixture.Create(); var partitionKey = Fixture.Create(); - var token = new CancellationToken(); + var token = new CancellationToken(true); Expression, bool>> filter = x => x.SomeContent == content; @@ -164,4 +164,4 @@ public class DeleteManyAsyncTests : TestKeyedMongoRepositoryContext result.Should().Be(count); Eraser.Verify(x => x.DeleteManyAsync, int>(filter, partitionKey, token), Times.Once); } -} \ No newline at end of file +} diff --git a/CoreUnitTests/KeyTypedRepositoryTests/DeleteTests/DeleteOneAsyncTests.cs b/CoreUnitTests/KeyTypedRepositoryTests/DeleteTests/DeleteOneAsyncTests.cs index de0c204..4949a8f 100644 --- a/CoreUnitTests/KeyTypedRepositoryTests/DeleteTests/DeleteOneAsyncTests.cs +++ b/CoreUnitTests/KeyTypedRepositoryTests/DeleteTests/DeleteOneAsyncTests.cs @@ -40,7 +40,7 @@ public class DeleteOneAsyncTests : TestKeyedMongoRepositoryContext // Arrange var document = Fixture.Create>(); var count = Fixture.Create(); - var token = new CancellationToken(); + var token = new CancellationToken(true); Eraser = new Mock(); @@ -85,7 +85,7 @@ public class DeleteOneAsyncTests : TestKeyedMongoRepositoryContext // Arrange var count = Fixture.Create(); var content = Fixture.Create(); - var token = new CancellationToken(); + var token = new CancellationToken(true); Expression, bool>> filter = x => x.SomeContent == content; @@ -134,7 +134,7 @@ public class DeleteOneAsyncTests : TestKeyedMongoRepositoryContext var count = Fixture.Create(); var content = Fixture.Create(); var partitionKey = Fixture.Create(); - var token = new CancellationToken(); + var token = new CancellationToken(true); Expression, bool>> filter = x => x.SomeContent == content; @@ -151,4 +151,4 @@ public class DeleteOneAsyncTests : TestKeyedMongoRepositoryContext result.Should().Be(count); Eraser.Verify(x => x.DeleteOneAsync, int>(filter, partitionKey, token), Times.Once); } -} \ No newline at end of file +} diff --git a/CoreUnitTests/KeyTypedRepositoryTests/DeleteTests/DeleteOneTests.cs b/CoreUnitTests/KeyTypedRepositoryTests/DeleteTests/DeleteOneTests.cs index 721746b..2d24876 100644 --- a/CoreUnitTests/KeyTypedRepositoryTests/DeleteTests/DeleteOneTests.cs +++ b/CoreUnitTests/KeyTypedRepositoryTests/DeleteTests/DeleteOneTests.cs @@ -1,5 +1,6 @@ using System; using System.Linq.Expressions; +using System.Threading; using AutoFixture; using CoreUnitTests.Infrastructure; using CoreUnitTests.Infrastructure.Model; @@ -21,7 +22,9 @@ public class DeleteOneTests : TestKeyedMongoRepositoryContext Eraser = new Mock(); Eraser - .Setup(x => x.DeleteOne, int>(It.IsAny>())) + .Setup(x => x.DeleteOne, int>( + It.IsAny>(), + It.IsAny())) .Returns(count); // Act @@ -29,7 +32,30 @@ public class DeleteOneTests : TestKeyedMongoRepositoryContext // Assert result.Should().Be(count); - Eraser.Verify(x => x.DeleteOne, int>(document), Times.Once); + Eraser.Verify(x => x.DeleteOne, int>(document, CancellationToken.None), Times.Once); + } + + [Fact] + public void WithDocumentAndCancellationToken_ShouldDeleteOne() + { + // Arrange + var document = Fixture.Create>(); + var count = Fixture.Create(); + var token = new CancellationToken(true); + Eraser = new Mock(); + + Eraser + .Setup(x => x.DeleteOne, int>( + It.IsAny>(), + It.IsAny())) + .Returns(count); + + // Act + var result = Sut.DeleteOne(document, token); + + // Assert + result.Should().Be(count); + Eraser.Verify(x => x.DeleteOne, int>(document, token), Times.Once); } [Fact] @@ -44,7 +70,10 @@ public class DeleteOneTests : TestKeyedMongoRepositoryContext Eraser = new Mock(); Eraser - .Setup(x => x.DeleteOne, int>(It.IsAny, bool>>>(), It.IsAny())) + .Setup(x => x.DeleteOne, int>( + It.IsAny, bool>>>(), + It.IsAny(), + It.IsAny())) .Returns(count); // Act @@ -52,7 +81,34 @@ public class DeleteOneTests : TestKeyedMongoRepositoryContext // Assert result.Should().Be(count); - Eraser.Verify(x => x.DeleteOne, int>(filter, null), Times.Once); + Eraser.Verify(x => x.DeleteOne, int>(filter, null, CancellationToken.None), Times.Once); + } + + [Fact] + public void WithFilterAndCancellationToken_ShouldDeleteOne() + { + // Arrange + var count = Fixture.Create(); + var content = Fixture.Create(); + var token = new CancellationToken(true); + + Expression, bool>> filter = x => x.SomeContent == content; + + Eraser = new Mock(); + + Eraser + .Setup(x => x.DeleteOne, int>( + It.IsAny, bool>>>(), + It.IsAny(), + It.IsAny())) + .Returns(count); + + // Act + var result = Sut.DeleteOne(filter, token); + + // Assert + result.Should().Be(count); + Eraser.Verify(x => x.DeleteOne, int>(filter, null, token), Times.Once); } [Fact] @@ -68,7 +124,10 @@ public class DeleteOneTests : TestKeyedMongoRepositoryContext Eraser = new Mock(); Eraser - .Setup(x => x.DeleteOne, int>(It.IsAny, bool>>>(), It.IsAny())) + .Setup(x => x.DeleteOne, int>( + It.IsAny, bool>>>(), + It.IsAny(), + It.IsAny())) .Returns(count); // Act @@ -76,6 +135,34 @@ public class DeleteOneTests : TestKeyedMongoRepositoryContext // Assert result.Should().Be(count); - Eraser.Verify(x => x.DeleteOne, int>(filter, partitionKey), Times.Once); + Eraser.Verify(x => x.DeleteOne, int>(filter, partitionKey, CancellationToken.None), Times.Once); } -} \ No newline at end of file + + [Fact] + public void WithFilterAndPartitionKeyAndCancellationToken_ShouldDeleteOne() + { + // Arrange + var count = Fixture.Create(); + var content = Fixture.Create(); + var partitionKey = Fixture.Create(); + var token = new CancellationToken(true); + + Expression, bool>> filter = x => x.SomeContent == content; + + Eraser = new Mock(); + + Eraser + .Setup(x => x.DeleteOne, int>( + It.IsAny, bool>>>(), + It.IsAny(), + It.IsAny())) + .Returns(count); + + // Act + var result = Sut.DeleteOne(filter, partitionKey, token); + + // Assert + result.Should().Be(count); + Eraser.Verify(x => x.DeleteOne, int>(filter, partitionKey, token), Times.Once); + } +} diff --git a/MongoDbGenericRepository/BaseMongoRepository.Delete.cs b/MongoDbGenericRepository/BaseMongoRepository.Delete.cs index 72b3aa4..76a17a1 100644 --- a/MongoDbGenericRepository/BaseMongoRepository.Delete.cs +++ b/MongoDbGenericRepository/BaseMongoRepository.Delete.cs @@ -36,6 +36,49 @@ namespace MongoDbGenericRepository #region Delete + /// + public virtual long DeleteOne(TDocument document) + where TDocument : IDocument + { + return DeleteOne(document, CancellationToken.None); + } + + /// + public virtual long DeleteOne(TDocument document, CancellationToken cancellationToken) + where TDocument : IDocument + { + return MongoDbEraser.DeleteOne(document, cancellationToken); + } + + + /// + public virtual long DeleteOne(Expression> filter) + where TDocument : IDocument + { + return DeleteOne(filter, null, CancellationToken.None); + } + + /// + public virtual long DeleteOne(Expression> filter, CancellationToken cancellationToken) + where TDocument : IDocument + { + return DeleteOne(filter, null, cancellationToken); + } + + /// + public virtual long DeleteOne(Expression> filter, string partitionKey) + where TDocument : IDocument + { + return DeleteOne(filter, partitionKey, CancellationToken.None); + } + + /// + public virtual long DeleteOne(Expression> filter, string partitionKey, CancellationToken cancellationToken) + where TDocument : IDocument + { + return MongoDbEraser.DeleteOne(filter, partitionKey, cancellationToken); + } + /// public virtual async Task DeleteOneAsync(TDocument document) where TDocument : IDocument @@ -50,20 +93,6 @@ namespace MongoDbGenericRepository return await MongoDbEraser.DeleteOneAsync(document, cancellationToken); } - /// - public virtual long DeleteOne(TDocument document) - where TDocument : IDocument - { - return MongoDbEraser.DeleteOne(document); - } - - /// - - public virtual long DeleteOne(Expression> filter, string partitionKey = null) - where TDocument : IDocument - { - return MongoDbEraser.DeleteOne(filter, partitionKey); - } /// public virtual async Task DeleteOneAsync(Expression> filter) @@ -118,7 +147,7 @@ namespace MongoDbGenericRepository public async Task DeleteManyAsync(Expression> filter, string partitionKey, CancellationToken cancellationToken) where TDocument : IDocument { - return await MongoDbEraser.DeleteManyAsync(filter, partitionKey, CancellationToken.None); + return await MongoDbEraser.DeleteManyAsync(filter, partitionKey, cancellationToken); } /// @@ -158,15 +187,47 @@ namespace MongoDbGenericRepository where TDocument : IDocument where TKey : IEquatable { - return MongoDbEraser.DeleteOne(document); + return DeleteOne(document, CancellationToken.None); } /// - public virtual long DeleteOne(Expression> filter, string partitionKey = null) + public virtual long DeleteOne(TDocument document, CancellationToken cancellationToken) where TDocument : IDocument where TKey : IEquatable { - return MongoDbEraser.DeleteOne(filter, partitionKey); + return MongoDbEraser.DeleteOne(document, cancellationToken); + } + + /// + public virtual long DeleteOne(Expression> filter) + where TDocument : IDocument + where TKey : IEquatable + { + return DeleteOne(filter, null, CancellationToken.None); + } + + /// + public virtual long DeleteOne(Expression> filter, CancellationToken cancellationToken) + where TDocument : IDocument + where TKey : IEquatable + { + return DeleteOne(filter, null, cancellationToken); + } + + /// + public virtual long DeleteOne(Expression> filter, string partitionKey) + where TDocument : IDocument + where TKey : IEquatable + { + return DeleteOne(filter, partitionKey, CancellationToken.None); + } + + /// + public virtual long DeleteOne(Expression> filter, string partitionKey, CancellationToken cancellationToken) + where TDocument : IDocument + where TKey : IEquatable + { + return MongoDbEraser.DeleteOne(filter, partitionKey, cancellationToken); } /// @@ -265,13 +326,7 @@ namespace MongoDbGenericRepository return await MongoDbEraser.DeleteManyAsync(documents, cancellationToken); } - /// - /// Deletes a list of documents. - /// - /// The type representing a Document. - /// The type of the primary key for a Document. - /// The list of documents to delete. - /// The number of documents deleted. + /// public virtual long DeleteMany(IEnumerable documents) where TDocument : IDocument where TKey : IEquatable @@ -279,14 +334,7 @@ namespace MongoDbGenericRepository return MongoDbEraser.DeleteMany(documents); } - /// - /// Deletes the documents matching the condition of the LINQ expression filter. - /// - /// The type representing a Document. - /// The type of the primary key for a Document. - /// A LINQ expression filter. - /// An optional partition key. - /// The number of documents deleted. + /// public virtual long DeleteMany(Expression> filter, string partitionKey = null) where TDocument : IDocument where TKey : IEquatable diff --git a/MongoDbGenericRepository/DataAccess/Delete/IMongoDbEraser.cs b/MongoDbGenericRepository/DataAccess/Delete/IMongoDbEraser.cs index 12ec088..23a1eaf 100644 --- a/MongoDbGenericRepository/DataAccess/Delete/IMongoDbEraser.cs +++ b/MongoDbGenericRepository/DataAccess/Delete/IMongoDbEraser.cs @@ -19,8 +19,9 @@ namespace MongoDbGenericRepository.DataAccess.Delete /// The type representing a Document. /// The type of the primary key for a Document. /// The document you want to delete. + /// An optional cancellation token /// The number of documents deleted. - long DeleteOne(TDocument document) + long DeleteOne(TDocument document, CancellationToken cancellationToken = default) where TDocument : IDocument where TKey : IEquatable; @@ -31,8 +32,9 @@ namespace MongoDbGenericRepository.DataAccess.Delete /// The type of the primary key for a Document. /// A LINQ expression filter. /// An optional partition key. + /// An optional cancellation token /// The number of documents deleted. - long DeleteOne(Expression> filter, string partitionKey = null) + long DeleteOne(Expression> filter, string partitionKey = null, CancellationToken cancellationToken = default) where TDocument : IDocument where TKey : IEquatable; diff --git a/MongoDbGenericRepository/DataAccess/Delete/MongoDbEraser.cs b/MongoDbGenericRepository/DataAccess/Delete/MongoDbEraser.cs index d3d0574..902b107 100644 --- a/MongoDbGenericRepository/DataAccess/Delete/MongoDbEraser.cs +++ b/MongoDbGenericRepository/DataAccess/Delete/MongoDbEraser.cs @@ -1,12 +1,12 @@ -using MongoDB.Driver; -using MongoDbGenericRepository.DataAccess.Base; -using MongoDbGenericRepository.Models; -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; +using MongoDB.Driver; +using MongoDbGenericRepository.DataAccess.Base; +using MongoDbGenericRepository.Models; namespace MongoDbGenericRepository.DataAccess.Delete { @@ -14,7 +14,7 @@ namespace MongoDbGenericRepository.DataAccess.Delete public class MongoDbEraser : DataAccessBase, IMongoDbEraser { /// - /// The MongoDbEraser constructor. + /// The MongoDbEraser constructor. /// /// the MongoDb Context public MongoDbEraser(IMongoDbContext mongoDbContext) : base(mongoDbContext) @@ -24,12 +24,20 @@ namespace MongoDbGenericRepository.DataAccess.Delete #region Delete TKey /// - public virtual long DeleteOne(TDocument document) + public virtual long DeleteOne(TDocument document, CancellationToken cancellationToken = default) where TDocument : IDocument where TKey : IEquatable { var filter = Builders.Filter.Eq("Id", document.Id); - return HandlePartitioned(document).DeleteOne(filter).DeletedCount; + return HandlePartitioned(document).DeleteOne(filter, cancellationToken).DeletedCount; + } + + /// + public virtual long DeleteOne(Expression> filter, string partitionKey = null, CancellationToken cancellationToken = default) + where TDocument : IDocument + where TKey : IEquatable + { + return HandlePartitioned(partitionKey).DeleteOne(filter, cancellationToken).DeletedCount; } /// @@ -42,15 +50,10 @@ namespace MongoDbGenericRepository.DataAccess.Delete } /// - public virtual long DeleteOne(Expression> filter, string partitionKey = null) - where TDocument : IDocument - where TKey : IEquatable - { - return HandlePartitioned(partitionKey).DeleteOne(filter).DeletedCount; - } - - /// - public virtual async Task DeleteOneAsync(Expression> filter, string partitionKey, CancellationToken cancellationToken) + public virtual async Task DeleteOneAsync( + Expression> filter, + string partitionKey, + CancellationToken cancellationToken) where TDocument : IDocument where TKey : IEquatable { @@ -58,7 +61,10 @@ namespace MongoDbGenericRepository.DataAccess.Delete } /// - public virtual async Task DeleteManyAsync(Expression> filter, string partitionKey, CancellationToken cancellationToken) + public virtual async Task DeleteManyAsync( + Expression> filter, + string partitionKey, + CancellationToken cancellationToken) where TDocument : IDocument where TKey : IEquatable { @@ -71,7 +77,7 @@ namespace MongoDbGenericRepository.DataAccess.Delete where TKey : IEquatable { var documentList = documents.ToList(); - + if (!documentList.Any()) { return 0; @@ -81,22 +87,24 @@ namespace MongoDbGenericRepository.DataAccess.Delete if (documentList.Any(e => e is IPartitionedDocument)) { long deleteCount = 0; - foreach (var group in documentList.GroupBy(e => ((IPartitionedDocument)e).PartitionKey)) + foreach (var group in documentList.GroupBy(e => ((IPartitionedDocument) e).PartitionKey)) { var groupIdsToDelete = group.Select(e => e.Id).ToArray(); deleteCount += (await HandlePartitioned(group.FirstOrDefault()) - .DeleteManyAsync(x => groupIdsToDelete.Contains(x.Id), cancellationToken: cancellationToken)) + .DeleteManyAsync(x => groupIdsToDelete.Contains(x.Id), cancellationToken)) .DeletedCount; } + return deleteCount; } var idsToDelete = documentList.Select(e => e.Id).ToArray(); - return (await HandlePartitioned(documentList.FirstOrDefault()).DeleteManyAsync(x => idsToDelete.Contains(x.Id), cancellationToken: cancellationToken)).DeletedCount; + return (await HandlePartitioned(documentList.FirstOrDefault()).DeleteManyAsync(x => idsToDelete.Contains(x.Id), cancellationToken)) + .DeletedCount; } /// - /// Deletes a list of documents. + /// Deletes a list of documents. /// /// The type representing a Document. /// The type of the primary key for a Document. @@ -107,7 +115,7 @@ namespace MongoDbGenericRepository.DataAccess.Delete where TKey : IEquatable { var documentList = documents.ToList(); - + if (!documentList.Any()) { return 0; @@ -117,11 +125,12 @@ namespace MongoDbGenericRepository.DataAccess.Delete if (documentList.Any(e => e is IPartitionedDocument)) { long deleteCount = 0; - foreach (var group in documentList.GroupBy(e => ((IPartitionedDocument)e).PartitionKey)) + foreach (var group in documentList.GroupBy(e => ((IPartitionedDocument) e).PartitionKey)) { var groupIdsToDelete = group.Select(e => e.Id).ToArray(); - deleteCount += (HandlePartitioned(group.FirstOrDefault()).DeleteMany(x => groupIdsToDelete.Contains(x.Id))).DeletedCount; + deleteCount += HandlePartitioned(group.FirstOrDefault()).DeleteMany(x => groupIdsToDelete.Contains(x.Id)).DeletedCount; } + return deleteCount; } @@ -130,7 +139,7 @@ namespace MongoDbGenericRepository.DataAccess.Delete } /// - /// Deletes the documents matching the condition of the LINQ expression filter. + /// Deletes the documents matching the condition of the LINQ expression filter. /// /// The type representing a Document. /// The type of the primary key for a Document. @@ -145,6 +154,5 @@ namespace MongoDbGenericRepository.DataAccess.Delete } #endregion - } -} +} \ No newline at end of file diff --git a/MongoDbGenericRepository/IBaseMongoRepository.Delete.cs b/MongoDbGenericRepository/IBaseMongoRepository.Delete.cs index fcfb229..930870f 100644 --- a/MongoDbGenericRepository/IBaseMongoRepository.Delete.cs +++ b/MongoDbGenericRepository/IBaseMongoRepository.Delete.cs @@ -8,12 +8,12 @@ using MongoDbGenericRepository.Models; namespace MongoDbGenericRepository { /// - /// The base Mongo Repository Delete interface. used to delete documents from the collections. + /// The base Mongo Repository Delete interface. used to delete documents from the collections. /// public interface IBaseMongoRepository_Delete : IBaseMongoRepository_Delete { /// - /// Deletes a document. + /// Deletes a document. /// /// The type representing a Document. /// The type of the primary key for a Document. @@ -24,7 +24,67 @@ namespace MongoDbGenericRepository where TKey : IEquatable; /// - /// Asynchronously deletes a document matching the condition of the LINQ expression filter. + /// Deletes a document. + /// + /// The type representing a Document. + /// The type of the primary key for a Document. + /// The document you want to delete. + /// The cancellation token. + /// The number of documents deleted. + long DeleteOne(TDocument document, CancellationToken cancellationToken) + where TDocument : IDocument + where TKey : IEquatable; + + /// + /// Deletes a document matching the condition of the LINQ expression filter. + /// + /// The type representing a Document. + /// The type of the primary key for a Document. + /// A LINQ expression filter. + /// The number of documents deleted. + long DeleteOne(Expression> filter) + where TDocument : IDocument + where TKey : IEquatable; + + /// + /// Deletes a document matching the condition of the LINQ expression filter. + /// + /// The type representing a Document. + /// The type of the primary key for a Document. + /// A LINQ expression filter. + /// The cancellation token + /// The number of documents deleted. + long DeleteOne(Expression> filter, CancellationToken cancellationToken) + where TDocument : IDocument + where TKey : IEquatable; + + /// + /// Deletes a document matching the condition of the LINQ expression filter. + /// + /// The type representing a Document. + /// The type of the primary key for a Document. + /// A LINQ expression filter. + /// An optional partition key. + /// The number of documents deleted. + long DeleteOne(Expression> filter, string partitionKey) + where TDocument : IDocument + where TKey : IEquatable; + + /// + /// Deletes a document matching the condition of the LINQ expression filter. + /// + /// The type representing a Document. + /// The type of the primary key for a Document. + /// A LINQ expression filter. + /// An optional partition key. + /// The cancellation token. + /// The number of documents deleted. + long DeleteOne(Expression> filter, string partitionKey, CancellationToken cancellationToken) + where TDocument : IDocument + where TKey : IEquatable; + + /// + /// Asynchronously deletes a document matching the condition of the LINQ expression filter. /// /// The type representing a Document. /// The type of the primary key for a Document. @@ -35,7 +95,7 @@ namespace MongoDbGenericRepository where TKey : IEquatable; /// - /// Asynchronously deletes a document matching the condition of the LINQ expression filter. + /// Asynchronously deletes a document matching the condition of the LINQ expression filter. /// /// The type representing a Document. /// The type of the primary key for a Document. @@ -47,19 +107,7 @@ namespace MongoDbGenericRepository where TKey : IEquatable; /// - /// Deletes a document matching the condition of the LINQ expression filter. - /// - /// The type representing a Document. - /// The type of the primary key for a Document. - /// A LINQ expression filter. - /// An optional partition key. - /// The number of documents deleted. - long DeleteOne(Expression> filter, string partitionKey = null) - where TDocument : IDocument - where TKey : IEquatable; - - /// - /// Asynchronously deletes a document matching the condition of the LINQ expression filter. + /// Asynchronously deletes a document matching the condition of the LINQ expression filter. /// /// The type representing a Document. /// The type of the primary key for a Document. @@ -70,7 +118,7 @@ namespace MongoDbGenericRepository where TKey : IEquatable; /// - /// Asynchronously deletes a document matching the condition of the LINQ expression filter. + /// Asynchronously deletes a document matching the condition of the LINQ expression filter. /// /// The type representing a Document. /// The type of the primary key for a Document. @@ -82,7 +130,7 @@ namespace MongoDbGenericRepository where TKey : IEquatable; /// - /// Asynchronously deletes a document matching the condition of the LINQ expression filter. + /// Asynchronously deletes a document matching the condition of the LINQ expression filter. /// /// The type representing a Document. /// The type of the primary key for a Document. @@ -94,7 +142,7 @@ namespace MongoDbGenericRepository where TKey : IEquatable; /// - /// Asynchronously deletes a document matching the condition of the LINQ expression filter. + /// Asynchronously deletes a document matching the condition of the LINQ expression filter. /// /// The type representing a Document. /// The type of the primary key for a Document. @@ -107,7 +155,7 @@ namespace MongoDbGenericRepository where TKey : IEquatable; /// - /// Asynchronously deletes the documents matching the condition of the LINQ expression filter. + /// Asynchronously deletes the documents matching the condition of the LINQ expression filter. /// /// The type representing a Document. /// The type of the primary key for a Document. @@ -118,7 +166,7 @@ namespace MongoDbGenericRepository where TKey : IEquatable; /// - /// Asynchronously deletes the documents matching the condition of the LINQ expression filter. + /// Asynchronously deletes the documents matching the condition of the LINQ expression filter. /// /// The type representing a Document. /// The type of the primary key for a Document. @@ -130,7 +178,7 @@ namespace MongoDbGenericRepository where TKey : IEquatable; /// - /// Asynchronously deletes the documents matching the condition of the LINQ expression filter. + /// Asynchronously deletes the documents matching the condition of the LINQ expression filter. /// /// The type representing a Document. /// The type of the primary key for a Document. @@ -142,7 +190,7 @@ namespace MongoDbGenericRepository where TKey : IEquatable; /// - /// Asynchronously deletes the documents matching the condition of the LINQ expression filter. + /// Asynchronously deletes the documents matching the condition of the LINQ expression filter. /// /// The type representing a Document. /// The type of the primary key for a Document. @@ -155,7 +203,7 @@ namespace MongoDbGenericRepository where TKey : IEquatable; /// - /// Asynchronously deletes a list of documents. + /// Asynchronously deletes a list of documents. /// /// The type representing a Document. /// The type of the primary key for a Document. @@ -166,7 +214,7 @@ namespace MongoDbGenericRepository where TKey : IEquatable; /// - /// Asynchronously deletes a list of documents. + /// Asynchronously deletes a list of documents. /// /// The type representing a Document. /// The type of the primary key for a Document. @@ -178,7 +226,7 @@ namespace MongoDbGenericRepository where TKey : IEquatable; /// - /// Deletes a list of documents. + /// Deletes a list of documents. /// /// The type representing a Document. /// The type of the primary key for a Document. @@ -189,7 +237,7 @@ namespace MongoDbGenericRepository where TKey : IEquatable; /// - /// Deletes the documents matching the condition of the LINQ expression filter. + /// Deletes the documents matching the condition of the LINQ expression filter. /// /// The type representing a Document. /// The type of the primary key for a Document. diff --git a/MongoDbGenericRepository/KeyTypedRepository/BaseMongoRepository.TKey.Delete.cs b/MongoDbGenericRepository/KeyTypedRepository/BaseMongoRepository.TKey.Delete.cs index ed45e15..839a92b 100644 --- a/MongoDbGenericRepository/KeyTypedRepository/BaseMongoRepository.TKey.Delete.cs +++ b/MongoDbGenericRepository/KeyTypedRepository/BaseMongoRepository.TKey.Delete.cs @@ -38,14 +38,42 @@ namespace MongoDbGenericRepository public virtual long DeleteOne(TDocument document) where TDocument : IDocument { - return MongoDbEraser.DeleteOne(document); + return DeleteOne(document, CancellationToken.None); } /// - public virtual long DeleteOne(Expression> filter, string partitionKey = null) + public virtual long DeleteOne(TDocument document, CancellationToken cancellationToken) where TDocument : IDocument { - return MongoDbEraser.DeleteOne(filter, partitionKey); + return MongoDbEraser.DeleteOne(document, cancellationToken); + } + + /// + public virtual long DeleteOne(Expression> filter) + where TDocument : IDocument + { + return DeleteOne(filter, null, CancellationToken.None); + } + + /// + public virtual long DeleteOne(Expression> filter, CancellationToken cancellationToken) + where TDocument : IDocument + { + return DeleteOne(filter, null, cancellationToken); + } + + /// + public virtual long DeleteOne(Expression> filter, string partitionKey) + where TDocument : IDocument + { + return DeleteOne(filter, partitionKey, CancellationToken.None); + } + + /// + public virtual long DeleteOne(Expression> filter, string partitionKey, CancellationToken cancellationToken) + where TDocument : IDocument + { + return MongoDbEraser.DeleteOne(filter, partitionKey, cancellationToken); } /// diff --git a/MongoDbGenericRepository/KeyTypedRepository/IBaseMongoRepository.TKey.Delete.cs b/MongoDbGenericRepository/KeyTypedRepository/IBaseMongoRepository.TKey.Delete.cs index 42217fc..c747d91 100644 --- a/MongoDbGenericRepository/KeyTypedRepository/IBaseMongoRepository.TKey.Delete.cs +++ b/MongoDbGenericRepository/KeyTypedRepository/IBaseMongoRepository.TKey.Delete.cs @@ -23,6 +23,56 @@ namespace MongoDbGenericRepository long DeleteOne(TDocument document) where TDocument : IDocument; + /// + /// Deletes a document. + /// + /// The type representing a Document. + /// The document you want to delete. + /// The cancellation token. + /// The number of documents deleted. + long DeleteOne(TDocument document, CancellationToken cancellationToken) + where TDocument : IDocument; + + /// + /// Deletes a document matching the condition of the LINQ expression filter. + /// + /// The type representing a Document. + /// A LINQ expression filter. + /// The number of documents deleted. + long DeleteOne(Expression> filter) + where TDocument : IDocument; + + /// + /// Deletes a document matching the condition of the LINQ expression filter. + /// + /// The type representing a Document. + /// A LINQ expression filter. + /// The cancellation token. + /// The number of documents deleted. + long DeleteOne(Expression> filter, CancellationToken cancellationToken) + where TDocument : IDocument; + + /// + /// Deletes a document matching the condition of the LINQ expression filter. + /// + /// The type representing a Document. + /// A LINQ expression filter. + /// An optional partition key. + /// The number of documents deleted. + long DeleteOne(Expression> filter, string partitionKey) + where TDocument : IDocument; + + /// + /// Deletes a document matching the condition of the LINQ expression filter. + /// + /// The type representing a Document. + /// A LINQ expression filter. + /// An optional partition key. + /// The cancellation token. + /// The number of documents deleted. + long DeleteOne(Expression> filter, string partitionKey, CancellationToken cancellationToken) + where TDocument : IDocument; + /// /// Asynchronously deletes a document matching the condition of the LINQ expression filter. /// @@ -42,15 +92,6 @@ namespace MongoDbGenericRepository Task DeleteOneAsync(TDocument document, CancellationToken cancellationToken) where TDocument : IDocument; - /// - /// Deletes a document matching the condition of the LINQ expression filter. - /// - /// The type representing a Document. - /// A LINQ expression filter. - /// An optional partition key. - /// The number of documents deleted. - long DeleteOne(Expression> filter, string partitionKey = null) - where TDocument : IDocument; /// /// Asynchronously deletes a document matching the condition of the LINQ expression filter.