using ChatBot.Models.Configuration; using FluentAssertions; namespace ChatBot.Tests.Models; public class DatabaseSettingsTests { [Fact] public void Constructor_ShouldInitializePropertiesWithDefaultValues() { // Arrange & Act var settings = new DatabaseSettings(); // Assert settings.ConnectionString.Should().Be(string.Empty); settings.EnableSensitiveDataLogging.Should().BeFalse(); settings.CommandTimeout.Should().Be(30); } [Fact] public void ConnectionString_ShouldBeSettable() { // Arrange var settings = new DatabaseSettings(); var expectedConnectionString = "Server=localhost;Database=testdb;User Id=user;Password=testpass;"; // Act settings.ConnectionString = expectedConnectionString; // Assert settings.ConnectionString.Should().Be(expectedConnectionString); } [Fact] public void EnableSensitiveDataLogging_ShouldBeSettable() { // Arrange var settings = new DatabaseSettings(); // Act settings.EnableSensitiveDataLogging = true; // Assert settings.EnableSensitiveDataLogging.Should().BeTrue(); } [Fact] public void CommandTimeout_ShouldBeSettable() { // Arrange var settings = new DatabaseSettings(); var expectedTimeout = 60; // Act settings.CommandTimeout = expectedTimeout; // Assert settings.CommandTimeout.Should().Be(expectedTimeout); } [Theory] [InlineData("")] [InlineData("Server=localhost;Database=testdb;")] [InlineData("Server=localhost;Port=5432;Database=chatbot;User Id=admin;Password=testpass;")] [InlineData( "Host=localhost;Port=5432;Database=chatbot;Username=admin;Password=testpass;Pooling=true;MinPoolSize=0;MaxPoolSize=100;" )] [InlineData("Data Source=localhost;Initial Catalog=chatbot;Integrated Security=true;")] [InlineData( "Server=localhost;Database=chatbot;Trusted_Connection=true;MultipleActiveResultSets=true;" )] public void ConnectionString_ShouldAcceptVariousFormats(string connectionString) { // Arrange var settings = new DatabaseSettings(); // Act settings.ConnectionString = connectionString; // Assert settings.ConnectionString.Should().Be(connectionString); } [Theory] [InlineData(true)] [InlineData(false)] public void EnableSensitiveDataLogging_ShouldAcceptBooleanValues(bool enabled) { // Arrange var settings = new DatabaseSettings(); // Act settings.EnableSensitiveDataLogging = enabled; // Assert settings.EnableSensitiveDataLogging.Should().Be(enabled); } [Theory] [InlineData(0)] [InlineData(1)] [InlineData(30)] [InlineData(60)] [InlineData(300)] [InlineData(int.MaxValue)] public void CommandTimeout_ShouldAcceptVariousValues(int timeout) { // Arrange var settings = new DatabaseSettings(); // Act settings.CommandTimeout = timeout; // Assert settings.CommandTimeout.Should().Be(timeout); } [Fact] public void AllProperties_ShouldBeMutable() { // Arrange var settings = new DatabaseSettings(); // Act settings.ConnectionString = "Server=test;Database=testdb;"; settings.EnableSensitiveDataLogging = true; settings.CommandTimeout = 120; // Assert settings.ConnectionString.Should().Be("Server=test;Database=testdb;"); settings.EnableSensitiveDataLogging.Should().BeTrue(); settings.CommandTimeout.Should().Be(120); } [Fact] public void Settings_ShouldSupportEmptyConnectionString() { // Arrange var settings = new DatabaseSettings(); // Act settings.ConnectionString = ""; // Assert settings.ConnectionString.Should().Be(""); } [Fact] public void Settings_ShouldSupportNullConnectionString() { // Arrange var settings = new DatabaseSettings(); // Act settings.ConnectionString = null!; // Assert settings.ConnectionString.Should().BeNull(); } [Fact] public void Settings_ShouldSupportVeryLongConnectionString() { // Arrange var settings = new DatabaseSettings(); var longConnectionString = new string('A', 1000); // Act settings.ConnectionString = longConnectionString; // Assert settings.ConnectionString.Should().Be(longConnectionString); settings.ConnectionString.Length.Should().Be(1000); } [Fact] public void Settings_ShouldSupportPostgreSQLConnectionString() { // Arrange var settings = new DatabaseSettings(); var postgresConnectionString = "Host=localhost;Port=5432;Database=chatbot;Username=admin;Password=testpass;Pooling=true;MinPoolSize=0;MaxPoolSize=100;Connection Lifetime=0;"; // Act settings.ConnectionString = postgresConnectionString; // Assert settings.ConnectionString.Should().Be(postgresConnectionString); } [Fact] public void Settings_ShouldSupportSQLServerConnectionString() { // Arrange var settings = new DatabaseSettings(); var sqlServerConnectionString = "Server=localhost;Database=chatbot;User Id=admin;Password=testpass;TrustServerCertificate=true;"; // Act settings.ConnectionString = sqlServerConnectionString; // Assert settings.ConnectionString.Should().Be(sqlServerConnectionString); } [Fact] public void Settings_ShouldSupportSQLiteConnectionString() { // Arrange var settings = new DatabaseSettings(); var sqliteConnectionString = "Data Source=chatbot.db;Cache=Shared;"; // Act settings.ConnectionString = sqliteConnectionString; // Assert settings.ConnectionString.Should().Be(sqliteConnectionString); } [Fact] public void Settings_ShouldSupportMySQLConnectionString() { // Arrange var settings = new DatabaseSettings(); var mysqlConnectionString = "Server=localhost;Port=3306;Database=chatbot;Uid=admin;Pwd=testpass;"; // Act settings.ConnectionString = mysqlConnectionString; // Assert settings.ConnectionString.Should().Be(mysqlConnectionString); } [Fact] public void Settings_ShouldSupportConnectionStringWithSpecialCharacters() { // Arrange var settings = new DatabaseSettings(); var connectionStringWithSpecialChars = "Server=localhost;Database=test-db;User Id=user@domain.com;Password=testpass123!;"; // Act settings.ConnectionString = connectionStringWithSpecialChars; // Assert settings.ConnectionString.Should().Be(connectionStringWithSpecialChars); } [Fact] public void Settings_ShouldSupportConnectionStringWithUnicode() { // Arrange var settings = new DatabaseSettings(); var connectionStringWithUnicode = "Server=localhost;Database=тестовая_база;User Id=пользователь;Password=testpass;"; // Act settings.ConnectionString = connectionStringWithUnicode; // Assert settings.ConnectionString.Should().Be(connectionStringWithUnicode); } [Fact] public void Settings_ShouldSupportZeroCommandTimeout() { // Arrange var settings = new DatabaseSettings(); // Act settings.CommandTimeout = 0; // Assert settings.CommandTimeout.Should().Be(0); } [Fact] public void Settings_ShouldSupportNegativeCommandTimeout() { // Arrange var settings = new DatabaseSettings(); // Act settings.CommandTimeout = -1; // Assert settings.CommandTimeout.Should().Be(-1); } [Fact] public void Settings_ShouldSupportMaxIntCommandTimeout() { // Arrange var settings = new DatabaseSettings(); // Act settings.CommandTimeout = int.MaxValue; // Assert settings.CommandTimeout.Should().Be(int.MaxValue); } [Fact] public void Settings_ShouldSupportMinIntCommandTimeout() { // Arrange var settings = new DatabaseSettings(); // Act settings.CommandTimeout = int.MinValue; // Assert settings.CommandTimeout.Should().Be(int.MinValue); } [Fact] public void Settings_ShouldSupportDevelopmentMode() { // Arrange var settings = new DatabaseSettings(); // Act settings.EnableSensitiveDataLogging = true; settings.ConnectionString = "Server=localhost;Database=chatbot_dev;"; // Assert settings.EnableSensitiveDataLogging.Should().BeTrue(); settings.ConnectionString.Should().Be("Server=localhost;Database=chatbot_dev;"); } [Fact] public void Settings_ShouldSupportProductionMode() { // Arrange var settings = new DatabaseSettings(); // Act settings.EnableSensitiveDataLogging = false; settings.ConnectionString = "Server=prod-server;Database=chatbot_prod;"; // Assert settings.EnableSensitiveDataLogging.Should().BeFalse(); settings.ConnectionString.Should().Be("Server=prod-server;Database=chatbot_prod;"); } [Fact] public void Settings_ShouldSupportConnectionStringWithMultipleParameters() { // Arrange var settings = new DatabaseSettings(); var complexConnectionString = "Server=localhost;Port=5432;Database=chatbot;Username=admin;Password=testpass;Pooling=true;MinPoolSize=5;MaxPoolSize=100;Connection Lifetime=300;Command Timeout=60;"; // Act settings.ConnectionString = complexConnectionString; // Assert settings.ConnectionString.Should().Be(complexConnectionString); } [Fact] public void Settings_ShouldSupportConnectionStringWithSpaces() { // Arrange var settings = new DatabaseSettings(); var connectionStringWithSpaces = "Server = localhost ; Database = chatbot ; User Id = admin ; Password = testpass ;"; // Act settings.ConnectionString = connectionStringWithSpaces; // Assert settings.ConnectionString.Should().Be(connectionStringWithSpaces); } [Fact] public void Settings_ShouldSupportConnectionStringWithQuotes() { // Arrange var settings = new DatabaseSettings(); var connectionStringWithQuotes = "Server=\"localhost\";Database=\"chatbot\";User Id=\"admin\";Password=\"testpass\";"; // Act settings.ConnectionString = connectionStringWithQuotes; // Assert settings.ConnectionString.Should().Be(connectionStringWithQuotes); } [Fact] public void Settings_ShouldSupportConnectionStringWithSemicolons() { // Arrange var settings = new DatabaseSettings(); var connectionStringWithSemicolons = "Server=localhost;;Database=chatbot;;User Id=admin;;Password=testpass;;"; // Act settings.ConnectionString = connectionStringWithSemicolons; // Assert settings.ConnectionString.Should().Be(connectionStringWithSemicolons); } [Fact] public void Settings_ShouldSupportConnectionStringWithEquals() { // Arrange var settings = new DatabaseSettings(); var connectionStringWithEquals = "Server=localhost;Database=chatbot;User Id=admin;Password=testpass=123;"; // Act settings.ConnectionString = connectionStringWithEquals; // Assert settings.ConnectionString.Should().Be(connectionStringWithEquals); } [Fact] public void Settings_ShouldSupportConnectionStringWithNewlines() { // Arrange var settings = new DatabaseSettings(); var connectionStringWithNewlines = "Server=localhost;\nDatabase=chatbot;\nUser Id=admin;\nPassword=testpass;"; // Act settings.ConnectionString = connectionStringWithNewlines; // Assert settings.ConnectionString.Should().Be(connectionStringWithNewlines); } [Fact] public void Settings_ShouldSupportConnectionStringWithTabs() { // Arrange var settings = new DatabaseSettings(); var connectionStringWithTabs = "Server=localhost;\tDatabase=chatbot;\tUser Id=admin;\tPassword=testpass;"; // Act settings.ConnectionString = connectionStringWithTabs; // Assert settings.ConnectionString.Should().Be(connectionStringWithTabs); } }