|
| 1 | +using BotSharp.Core.Infrastructures; |
| 2 | +using Xunit; |
| 3 | + |
| 4 | +namespace BotSharp.Core.UnitTests.Infrastructures; |
| 5 | + |
| 6 | +public class SettingServiceTests |
| 7 | +{ |
| 8 | + [Fact] |
| 9 | + public void Mask_null_or_empty_returns_empty() |
| 10 | + { |
| 11 | + Assert.Equal(string.Empty, SettingService.Mask(null!)); |
| 12 | + Assert.Equal(string.Empty, SettingService.Mask(string.Empty)); |
| 13 | + } |
| 14 | + |
| 15 | + [Theory] |
| 16 | + [InlineData("a", "*")] |
| 17 | + [InlineData("ab", "**")] |
| 18 | + [InlineData("abc", "a**")] |
| 19 | + [InlineData("abcd", "a***")] |
| 20 | + [InlineData("0123456789", "0123******")] |
| 21 | + public void Mask_short_and_medium_inputs_matches_expected_masked_form(string input, string expected) |
| 22 | + { |
| 23 | + var actual = SettingService.Mask(input); |
| 24 | + Assert.Equal(expected, actual); |
| 25 | + } |
| 26 | + |
| 27 | + [Fact] |
| 28 | + public void Mask_long_value_preserves_length_and_replaces_suffix_with_stars() |
| 29 | + { |
| 30 | + var input = new string('x', 64); |
| 31 | + var masked = SettingService.Mask(input); |
| 32 | + |
| 33 | + Assert.Equal(64, masked.Length); |
| 34 | + Assert.NotEqual(input, masked); |
| 35 | + Assert.Contains('*', masked); |
| 36 | + Assert.StartsWith("x", masked, StringComparison.Ordinal); |
| 37 | + Assert.EndsWith("*", masked); |
| 38 | + } |
| 39 | + |
| 40 | + [Theory] |
| 41 | + [InlineData("e", 1)] |
| 42 | + [InlineData("ef", 2)] |
| 43 | + [InlineData("efg", 3)] |
| 44 | + [InlineData("efgh", 4)] |
| 45 | + [InlineData("123456789012345", 15)] |
| 46 | + [InlineData("abcdefghijklmnopqrstuvwxyz", 26)] |
| 47 | + public void Mask_preserves_original_string_length(string input, int expectedLength) |
| 48 | + { |
| 49 | + var masked = SettingService.Mask(input); |
| 50 | + Assert.Equal(expectedLength, masked.Length); |
| 51 | + } |
| 52 | + |
| 53 | + [Theory] |
| 54 | + [InlineData("a")] |
| 55 | + [InlineData("ab")] |
| 56 | + [InlineData("abc")] |
| 57 | + [InlineData("password123")] |
| 58 | + public void Mask_contains_at_least_one_asterisk(string input) |
| 59 | + { |
| 60 | + var masked = SettingService.Mask(input); |
| 61 | + Assert.Contains('*', masked); |
| 62 | + } |
| 63 | + |
| 64 | + [Fact] |
| 65 | + public void Mask_very_long_string() |
| 66 | + { |
| 67 | + var input = new string('a', 1000); |
| 68 | + var masked = SettingService.Mask(input); |
| 69 | + |
| 70 | + Assert.Equal(1000, masked.Length); |
| 71 | + Assert.Contains('*', masked); |
| 72 | + var keepLength = (1000 - 1) / 2; |
| 73 | + var asteriskCount = 1000 - keepLength; |
| 74 | + Assert.Equal(asteriskCount, masked.Count(c => c == '*')); |
| 75 | + } |
| 76 | + |
| 77 | + [Fact] |
| 78 | + public void Mask_api_key_like_string() |
| 79 | + { |
| 80 | + var input = "sk_live_1234567890abcdef"; |
| 81 | + var masked = SettingService.Mask(input); |
| 82 | + |
| 83 | + Assert.Equal(input.Length, masked.Length); |
| 84 | + Assert.Contains('*', masked); |
| 85 | + Assert.StartsWith("sk_li", masked); |
| 86 | + } |
| 87 | +} |
0 commit comments