Files
ChatBot/ChatBot.Tests/Services/Interfaces/IAIServiceTests.cs
Leonid Pershin 1d0ebfeeb7
Some checks failed
SonarQube / Build and analyze (push) Failing after 1m44s
Unit Tests / Run Tests (push) Failing after 1m7s
fix tests
2025-10-20 10:39:58 +03:00

328 lines
10 KiB
C#

using ChatBot.Models.Dto;
using ChatBot.Services.Interfaces;
using ChatBot.Tests.TestUtilities;
using FluentAssertions;
using Moq;
namespace ChatBot.Tests.Services.Interfaces;
public class IAIServiceTests : UnitTestBase
{
[Fact]
public void IAIService_ShouldHaveCorrectMethodSignatures()
{
// Arrange & Act
var interfaceType = typeof(IAIService);
var methods = interfaceType.GetMethods();
// Assert
methods.Should().HaveCount(2);
var generateChatCompletionMethod = methods.FirstOrDefault(m =>
m.Name == "GenerateChatCompletionAsync"
);
generateChatCompletionMethod.Should().NotBeNull();
generateChatCompletionMethod!.ReturnType.Should().Be<Task<string>>();
generateChatCompletionMethod.GetParameters().Should().HaveCount(2);
generateChatCompletionMethod
.GetParameters()[0]
.ParameterType.Should()
.Be<List<ChatMessage>>();
generateChatCompletionMethod
.GetParameters()[1]
.ParameterType.Should()
.Be<CancellationToken>();
var generateChatCompletionWithCompressionMethod = methods.FirstOrDefault(m =>
m.Name == "GenerateChatCompletionWithCompressionAsync"
);
generateChatCompletionWithCompressionMethod.Should().NotBeNull();
generateChatCompletionWithCompressionMethod!.ReturnType.Should().Be<Task<string>>();
generateChatCompletionWithCompressionMethod.GetParameters().Should().HaveCount(2);
generateChatCompletionWithCompressionMethod
.GetParameters()[0]
.ParameterType.Should()
.Be<List<ChatMessage>>();
generateChatCompletionWithCompressionMethod
.GetParameters()[1]
.ParameterType.Should()
.Be<CancellationToken>();
}
[Fact]
public void IAIService_ShouldBeImplementedByAIService()
{
// Arrange & Act
var aiServiceType = typeof(ChatBot.Services.AIService);
var interfaceType = typeof(IAIService);
// Assert
interfaceType.IsAssignableFrom(aiServiceType).Should().BeTrue();
}
[Fact]
public async Task IAIService_GenerateChatCompletionAsync_ShouldReturnString()
{
// Arrange
var mock = new Mock<IAIService>();
var messages = new List<ChatMessage>
{
new() { Role = "user", Content = "Test message" },
};
var cancellationToken = CancellationToken.None;
var expectedResponse = "Test response";
mock.Setup(x =>
x.GenerateChatCompletionAsync(
It.IsAny<List<ChatMessage>>(),
It.IsAny<CancellationToken>()
)
)
.ReturnsAsync(expectedResponse);
// Act
var result = await mock.Object.GenerateChatCompletionAsync(messages, cancellationToken);
// Assert
result.Should().Be(expectedResponse);
mock.Verify(x => x.GenerateChatCompletionAsync(messages, cancellationToken), Times.Once);
}
[Fact]
public async Task IAIService_GenerateChatCompletionWithCompressionAsync_ShouldReturnString()
{
// Arrange
var mock = new Mock<IAIService>();
var messages = new List<ChatMessage>
{
new() { Role = "user", Content = "Test message" },
};
var cancellationToken = CancellationToken.None;
var expectedResponse = "Test response with compression";
mock.Setup(x =>
x.GenerateChatCompletionWithCompressionAsync(
It.IsAny<List<ChatMessage>>(),
It.IsAny<CancellationToken>()
)
)
.ReturnsAsync(expectedResponse);
// Act
var result = await mock.Object.GenerateChatCompletionWithCompressionAsync(
messages,
cancellationToken
);
// Assert
result.Should().Be(expectedResponse);
mock.Verify(
x => x.GenerateChatCompletionWithCompressionAsync(messages, cancellationToken),
Times.Once
);
}
[Fact]
public async Task IAIService_GenerateChatCompletionAsync_ShouldHandleEmptyMessages()
{
// Arrange
var mock = new Mock<IAIService>();
var messages = new List<ChatMessage>();
var cancellationToken = CancellationToken.None;
var expectedResponse = "Empty response";
mock.Setup(x =>
x.GenerateChatCompletionAsync(
It.IsAny<List<ChatMessage>>(),
It.IsAny<CancellationToken>()
)
)
.ReturnsAsync(expectedResponse);
// Act
var result = await mock.Object.GenerateChatCompletionAsync(messages, cancellationToken);
// Assert
result.Should().Be(expectedResponse);
mock.Verify(x => x.GenerateChatCompletionAsync(messages, cancellationToken), Times.Once);
}
[Fact]
public async Task IAIService_GenerateChatCompletionWithCompressionAsync_ShouldHandleEmptyMessages()
{
// Arrange
var mock = new Mock<IAIService>();
var messages = new List<ChatMessage>();
var cancellationToken = CancellationToken.None;
var expectedResponse = "Empty response with compression";
mock.Setup(x =>
x.GenerateChatCompletionWithCompressionAsync(
It.IsAny<List<ChatMessage>>(),
It.IsAny<CancellationToken>()
)
)
.ReturnsAsync(expectedResponse);
// Act
var result = await mock.Object.GenerateChatCompletionWithCompressionAsync(
messages,
cancellationToken
);
// Assert
result.Should().Be(expectedResponse);
mock.Verify(
x => x.GenerateChatCompletionWithCompressionAsync(messages, cancellationToken),
Times.Once
);
}
[Fact]
public async Task IAIService_GenerateChatCompletionAsync_ShouldHandleCancellationToken()
{
// Arrange
var mock = new Mock<IAIService>();
var messages = new List<ChatMessage>
{
new() { Role = "user", Content = "Test message" },
};
var cancellationToken = new CancellationToken(true); // Cancelled token
var expectedResponse = "Cancelled response";
mock.Setup(x =>
x.GenerateChatCompletionAsync(
It.IsAny<List<ChatMessage>>(),
It.IsAny<CancellationToken>()
)
)
.ReturnsAsync(expectedResponse);
// Act
var result = await mock.Object.GenerateChatCompletionAsync(messages, cancellationToken);
// Assert
result.Should().Be(expectedResponse);
mock.Verify(x => x.GenerateChatCompletionAsync(messages, cancellationToken), Times.Once);
}
[Fact]
public async Task IAIService_GenerateChatCompletionWithCompressionAsync_ShouldHandleCancellationToken()
{
// Arrange
var mock = new Mock<IAIService>();
var messages = new List<ChatMessage>
{
new() { Role = "user", Content = "Test message" },
};
var cancellationToken = new CancellationToken(true); // Cancelled token
var expectedResponse = "Cancelled response with compression";
mock.Setup(x =>
x.GenerateChatCompletionWithCompressionAsync(
It.IsAny<List<ChatMessage>>(),
It.IsAny<CancellationToken>()
)
)
.ReturnsAsync(expectedResponse);
// Act
var result = await mock.Object.GenerateChatCompletionWithCompressionAsync(
messages,
cancellationToken
);
// Assert
result.Should().Be(expectedResponse);
mock.Verify(
x => x.GenerateChatCompletionWithCompressionAsync(messages, cancellationToken),
Times.Once
);
}
[Fact]
public async Task IAIService_GenerateChatCompletionAsync_ShouldHandleLargeMessageList()
{
// Arrange
var mock = new Mock<IAIService>();
var messages = new List<ChatMessage>();
for (int i = 0; i < 100; i++)
{
messages.Add(new() { Role = "user", Content = $"Message {i}" });
}
var cancellationToken = CancellationToken.None;
var expectedResponse = "Large response";
mock.Setup(x =>
x.GenerateChatCompletionAsync(
It.IsAny<List<ChatMessage>>(),
It.IsAny<CancellationToken>()
)
)
.ReturnsAsync(expectedResponse);
// Act
var result = await mock.Object.GenerateChatCompletionAsync(messages, cancellationToken);
// Assert
result.Should().Be(expectedResponse);
mock.Verify(x => x.GenerateChatCompletionAsync(messages, cancellationToken), Times.Once);
}
[Fact]
public async Task IAIService_GenerateChatCompletionWithCompressionAsync_ShouldHandleLargeMessageList()
{
// Arrange
var mock = new Mock<IAIService>();
var messages = new List<ChatMessage>();
for (int i = 0; i < 100; i++)
{
messages.Add(new() { Role = "user", Content = $"Message {i}" });
}
var cancellationToken = CancellationToken.None;
var expectedResponse = "Large response with compression";
mock.Setup(x =>
x.GenerateChatCompletionWithCompressionAsync(
It.IsAny<List<ChatMessage>>(),
It.IsAny<CancellationToken>()
)
)
.ReturnsAsync(expectedResponse);
// Act
var result = await mock.Object.GenerateChatCompletionWithCompressionAsync(
messages,
cancellationToken
);
// Assert
result.Should().Be(expectedResponse);
mock.Verify(
x => x.GenerateChatCompletionWithCompressionAsync(messages, cancellationToken),
Times.Once
);
}
[Fact]
public void IAIService_ShouldBePublicInterface()
{
// Arrange & Act
var interfaceType = typeof(IAIService);
// Assert
interfaceType.IsPublic.Should().BeTrue();
interfaceType.IsInterface.Should().BeTrue();
}
[Fact]
public void IAIService_ShouldHaveCorrectNamespace()
{
// Arrange & Act
var interfaceType = typeof(IAIService);
// Assert
interfaceType.Namespace.Should().Be("ChatBot.Services.Interfaces");
}
}