MarketAlly.AIPlugin.Extensions/MarketAlly.AIPlugin.Learnin.../Exceptions/ExceptionTests.cs

323 lines
12 KiB
C#
Executable File

using MarketAlly.AIPlugin.Learning.Exceptions;
namespace MarketAlly.AIPlugin.Learning.Tests.Exceptions
{
[TestClass]
public class ExceptionTests
{
[TestMethod]
public void CompilationException_WithErrorDetails_CorrectlyInitialized()
{
// Arrange
var errorCount = 5;
var warningCount = 3;
var errors = new string[] { "Error 1", "Error 2", "Error 3", "Error 4", "Error 5" };
// Act
var exception = new CompilationException(errorCount, warningCount, errors);
// Assert
Assert.AreEqual(errorCount, exception.ErrorCount);
Assert.AreEqual(warningCount, exception.WarningCount);
Assert.AreEqual(errors.Length, exception.Errors.Length);
Assert.IsTrue(exception.Message.Contains("5 errors"));
Assert.IsTrue(exception.Message.Contains("3 warnings"));
}
[TestMethod]
public void CompilationException_EmptyErrorList_HandledCorrectly()
{
// Arrange
var errorCount = 0;
var warningCount = 2;
var errors = new string[0];
// Act
var exception = new CompilationException(errorCount, warningCount, errors);
// Assert
Assert.AreEqual(0, exception.ErrorCount);
Assert.AreEqual(2, exception.WarningCount);
Assert.AreEqual(0, exception.Errors.Length);
Assert.IsTrue(exception.Message.Contains("0 errors"));
}
[TestMethod]
public void CompilationException_AlternativeConstructor_CorrectlyInitialized()
{
// Arrange
var message = "Custom compilation error";
var errorCount = 3;
var warningCount = 1;
var innerException = new InvalidOperationException("Inner exception");
// Act
var exception = new CompilationException(message, errorCount, warningCount, innerException);
// Assert
Assert.AreEqual(errorCount, exception.ErrorCount);
Assert.AreEqual(warningCount, exception.WarningCount);
Assert.AreEqual(message, exception.Message);
Assert.AreEqual(innerException, exception.InnerException);
}
[TestMethod]
public void RefactorIQException_WithOperation_CorrectlyInitialized()
{
// Arrange
var operation = "IndexSolution";
var message = "Failed to index solution";
// Act
var exception = new RefactorIQException(operation, message);
// Assert
Assert.AreEqual(operation, exception.Operation);
Assert.IsTrue(exception.Message.Contains(operation));
Assert.IsTrue(exception.Message.Contains(message));
}
[TestMethod]
public void RefactorIQException_WithInnerException_CorrectlyInitialized()
{
// Arrange
var operation = "SearchSymbols";
var message = "Search operation failed";
var innerException = new FileNotFoundException("Config file not found");
// Act
var exception = new RefactorIQException(operation, message, innerException);
// Assert
Assert.AreEqual(operation, exception.Operation);
Assert.IsTrue(exception.Message.Contains(operation));
Assert.IsTrue(exception.Message.Contains(message));
Assert.AreEqual(innerException, exception.InnerException);
}
[TestMethod]
public void SecurityException_CorrectlyInitialized()
{
// Arrange
var operation = "PathValidation";
var resource = @"C:\Windows\System32\..\..\malicious.exe";
var message = "Path traversal detected";
// Act
var exception = new SecurityException(operation, resource, message);
// Assert
Assert.AreEqual(operation, exception.Operation);
Assert.AreEqual(resource, exception.Resource);
Assert.IsTrue(exception.Message.Contains(operation));
Assert.IsTrue(exception.Message.Contains(resource));
Assert.IsTrue(exception.Message.Contains(message));
}
[TestMethod]
public void ConfigurationException_CorrectlyInitialized()
{
// Arrange
var configurationKey = "Learning:Git:CommitterEmail";
var message = "Invalid email format";
// Act
var exception = new ConfigurationException(configurationKey, message);
// Assert
Assert.AreEqual(configurationKey, exception.ConfigurationKey);
Assert.IsTrue(exception.Message.Contains(configurationKey));
Assert.IsTrue(exception.Message.Contains(message));
}
[TestMethod]
public void ConfigurationException_WithInnerException_CorrectlyInitialized()
{
// Arrange
var configurationKey = "Learning:Security:MaxFileSize";
var message = "Invalid file size configuration";
var innerException = new FormatException("Invalid number format");
// Act
var exception = new ConfigurationException(configurationKey, message, innerException);
// Assert
Assert.AreEqual(configurationKey, exception.ConfigurationKey);
Assert.IsTrue(exception.Message.Contains(configurationKey));
Assert.IsTrue(exception.Message.Contains(message));
Assert.AreEqual(innerException, exception.InnerException);
}
[TestMethod]
public void GitOperationException_CorrectlyInitialized()
{
// Arrange
var operation = "CreateBranch";
var repositoryPath = @"C:\MyProject\.git";
var message = "Failed to create branch";
// Act
var exception = new GitOperationException(operation, repositoryPath, message);
// Assert
Assert.AreEqual(operation, exception.Operation);
Assert.AreEqual(repositoryPath, exception.RepositoryPath);
Assert.IsTrue(exception.Message.Contains(operation));
Assert.IsTrue(exception.Message.Contains(repositoryPath));
Assert.IsTrue(exception.Message.Contains(message));
}
[TestMethod]
public void GitOperationException_WithInnerException_CorrectlyInitialized()
{
// Arrange
var operation = "CommitChanges";
var repositoryPath = @"C:\MyProject";
var message = "Failed to commit changes";
var innerException = new UnauthorizedAccessException("Access denied");
// Act
var exception = new GitOperationException(operation, repositoryPath, message, innerException);
// Assert
Assert.AreEqual(operation, exception.Operation);
Assert.AreEqual(repositoryPath, exception.RepositoryPath);
Assert.IsTrue(exception.Message.Contains(operation));
Assert.IsTrue(exception.Message.Contains(repositoryPath));
Assert.IsTrue(exception.Message.Contains(message));
Assert.AreEqual(innerException, exception.InnerException);
}
[TestMethod]
public void AIServiceException_WithRetryableFlag_CorrectlyInitialized()
{
// Arrange
var serviceName = "OpenAIEmbeddings";
var message = "Rate limit exceeded";
var isRetryable = true;
// Act
var exception = new AIServiceException(serviceName, message, isRetryable);
// Assert
Assert.AreEqual(serviceName, exception.ServiceName);
Assert.IsTrue(exception.IsRetryable);
Assert.IsTrue(exception.Message.Contains(serviceName));
Assert.IsTrue(exception.Message.Contains(message));
}
[TestMethod]
public void AIServiceException_WithInnerException_CorrectlyInitialized()
{
// Arrange
var serviceName = "VectorSearch";
var message = "Search operation failed";
var innerException = new HttpRequestException("429 Too Many Requests");
var isRetryable = false;
// Act
var exception = new AIServiceException(serviceName, message, innerException, isRetryable);
// Assert
Assert.AreEqual(serviceName, exception.ServiceName);
Assert.IsFalse(exception.IsRetryable);
Assert.IsTrue(exception.Message.Contains(serviceName));
Assert.IsTrue(exception.Message.Contains(message));
Assert.AreEqual(innerException, exception.InnerException);
}
[TestMethod]
public void LearningIterationException_CorrectlyInitialized()
{
// Arrange
var iterationNumber = 5;
var phase = "Analysis";
var message = "Iteration processing failed";
// Act
var exception = new LearningIterationException(iterationNumber, phase, message);
// Assert
Assert.AreEqual(iterationNumber, exception.IterationNumber);
Assert.AreEqual(phase, exception.Phase);
Assert.IsTrue(exception.Message.Contains(iterationNumber.ToString()));
Assert.IsTrue(exception.Message.Contains(phase));
Assert.IsTrue(exception.Message.Contains(message));
}
[TestMethod]
public void LearningIterationException_WithInnerException_CorrectlyInitialized()
{
// Arrange
var iterationNumber = 3;
var phase = "Refactoring";
var message = "Refactoring phase failed";
var innerException = new IOException("File access denied");
// Act
var exception = new LearningIterationException(iterationNumber, phase, message, innerException);
// Assert
Assert.AreEqual(iterationNumber, exception.IterationNumber);
Assert.AreEqual(phase, exception.Phase);
Assert.IsTrue(exception.Message.Contains(iterationNumber.ToString()));
Assert.IsTrue(exception.Message.Contains(phase));
Assert.IsTrue(exception.Message.Contains(message));
Assert.AreEqual(innerException, exception.InnerException);
}
[TestMethod]
public void AllExceptions_InheritFromLearningException()
{
// Arrange & Act
var compilationEx = new CompilationException(1, 0, new[] { "error" });
var refactorIqEx = new RefactorIQException("op", "message");
var securityEx = new SecurityException("op", "resource", "message");
var configEx = new ConfigurationException("key", "message");
var gitEx = new GitOperationException("op", "path", "message");
var aiEx = new AIServiceException("service", "message");
var iterationEx = new LearningIterationException(1, "phase", "message");
// Assert
Assert.IsInstanceOfType(compilationEx, typeof(LearningException));
Assert.IsInstanceOfType(refactorIqEx, typeof(LearningException));
Assert.IsInstanceOfType(securityEx, typeof(LearningException));
Assert.IsInstanceOfType(configEx, typeof(LearningException));
Assert.IsInstanceOfType(gitEx, typeof(LearningException));
Assert.IsInstanceOfType(aiEx, typeof(LearningException));
Assert.IsInstanceOfType(iterationEx, typeof(LearningException));
}
[TestMethod]
public void CompilationException_NullErrorArray_HandledCorrectly()
{
// Arrange
var errorCount = 2;
var warningCount = 1;
string[]? errors = null;
// Act
var exception = new CompilationException(errorCount, warningCount, errors);
// Assert
Assert.AreEqual(errorCount, exception.ErrorCount);
Assert.AreEqual(warningCount, exception.WarningCount);
Assert.IsNotNull(exception.Errors);
Assert.AreEqual(0, exception.Errors.Length);
}
[TestMethod]
public void AIServiceException_DefaultRetryable_IsTrue()
{
// Arrange
var serviceName = "TestService";
var message = "Test message";
// Act
var exception = new AIServiceException(serviceName, message);
// Assert
Assert.IsTrue(exception.IsRetryable);
}
}
}