Files
ChatBot/ChatBot.Tests/Configuration/Validators/TelegramBotSettingsValidatorTests.cs
Leonid Pershin 6c34b9cbb9
All checks were successful
SonarQube / Build and analyze (push) Successful in 3m46s
Unit Tests / Run Tests (push) Successful in 2m21s
add latest tests
2025-10-20 09:29:08 +03:00

357 lines
12 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using ChatBot.Models.Configuration;
using ChatBot.Models.Configuration.Validators;
using FluentAssertions;
using Microsoft.Extensions.Options;
namespace ChatBot.Tests.Configuration.Validators;
public class TelegramBotSettingsValidatorTests
{
private readonly TelegramBotSettingsValidator _validator;
public TelegramBotSettingsValidatorTests()
{
_validator = new TelegramBotSettingsValidator();
}
[Fact]
public void Validate_WithValidSettings_ShouldReturnSuccess()
{
// Arrange
var settings = CreateValidTelegramBotSettings();
// Act
var result = _validator.Validate(null, settings);
// Assert
result.Succeeded.Should().BeTrue();
result.Failed.Should().BeFalse();
result.FailureMessage.Should().BeNullOrEmpty();
}
[Fact]
public void Validate_WithEmptyBotToken_ShouldReturnFailure()
{
// Arrange
var settings = CreateValidTelegramBotSettings();
settings.BotToken = string.Empty;
// Act
var result = _validator.Validate(null, settings);
// Assert
result.Succeeded.Should().BeFalse();
result.Failed.Should().BeTrue();
result.FailureMessage.Should().Contain("Telegram bot token is required");
}
[Fact]
public void Validate_WithNullBotToken_ShouldReturnFailure()
{
// Arrange
var settings = CreateValidTelegramBotSettings();
settings.BotToken = null!;
// Act
var result = _validator.Validate(null, settings);
// Assert
result.Succeeded.Should().BeFalse();
result.Failed.Should().BeTrue();
result.FailureMessage.Should().Contain("Telegram bot token is required");
}
[Fact]
public void Validate_WithWhitespaceBotToken_ShouldReturnFailure()
{
// Arrange
var settings = CreateValidTelegramBotSettings();
settings.BotToken = " ";
// Act
var result = _validator.Validate(null, settings);
// Assert
result.Succeeded.Should().BeFalse();
result.Failed.Should().BeTrue();
result.FailureMessage.Should().Contain("Telegram bot token is required");
}
[Theory]
[InlineData("")]
[InlineData(" ")]
[InlineData("\t")]
[InlineData("\n")]
[InlineData("\r\n")]
public void Validate_WithVariousEmptyStrings_ShouldReturnFailure(string emptyString)
{
// Arrange
var settings = CreateValidTelegramBotSettings();
settings.BotToken = emptyString;
// Act
var result = _validator.Validate(null, settings);
// Assert
result.Succeeded.Should().BeFalse();
result.Failed.Should().BeTrue();
result.FailureMessage.Should().Contain("Telegram bot token is required");
}
[Theory]
[InlineData("123456789012345678901234567890123456789")] // 39 characters
[InlineData("12345678901234567890123456789012345678")] // 38 characters
[InlineData("1234567890123456789012345678901234567")] // 37 characters
[InlineData("123456789012345678901234567890123456")] // 36 characters
[InlineData("12345678901234567890123456789012345")] // 35 characters
[InlineData("1234567890123456789012345678901234")] // 34 characters
[InlineData("123456789012345678901234567890123")] // 33 characters
[InlineData("12345678901234567890123456789012")] // 32 characters
[InlineData("1234567890123456789012345678901")] // 31 characters
[InlineData("123456789012345678901234567890")] // 30 characters
[InlineData("12345678901234567890123456789")] // 29 characters
[InlineData("1234567890123456789012345678")] // 28 characters
[InlineData("123456789012345678901234567")] // 27 characters
[InlineData("12345678901234567890123456")] // 26 characters
[InlineData("1234567890123456789012345")] // 25 characters
[InlineData("123456789012345678901234")] // 24 characters
[InlineData("12345678901234567890123")] // 23 characters
[InlineData("1234567890123456789012")] // 22 characters
[InlineData("123456789012345678901")] // 21 characters
[InlineData("12345678901234567890")] // 20 characters
[InlineData("1234567890123456789")] // 19 characters
[InlineData("123456789012345678")] // 18 characters
[InlineData("12345678901234567")] // 17 characters
[InlineData("1234567890123456")] // 16 characters
[InlineData("123456789012345")] // 15 characters
[InlineData("12345678901234")] // 14 characters
[InlineData("1234567890123")] // 13 characters
[InlineData("123456789012")] // 12 characters
[InlineData("12345678901")] // 11 characters
[InlineData("1234567890")] // 10 characters
[InlineData("123456789")] // 9 characters
[InlineData("12345678")] // 8 characters
[InlineData("1234567")] // 7 characters
[InlineData("123456")] // 6 characters
[InlineData("12345")] // 5 characters
[InlineData("1234")] // 4 characters
[InlineData("123")] // 3 characters
[InlineData("12")] // 2 characters
[InlineData("1")] // 1 character
public void Validate_WithTooShortBotToken_ShouldReturnFailure(string shortToken)
{
// Arrange
var settings = CreateValidTelegramBotSettings();
settings.BotToken = shortToken;
// Act
var result = _validator.Validate(null, settings);
// Assert
result.Succeeded.Should().BeFalse();
result.Failed.Should().BeTrue();
result.FailureMessage.Should().Contain("Telegram bot token must be at least 40 characters");
}
[Theory]
[InlineData("1234567890123456789012345678901234567890")] // 40 characters
[InlineData("12345678901234567890123456789012345678901")] // 41 characters
[InlineData("123456789012345678901234567890123456789012")] // 42 characters
[InlineData("1234567890123456789012345678901234567890123")] // 43 characters
[InlineData("12345678901234567890123456789012345678901234")] // 44 characters
[InlineData("123456789012345678901234567890123456789012345")] // 45 characters
[InlineData("1234567890123456789012345678901234567890123456")] // 46 characters
[InlineData("12345678901234567890123456789012345678901234567")] // 47 characters
[InlineData("123456789012345678901234567890123456789012345678")] // 48 characters
[InlineData("1234567890123456789012345678901234567890123456789")] // 49 characters
[InlineData("12345678901234567890123456789012345678901234567890")] // 50 characters
public void Validate_WithValidLengthBotToken_ShouldReturnSuccess(string validToken)
{
// Arrange
var settings = CreateValidTelegramBotSettings();
settings.BotToken = validToken;
// Act
var result = _validator.Validate(null, settings);
// Assert
result.Succeeded.Should().BeTrue();
result.Failed.Should().BeFalse();
result.FailureMessage.Should().BeNullOrEmpty();
}
[Theory]
[InlineData("1234567890123456789012345678901234567890")]
[InlineData("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz")]
[InlineData("12345678901234567890123456789012345678901234567890")]
[InlineData("abcdefghijklmnopqrstuvwxyz12345678901234567890")]
[InlineData("123456789012345678901234567890123456789012345678901234567890")]
public void Validate_WithVariousValidTokens_ShouldReturnSuccess(string validToken)
{
// Arrange
var settings = CreateValidTelegramBotSettings();
settings.BotToken = validToken;
// Act
var result = _validator.Validate(null, settings);
// Assert
result.Succeeded.Should().BeTrue();
result.Failed.Should().BeFalse();
result.FailureMessage.Should().BeNullOrEmpty();
}
[Fact]
public void Validate_WithNullSettings_ShouldThrowException()
{
// Arrange & Act & Assert
var act = () => _validator.Validate(null, null!);
act.Should().Throw<NullReferenceException>();
}
[Fact]
public void ValidateOptionsResult_Success_ShouldHaveCorrectProperties()
{
// Arrange
var settings = CreateValidTelegramBotSettings();
// Act
var result = _validator.Validate(null, settings);
// Assert
result.Succeeded.Should().BeTrue();
result.Failed.Should().BeFalse();
result.FailureMessage.Should().BeNullOrEmpty();
}
[Fact]
public void ValidateOptionsResult_Failure_ShouldHaveCorrectProperties()
{
// Arrange
var settings = new TelegramBotSettings { BotToken = string.Empty };
// Act
var result = _validator.Validate(null, settings);
// Assert
result.Succeeded.Should().BeFalse();
result.Failed.Should().BeTrue();
result.FailureMessage.Should().NotBeNullOrEmpty();
result.FailureMessage.Should().Contain("Telegram bot token is required");
}
[Fact]
public void Validator_ShouldImplementIValidateOptions()
{
// Arrange & Act
var validator = new TelegramBotSettingsValidator();
// Assert
validator.Should().BeAssignableTo<IValidateOptions<TelegramBotSettings>>();
}
[Fact]
public void Validate_WithVeryLongValidToken_ShouldReturnSuccess()
{
// Arrange
var settings = CreateValidTelegramBotSettings();
settings.BotToken = new string('A', 1000); // Very long token
// Act
var result = _validator.Validate(null, settings);
// Assert
result.Succeeded.Should().BeTrue();
result.Failed.Should().BeFalse();
result.FailureMessage.Should().BeNullOrEmpty();
}
[Fact]
public void Validate_WithTokenContainingSpecialCharacters_ShouldReturnSuccess()
{
// Arrange
var settings = CreateValidTelegramBotSettings();
settings.BotToken = "1234567890123456789012345678901234567890!@#$%^&*()";
// Act
var result = _validator.Validate(null, settings);
// Assert
result.Succeeded.Should().BeTrue();
result.Failed.Should().BeFalse();
result.FailureMessage.Should().BeNullOrEmpty();
}
[Fact]
public void Validate_WithTokenContainingSpaces_ShouldReturnSuccess()
{
// Arrange
var settings = CreateValidTelegramBotSettings();
settings.BotToken = "1234567890123456789012345678901234567890 ";
// Act
var result = _validator.Validate(null, settings);
// Assert
result.Succeeded.Should().BeTrue();
result.Failed.Should().BeFalse();
result.FailureMessage.Should().BeNullOrEmpty();
}
[Fact]
public void Validate_WithTokenContainingUnicodeCharacters_ShouldReturnSuccess()
{
// Arrange
var settings = CreateValidTelegramBotSettings();
settings.BotToken = "1234567890123456789012345678901234567890абвгд";
// Act
var result = _validator.Validate(null, settings);
// Assert
result.Succeeded.Should().BeTrue();
result.Failed.Should().BeFalse();
result.FailureMessage.Should().BeNullOrEmpty();
}
[Fact]
public void Validate_WithExactMinimumLengthToken_ShouldReturnSuccess()
{
// Arrange
var settings = CreateValidTelegramBotSettings();
settings.BotToken = "1234567890123456789012345678901234567890"; // Exactly 40 characters
// Act
var result = _validator.Validate(null, settings);
// Assert
result.Succeeded.Should().BeTrue();
result.Failed.Should().BeFalse();
result.FailureMessage.Should().BeNullOrEmpty();
}
[Fact]
public void Validate_WithOneCharacterLessThanMinimum_ShouldReturnFailure()
{
// Arrange
var settings = CreateValidTelegramBotSettings();
settings.BotToken = "123456789012345678901234567890123456789"; // 39 characters
// Act
var result = _validator.Validate(null, settings);
// Assert
result.Succeeded.Should().BeFalse();
result.Failed.Should().BeTrue();
result.FailureMessage.Should().Contain("Telegram bot token must be at least 40 characters");
}
private static TelegramBotSettings CreateValidTelegramBotSettings()
{
return new TelegramBotSettings
{
BotToken = "1234567890123456789012345678901234567890", // 40 characters
};
}
}