diff --git a/src/Nullinside.Api.TwitchBot.Tests/.editorconfig b/src/Nullinside.Api.TwitchBot.Tests/.editorconfig new file mode 100644 index 0000000..e4fa89d --- /dev/null +++ b/src/Nullinside.Api.TwitchBot.Tests/.editorconfig @@ -0,0 +1,368 @@ +root = true + +# All files +[*] +indent_style = space + +# ReSharper properties +resharper_csharp_wrap_lines = false + +# Xml files +[*.xml] +indent_size = 2 + +# C# files +[*.cs] + +#### Core EditorConfig Options #### + +# Indentation and spacing +indent_size = 2 +tab_width = 2 + +# New line preferences +end_of_line = lf +insert_final_newline = false + +#### .NET Coding Conventions #### +[*.{cs,vb}] + +# Organize usings +dotnet_separate_import_directive_groups = true +dotnet_sort_system_directives_first = true +file_header_template = # this. and Me. preferences + + + +dotnet_style_qualification_for_event = false:silent +dotnet_style_qualification_for_field = false:silent +dotnet_style_qualification_for_method = false:silent +dotnet_style_qualification_for_property = false:silent + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true:silent +dotnet_style_predefined_type_for_member_access = true:silent + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent + +# Expression-level preferences +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_object_initializer = true:suggestion +dotnet_style_operator_placement_when_wrapping = beginning_of_line +dotnet_style_prefer_auto_properties = true:suggestion +dotnet_style_prefer_compound_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_return = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_simplified_boolean_expressions = true:suggestion +dotnet_style_prefer_simplified_interpolation = true:suggestion + +# Field preferences +dotnet_style_readonly_field = true:warning + +# Parameter preferences +dotnet_code_quality_unused_parameters = all:suggestion + +# Suppression preferences +dotnet_remove_unnecessary_suppression_exclusions = none + +#### C# Coding Conventions #### +[*.cs] + +# var preferences +csharp_style_var_elsewhere = false:silent +csharp_style_var_for_built_in_types = false:silent +csharp_style_var_when_type_is_apparent = true:silent + +# Expression-bodied members +csharp_style_expression_bodied_accessors = true:silent +csharp_style_expression_bodied_constructors = false:silent +csharp_style_expression_bodied_indexers = true:silent +csharp_style_expression_bodied_lambdas = true:suggestion +csharp_style_expression_bodied_local_functions = false:silent +csharp_style_expression_bodied_methods = false:silent +csharp_style_expression_bodied_operators = false:silent +csharp_style_expression_bodied_properties = true:silent + +# Pattern matching preferences +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_prefer_not_pattern = true:suggestion +csharp_style_prefer_pattern_matching = true:silent +csharp_style_prefer_switch_expression = true:suggestion + +# Null-checking preferences +csharp_style_conditional_delegate_call = true:suggestion + +# Modifier preferences +csharp_prefer_static_local_function = true:warning +csharp_preferred_modifier_order = public, private, protected, internal, static, extern, new, virtual, abstract, sealed, override, readonly, unsafe, volatile, async:silent + +# Code-block preferences +csharp_prefer_braces = true:silent +csharp_prefer_simple_using_statement = true:suggestion + +# Expression-level preferences +csharp_prefer_simple_default_expression = true:suggestion +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion +csharp_style_pattern_local_over_anonymous_function = true:suggestion +csharp_style_prefer_index_operator = true:suggestion +csharp_style_prefer_range_operator = true:suggestion +csharp_style_throw_expression = true:suggestion +csharp_style_unused_value_assignment_preference = discard_variable:suggestion +csharp_style_unused_value_expression_statement_preference = discard_variable:silent + +# 'using' directive preferences +csharp_using_directive_placement = outside_namespace:silent + +#### C# Formatting Rules #### + +# New line preferences +csharp_new_line_before_catch = false:warning +csharp_new_line_before_else = false:warning +csharp_new_line_before_finally = false:warning +csharp_new_line_before_members_in_anonymous_types = false:warning +csharp_new_line_before_members_in_object_initializers = false:warning +csharp_new_line_before_open_brace = none +csharp_new_line_between_query_expression_clauses = false:warning + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = true +csharp_indent_labels = one_less_than_current +csharp_indent_switch_labels = true + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_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_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# Wrapping preferences +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true + +#### Naming styles #### +[*.{cs,vb}] + +# Naming rules + +dotnet_naming_rule.types_and_namespaces_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.types_and_namespaces_should_be_pascalcase.symbols = types_and_namespaces +dotnet_naming_rule.types_and_namespaces_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.interfaces_should_be_ipascalcase.severity = suggestion +dotnet_naming_rule.interfaces_should_be_ipascalcase.symbols = interfaces +dotnet_naming_rule.interfaces_should_be_ipascalcase.style = ipascalcase + +dotnet_naming_rule.type_parameters_should_be_tpascalcase.severity = suggestion +dotnet_naming_rule.type_parameters_should_be_tpascalcase.symbols = type_parameters +dotnet_naming_rule.type_parameters_should_be_tpascalcase.style = tpascalcase + +dotnet_naming_rule.methods_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.methods_should_be_pascalcase.symbols = methods +dotnet_naming_rule.methods_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.properties_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.properties_should_be_pascalcase.symbols = properties +dotnet_naming_rule.properties_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.events_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.events_should_be_pascalcase.symbols = events +dotnet_naming_rule.events_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.local_variables_should_be_camelcase.severity = suggestion +dotnet_naming_rule.local_variables_should_be_camelcase.symbols = local_variables +dotnet_naming_rule.local_variables_should_be_camelcase.style = camelcase + +dotnet_naming_rule.local_constants_should_be_camelcase.severity = suggestion +dotnet_naming_rule.local_constants_should_be_camelcase.symbols = local_constants +dotnet_naming_rule.local_constants_should_be_camelcase.style = camelcase + +dotnet_naming_rule.parameters_should_be_camelcase.severity = suggestion +dotnet_naming_rule.parameters_should_be_camelcase.symbols = parameters +dotnet_naming_rule.parameters_should_be_camelcase.style = camelcase + +dotnet_naming_rule.public_fields_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.public_fields_should_be_pascalcase.symbols = public_fields +dotnet_naming_rule.public_fields_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.private_fields_should_be__camelcase.severity = suggestion +dotnet_naming_rule.private_fields_should_be__camelcase.symbols = private_fields +dotnet_naming_rule.private_fields_should_be__camelcase.style = _camelcase + +dotnet_naming_rule.private_static_fields_should_be_s_camelcase.severity = suggestion +dotnet_naming_rule.private_static_fields_should_be_s_camelcase.symbols = private_static_fields +dotnet_naming_rule.private_static_fields_should_be_s_camelcase.style = s_camelcase + +dotnet_naming_rule.public_constant_fields_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.public_constant_fields_should_be_pascalcase.symbols = public_constant_fields +dotnet_naming_rule.public_constant_fields_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.private_constant_fields_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.private_constant_fields_should_be_pascalcase.symbols = private_constant_fields +dotnet_naming_rule.private_constant_fields_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.public_static_readonly_fields_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.public_static_readonly_fields_should_be_pascalcase.symbols = public_static_readonly_fields +dotnet_naming_rule.public_static_readonly_fields_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.private_static_readonly_fields_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.private_static_readonly_fields_should_be_pascalcase.symbols = private_static_readonly_fields +dotnet_naming_rule.private_static_readonly_fields_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.enums_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.enums_should_be_pascalcase.symbols = enums +dotnet_naming_rule.enums_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.local_functions_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.local_functions_should_be_pascalcase.symbols = local_functions +dotnet_naming_rule.local_functions_should_be_pascalcase.style = pascalcase + +dotnet_naming_rule.non_field_members_should_be_pascalcase.severity = suggestion +dotnet_naming_rule.non_field_members_should_be_pascalcase.symbols = non_field_members +dotnet_naming_rule.non_field_members_should_be_pascalcase.style = pascalcase + +# Symbol specifications + +dotnet_naming_symbols.interfaces.applicable_kinds = interface +dotnet_naming_symbols.interfaces.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interfaces.required_modifiers = + +dotnet_naming_symbols.enums.applicable_kinds = enum +dotnet_naming_symbols.enums.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.enums.required_modifiers = + +dotnet_naming_symbols.events.applicable_kinds = event +dotnet_naming_symbols.events.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.events.required_modifiers = + +dotnet_naming_symbols.methods.applicable_kinds = method +dotnet_naming_symbols.methods.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.methods.required_modifiers = + +dotnet_naming_symbols.properties.applicable_kinds = property +dotnet_naming_symbols.properties.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.properties.required_modifiers = + +dotnet_naming_symbols.public_fields.applicable_kinds = field +dotnet_naming_symbols.public_fields.applicable_accessibilities = public, internal +dotnet_naming_symbols.public_fields.required_modifiers = + +dotnet_naming_symbols.private_fields.applicable_kinds = field +dotnet_naming_symbols.private_fields.applicable_accessibilities = private, protected, protected_internal, private_protected +dotnet_naming_symbols.private_fields.required_modifiers = + +dotnet_naming_symbols.private_static_fields.applicable_kinds = field +dotnet_naming_symbols.private_static_fields.applicable_accessibilities = private, protected, protected_internal, private_protected +dotnet_naming_symbols.private_static_fields.required_modifiers = static + +dotnet_naming_symbols.types_and_namespaces.applicable_kinds = namespace, class, struct, interface, enum +dotnet_naming_symbols.types_and_namespaces.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types_and_namespaces.required_modifiers = + +dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.non_field_members.required_modifiers = + +dotnet_naming_symbols.type_parameters.applicable_kinds = namespace +dotnet_naming_symbols.type_parameters.applicable_accessibilities = * +dotnet_naming_symbols.type_parameters.required_modifiers = + +dotnet_naming_symbols.private_constant_fields.applicable_kinds = field +dotnet_naming_symbols.private_constant_fields.applicable_accessibilities = private, protected, protected_internal, private_protected +dotnet_naming_symbols.private_constant_fields.required_modifiers = const + +dotnet_naming_symbols.local_variables.applicable_kinds = local +dotnet_naming_symbols.local_variables.applicable_accessibilities = local +dotnet_naming_symbols.local_variables.required_modifiers = + +dotnet_naming_symbols.local_constants.applicable_kinds = local +dotnet_naming_symbols.local_constants.applicable_accessibilities = local +dotnet_naming_symbols.local_constants.required_modifiers = const + +dotnet_naming_symbols.parameters.applicable_kinds = parameter +dotnet_naming_symbols.parameters.applicable_accessibilities = * +dotnet_naming_symbols.parameters.required_modifiers = + +dotnet_naming_symbols.public_constant_fields.applicable_kinds = field +dotnet_naming_symbols.public_constant_fields.applicable_accessibilities = public, internal +dotnet_naming_symbols.public_constant_fields.required_modifiers = const + +dotnet_naming_symbols.public_static_readonly_fields.applicable_kinds = field +dotnet_naming_symbols.public_static_readonly_fields.applicable_accessibilities = public, internal +dotnet_naming_symbols.public_static_readonly_fields.required_modifiers = readonly, static + +dotnet_naming_symbols.private_static_readonly_fields.applicable_kinds = field +dotnet_naming_symbols.private_static_readonly_fields.applicable_accessibilities = private, protected, protected_internal, private_protected +dotnet_naming_symbols.private_static_readonly_fields.required_modifiers = readonly, static + +dotnet_naming_symbols.local_functions.applicable_kinds = local_function +dotnet_naming_symbols.local_functions.applicable_accessibilities = * +dotnet_naming_symbols.local_functions.required_modifiers = + +# Naming styles + +dotnet_naming_style.pascalcase.required_prefix = +dotnet_naming_style.pascalcase.required_suffix = +dotnet_naming_style.pascalcase.word_separator = +dotnet_naming_style.pascalcase.capitalization = pascal_case + +dotnet_naming_style.ipascalcase.required_prefix = I +dotnet_naming_style.ipascalcase.required_suffix = +dotnet_naming_style.ipascalcase.word_separator = +dotnet_naming_style.ipascalcase.capitalization = pascal_case + +dotnet_naming_style.tpascalcase.required_prefix = T +dotnet_naming_style.tpascalcase.required_suffix = +dotnet_naming_style.tpascalcase.word_separator = +dotnet_naming_style.tpascalcase.capitalization = pascal_case + +dotnet_naming_style._camelcase.required_prefix = _ +dotnet_naming_style._camelcase.required_suffix = +dotnet_naming_style._camelcase.word_separator = +dotnet_naming_style._camelcase.capitalization = camel_case + +dotnet_naming_style.camelcase.required_prefix = +dotnet_naming_style.camelcase.required_suffix = +dotnet_naming_style.camelcase.word_separator = +dotnet_naming_style.camelcase.capitalization = camel_case + +dotnet_naming_style.s_camelcase.required_prefix = s_ +dotnet_naming_style.s_camelcase.required_suffix = +dotnet_naming_style.s_camelcase.word_separator = +dotnet_naming_style.s_camelcase.capitalization = camel_case + diff --git a/src/Nullinside.Api.TwitchBot.Tests/ChatRules/AChatRuleUnitTestBase.cs b/src/Nullinside.Api.TwitchBot.Tests/ChatRules/AChatRuleUnitTestBase.cs index 34a7250..8a76b16 100644 --- a/src/Nullinside.Api.TwitchBot.Tests/ChatRules/AChatRuleUnitTestBase.cs +++ b/src/Nullinside.Api.TwitchBot.Tests/ChatRules/AChatRuleUnitTestBase.cs @@ -1,4 +1,5 @@ using Moq; + using Nullinside.Api.Common.Twitch; using Nullinside.Api.Model.Ddl; using Nullinside.Api.TwitchBot.ChatRules; @@ -6,55 +7,52 @@ namespace Nullinside.Api.TwitchBot.Tests.ChatRules; /// -/// A generic set of sets that all chat rules should be put through. +/// A generic set of sets that all chat rules should be put through. /// /// -public abstract class AChatRuleUnitTestBase : UnitTestBase where T : AChatRule, new() -{ - /// - /// Tests that the message filter is capable of passing at all. - /// - /// A friendly string with no issues. - [Test] - [TestCase("Hello I love candy and sprinkles")] - public async Task TestItDoesntAlwaysFail(string goodString) - { - var rule = new T(); - var botProxy = new Mock(); - - // Process the message and assert that we pass the message. - var chat = new TwitchChatMessage(true, goodString, "123", "456"); - var result = await rule.Handle("123", botProxy.Object, chat, _db); - Assert.That(result, Is.True); - - // Process the message and assert that we pass the message. - chat = new TwitchChatMessage(false, goodString, "123", "456"); - result = await rule.Handle("123", botProxy.Object, chat, _db); - Assert.That(result, Is.True); - } - - /// - /// Tests that the rules are only running when they should be. - /// - [Test] - public void TestShouldRun() - { - var rule = new T(); - - // Rule is turned on and so is scanning. - var shouldRun = rule.ShouldRun(new TwitchUserConfig { Enabled = true, BanKnownBots = true }); - Assert.That(shouldRun, Is.True); - - // Scanning is turned off - shouldRun = rule.ShouldRun(new TwitchUserConfig { Enabled = false, BanKnownBots = true }); - Assert.That(shouldRun, Is.False); - - // Rule is turned off. - shouldRun = rule.ShouldRun(new TwitchUserConfig { Enabled = true, BanKnownBots = false }); - Assert.That(shouldRun, Is.False); - - // Everything is off. - shouldRun = rule.ShouldRun(new TwitchUserConfig { Enabled = false, BanKnownBots = false }); - Assert.That(shouldRun, Is.False); - } +public abstract class AChatRuleUnitTestBase : UnitTestBase where T : AChatRule, new() { + /// + /// Tests that the message filter is capable of passing at all. + /// + /// A friendly string with no issues. + [Test] + [TestCase("Hello I love candy and sprinkles")] + public async Task TestItDoesntAlwaysFail(string goodString) { + var rule = new T(); + var botProxy = new Mock(); + + // Process the message and assert that we pass the message. + var chat = new TwitchChatMessage(true, goodString, "123", "456"); + bool result = await rule.Handle("123", botProxy.Object, chat, _db); + Assert.That(result, Is.True); + + // Process the message and assert that we pass the message. + chat = new TwitchChatMessage(false, goodString, "123", "456"); + result = await rule.Handle("123", botProxy.Object, chat, _db); + Assert.That(result, Is.True); + } + + /// + /// Tests that the rules are only running when they should be. + /// + [Test] + public void TestShouldRun() { + var rule = new T(); + + // Rule is turned on and so is scanning. + bool shouldRun = rule.ShouldRun(new TwitchUserConfig { Enabled = true, BanKnownBots = true }); + Assert.That(shouldRun, Is.True); + + // Scanning is turned off + shouldRun = rule.ShouldRun(new TwitchUserConfig { Enabled = false, BanKnownBots = true }); + Assert.That(shouldRun, Is.False); + + // Rule is turned off. + shouldRun = rule.ShouldRun(new TwitchUserConfig { Enabled = true, BanKnownBots = false }); + Assert.That(shouldRun, Is.False); + + // Everything is off. + shouldRun = rule.ShouldRun(new TwitchUserConfig { Enabled = false, BanKnownBots = false }); + Assert.That(shouldRun, Is.False); + } } \ No newline at end of file diff --git a/src/Nullinside.Api.TwitchBot.Tests/ChatRules/BestCheapViewersTests.cs b/src/Nullinside.Api.TwitchBot.Tests/ChatRules/BestCheapViewersTests.cs index db889c9..705974f 100644 --- a/src/Nullinside.Api.TwitchBot.Tests/ChatRules/BestCheapViewersTests.cs +++ b/src/Nullinside.Api.TwitchBot.Tests/ChatRules/BestCheapViewersTests.cs @@ -1,42 +1,41 @@ using Moq; + using Nullinside.Api.Common.Twitch; using Nullinside.Api.TwitchBot.ChatRules; namespace Nullinside.Api.TwitchBot.Tests.ChatRules; /// -/// Tests the class. +/// Tests the class. /// -public class BestCheapViewersTests : AChatRuleUnitTestBase -{ - /// - /// Tests strings that have been typed in chats. - /// - /// The string that should fail. - [Test] - [TestCase("Best viewers on ***")] - [TestCase("Best viewers on ***")] - [TestCase("Best vie̮wers on ***")] - [TestCase("Best́ viewers on ***")] - [TestCase("Be̩st Viewers on ***")] - [TestCase("Be̾st Viewers on ***")] - [TestCase("B͟est Viewers on ***")] - [TestCase("B̟est viewers on ***")] - [TestCase("Cheap viewers on ***")] - [TestCase("Che̢ap vie̮wers on ***")] - [TestCase("Ch̍eap Viewers on ***")] - [TestCase("Ch͟eap viewers on ***")] - [TestCase("C̀heap Viewers on ***")] - [TestCase("Cheaͧp v̫iewers on ***")] - [TestCase("Cheaͧp v̫iewers on *** ")] - public async Task TestKnownStrings(string badString) - { - var rule = new BestCheapViewers(); - var botProxy = new Mock(); - var chat = new TwitchChatMessage(true, badString, "123", "456"); +public class BestCheapViewersTests : AChatRuleUnitTestBase { + /// + /// Tests strings that have been typed in chats. + /// + /// The string that should fail. + [Test] + [TestCase("Best viewers on ***")] + [TestCase("Best viewers on ***")] + [TestCase("Best vie̮wers on ***")] + [TestCase("Best́ viewers on ***")] + [TestCase("Be̩st Viewers on ***")] + [TestCase("Be̾st Viewers on ***")] + [TestCase("B͟est Viewers on ***")] + [TestCase("B̟est viewers on ***")] + [TestCase("Cheap viewers on ***")] + [TestCase("Che̢ap vie̮wers on ***")] + [TestCase("Ch̍eap Viewers on ***")] + [TestCase("Ch͟eap viewers on ***")] + [TestCase("C̀heap Viewers on ***")] + [TestCase("Cheaͧp v̫iewers on ***")] + [TestCase("Cheaͧp v̫iewers on *** ")] + public async Task TestKnownStrings(string badString) { + var rule = new BestCheapViewers(); + var botProxy = new Mock(); + var chat = new TwitchChatMessage(true, badString, "123", "456"); - // Process the message and assert that we fail the message. - var result = await rule.Handle("123", botProxy.Object, chat, _db); - Assert.That(result, Is.False); - } + // Process the message and assert that we fail the message. + bool result = await rule.Handle("123", botProxy.Object, chat, _db); + Assert.That(result, Is.False); + } } \ No newline at end of file diff --git a/src/Nullinside.Api.TwitchBot.Tests/ChatRules/DiscordTests.cs b/src/Nullinside.Api.TwitchBot.Tests/ChatRules/DiscordTests.cs index 790c4ea..fb23566 100644 --- a/src/Nullinside.Api.TwitchBot.Tests/ChatRules/DiscordTests.cs +++ b/src/Nullinside.Api.TwitchBot.Tests/ChatRules/DiscordTests.cs @@ -1,55 +1,48 @@ using Moq; + using Nullinside.Api.Common.Twitch; using Nullinside.Api.TwitchBot.ChatRules; namespace Nullinside.Api.TwitchBot.Tests.ChatRules; /// -/// Tests the class. +/// Tests the class. /// -public class DiscordTests : AChatRuleUnitTestBase -{ - /// - /// Tests the strings typed in chats. - /// - /// The string that should fail. - [Test] - [TestCase( - "Hello mate you stream pretty cool that's why I follow I would love to be a fan of yours if you don't mind kindly add me on Discord: 👉👉lacaster5")] - [TestCase( - "Hello, I just recently found your channel and can already tell that your content is great, and I would love to stick with you long term. If you're open to it, I'd be willing to connect with you on Discord. My username is teecash1000")] - [TestCase( - "Hey there 👋 You stream pretty cool that’s why I followed you. I will like to make you a friend and be a fan, if you don’t mind Kindly chat me on Discord, my Discord username is tuckzay")] - [TestCase( - "Hi! Just wanted to say that I absolutely love your gameplay and content.l'd love to connect better with you on Discord if that's possible. Looking forward to more awesome streams from you! My username is 👉👉👉 edisonpires")] - [TestCase( - "What's up Friend, great stream! I'm having a blast watching you stream. Let's move the conversation to Discord, where we can discuss more about streaming in more detail and get to know each other better. See you there! My discord username is 👉john_6029")] - public async Task TestKnownStrings(string badString) - { - var rule = new Discord(); - var botProxy = new Mock(); - var chat = new TwitchChatMessage(true, badString, "123", "456"); +public class DiscordTests : AChatRuleUnitTestBase { + /// + /// Tests the strings typed in chats. + /// + /// The string that should fail. + [Test] + [TestCase("Hello mate you stream pretty cool that's why I follow I would love to be a fan of yours if you don't mind kindly add me on Discord: 👉👉lacaster5")] + [TestCase("Hello, I just recently found your channel and can already tell that your content is great, and I would love to stick with you long term. If you're open to it, I'd be willing to connect with you on Discord. My username is teecash1000")] + [TestCase("Hey there 👋 You stream pretty cool that’s why I followed you. I will like to make you a friend and be a fan, if you don’t mind Kindly chat me on Discord, my Discord username is tuckzay")] + [TestCase("Hi! Just wanted to say that I absolutely love your gameplay and content.l'd love to connect better with you on Discord if that's possible. Looking forward to more awesome streams from you! My username is 👉👉👉 edisonpires")] + [TestCase("What's up Friend, great stream! I'm having a blast watching you stream. Let's move the conversation to Discord, where we can discuss more about streaming in more detail and get to know each other better. See you there! My discord username is 👉john_6029")] + public async Task TestKnownStrings(string badString) { + var rule = new Discord(); + var botProxy = new Mock(); + var chat = new TwitchChatMessage(true, badString, "123", "456"); - // Process the message and assert that we fail the message. - var result = await rule.Handle("123", botProxy.Object, chat, _db); - Assert.That(result, Is.False); - } + // Process the message and assert that we fail the message. + bool result = await rule.Handle("123", botProxy.Object, chat, _db); + Assert.That(result, Is.False); + } - /// - /// Ensure that the rule doesn't fail just because it contains the word discord. - /// - /// The message. - [Test] - [TestCase("I've heard of the application discord before and it sounds great")] - [TestCase("I was talking on my discord the other day")] - public async Task EnsureNoFalsePositives(string message) - { - var rule = new Discord(); - var botProxy = new Mock(); - var chat = new TwitchChatMessage(true, message, "123", "456"); + /// + /// Ensure that the rule doesn't fail just because it contains the word discord. + /// + /// The message. + [Test] + [TestCase("I've heard of the application discord before and it sounds great")] + [TestCase("I was talking on my discord the other day")] + public async Task EnsureNoFalsePositives(string message) { + var rule = new Discord(); + var botProxy = new Mock(); + var chat = new TwitchChatMessage(true, message, "123", "456"); - // Process the message and assert that we do not fail the message. - var result = await rule.Handle("123", botProxy.Object, chat, _db); - Assert.That(result, Is.True); - } + // Process the message and assert that we do not fail the message. + bool result = await rule.Handle("123", botProxy.Object, chat, _db); + Assert.That(result, Is.True); + } } \ No newline at end of file diff --git a/src/Nullinside.Api.TwitchBot.Tests/ChatRules/StreamViewersTests.cs b/src/Nullinside.Api.TwitchBot.Tests/ChatRules/StreamViewersTests.cs index 895c492..c0ebb6d 100644 --- a/src/Nullinside.Api.TwitchBot.Tests/ChatRules/StreamViewersTests.cs +++ b/src/Nullinside.Api.TwitchBot.Tests/ChatRules/StreamViewersTests.cs @@ -1,31 +1,28 @@ using Moq; + using Nullinside.Api.Common.Twitch; using Nullinside.Api.TwitchBot.ChatRules; namespace Nullinside.Api.TwitchBot.Tests.ChatRules; /// -/// Tests the class. +/// Tests the class. /// -public class StreamViewersTests : AChatRuleUnitTestBase -{ - /// - /// Tests the strings typed in chats. - /// - /// The string that should fail. - [Test] - [TestCase( - "@jellynyeko dо уоu alrеady triеd strеamviewers оrg? Real viewеrs, fire works! Тhеy arе now giving оut а frее рackagе for streamers оО")] - [TestCase( - "@kygaming98 dо уоu аlready tried streаmviewers оrg? Real viewers, firе works! Thеy arе now giving оut а freе package fоr streamers oО")] - public async Task TestKnownStrings(string badString) - { - var rule = new StreamViewers(); - var botProxy = new Mock(); - var chat = new TwitchChatMessage(true, badString, "123", "456"); +public class StreamViewersTests : AChatRuleUnitTestBase { + /// + /// Tests the strings typed in chats. + /// + /// The string that should fail. + [Test] + [TestCase("@jellynyeko dо уоu alrеady triеd strеamviewers оrg? Real viewеrs, fire works! Тhеy arе now giving оut а frее рackagе for streamers оО")] + [TestCase("@kygaming98 dо уоu аlready tried streаmviewers оrg? Real viewers, firе works! Thеy arе now giving оut а freе package fоr streamers oО")] + public async Task TestKnownStrings(string badString) { + var rule = new StreamViewers(); + var botProxy = new Mock(); + var chat = new TwitchChatMessage(true, badString, "123", "456"); - // Process the message and assert that we fail the message. - var result = await rule.Handle("123", botProxy.Object, chat, _db); - Assert.That(result, Is.False); - } + // Process the message and assert that we fail the message. + bool result = await rule.Handle("123", botProxy.Object, chat, _db); + Assert.That(result, Is.False); + } } \ No newline at end of file diff --git a/src/Nullinside.Api.TwitchBot.Tests/Nullinside.Api.TwitchBot.Tests.csproj b/src/Nullinside.Api.TwitchBot.Tests/Nullinside.Api.TwitchBot.Tests.csproj index f7c7c03..c592a05 100644 --- a/src/Nullinside.Api.TwitchBot.Tests/Nullinside.Api.TwitchBot.Tests.csproj +++ b/src/Nullinside.Api.TwitchBot.Tests/Nullinside.Api.TwitchBot.Tests.csproj @@ -32,5 +32,4 @@ - diff --git a/src/Nullinside.Api.TwitchBot.Tests/UnitTestBase.cs b/src/Nullinside.Api.TwitchBot.Tests/UnitTestBase.cs index 71c1d75..d7c7159 100644 --- a/src/Nullinside.Api.TwitchBot.Tests/UnitTestBase.cs +++ b/src/Nullinside.Api.TwitchBot.Tests/UnitTestBase.cs @@ -1,35 +1,33 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Diagnostics; + using Nullinside.Api.Model; namespace Nullinside.Api.TwitchBot.Tests; /// -/// A base class for all unit tests. +/// A base class for all unit tests. /// -public abstract class UnitTestBase -{ +public abstract class UnitTestBase { /// - /// A fake database. + /// A fake database. /// protected INullinsideContext _db; - [SetUp] - public virtual void Setup() - { - // Create an in-memory database to fake the SQL queries. Note that we generate a random GUID for the name - // here. If you use the same name more than once you'll get collisions between tests. - var contextOptions = new DbContextOptionsBuilder() - .UseInMemoryDatabase(Guid.NewGuid().ToString()) - .ConfigureWarnings(b => b.Ignore(InMemoryEventId.TransactionIgnoredWarning)) - .Options; - _db = new NullinsideContext(contextOptions); - } + [SetUp] + public virtual void Setup() { + // Create an in-memory database to fake the SQL queries. Note that we generate a random GUID for the name + // here. If you use the same name more than once you'll get collisions between tests. + DbContextOptions contextOptions = new DbContextOptionsBuilder() + .UseInMemoryDatabase(Guid.NewGuid().ToString()) + .ConfigureWarnings(b => b.Ignore(InMemoryEventId.TransactionIgnoredWarning)) + .Options; + _db = new NullinsideContext(contextOptions); + } - [TearDown] - public virtual async Task TearDown() - { - // Dispose since it has one. - await _db.DisposeAsync(); - } + [TearDown] + public virtual async Task TearDown() { + // Dispose since it has one. + await _db.DisposeAsync(); + } } \ No newline at end of file diff --git a/src/Nullinside.Api.TwitchBot/.editorconfig b/src/Nullinside.Api.TwitchBot/.editorconfig index 5ef8a11..6850b93 100644 --- a/src/Nullinside.Api.TwitchBot/.editorconfig +++ b/src/Nullinside.Api.TwitchBot/.editorconfig @@ -4,6 +4,9 @@ root = true [*] indent_style = space +# ReSharper properties +resharper_csharp_wrap_lines = false + # Xml files [*.xml] indent_size = 2 diff --git a/src/nullinside-api b/src/nullinside-api index 1826a07..7f2f783 160000 --- a/src/nullinside-api +++ b/src/nullinside-api @@ -1 +1 @@ -Subproject commit 1826a079105d62430487e71e0b8c34e8ee923746 +Subproject commit 7f2f783e4e24ca00aff35ed7e8c1d76bd797012d