add tests
All checks were successful
SonarQube / Build and analyze (push) Successful in 3m39s

This commit is contained in:
Leonid Pershin
2025-10-21 02:30:04 +03:00
parent 928ae0555e
commit 2a26e84100
15 changed files with 1837 additions and 61 deletions

View File

@@ -38,7 +38,7 @@ public class ChatSessionTests
// Assert
session.GetAllMessages().Should().HaveCount(1);
var message = session.GetAllMessages().First();
var message = session.GetAllMessages()[0];
message.Role.Should().Be(ChatRole.User);
message.Content.Should().Be(content);
}
@@ -55,7 +55,7 @@ public class ChatSessionTests
// Assert
session.GetAllMessages().Should().HaveCount(1);
var message = session.GetAllMessages().First();
var message = session.GetAllMessages()[0];
message.Role.Should().Be(ChatRole.Assistant);
message.Content.Should().Be(content);
}
@@ -73,7 +73,7 @@ public class ChatSessionTests
// Assert
session.GetAllMessages().Should().HaveCount(1);
var addedMessage = session.GetAllMessages().First();
var addedMessage = session.GetAllMessages()[0];
addedMessage.Role.Should().Be(ChatRole.System);
addedMessage.Content.Should().Be(content);
}
@@ -183,4 +183,319 @@ public class ChatSessionTests
// Assert
count.Should().Be(1);
}
[Fact]
public void AddUserMessage_InGroupChat_ShouldIncludeUsername()
{
// Arrange
var session = new ChatSession { ChatType = "group" };
var content = "Hello";
var username = "testuser";
// Act
session.AddUserMessage(content, username);
// Assert
var message = session.GetAllMessages()[0];
message.Content.Should().Be("testuser: Hello");
}
[Fact]
public void AddUserMessage_InPrivateChat_ShouldNotIncludeUsername()
{
// Arrange
var session = new ChatSession { ChatType = "private" };
var content = "Hello";
var username = "testuser";
// Act
session.AddUserMessage(content, username);
// Assert
var message = session.GetAllMessages()[0];
message.Content.Should().Be("Hello");
}
[Fact]
public void AddMessage_ShouldTrimHistory_WhenExceedsMaxHistoryLength()
{
// Arrange
var session = new ChatSession { MaxHistoryLength = 5 };
// Add system message
session.AddMessage(new ChatMessage { Role = ChatRole.System, Content = "System prompt" });
// Add messages to exceed max history
for (int i = 0; i < 10; i++)
{
session.AddMessage(new ChatMessage { Role = ChatRole.User, Content = $"Message {i}" });
}
// Act & Assert
session.GetMessageCount().Should().BeLessThanOrEqualTo(5);
// System message should be preserved
session.GetAllMessages()[0].Role.Should().Be(ChatRole.System);
}
[Fact]
public void AddMessage_ShouldTrimHistory_WithoutSystemMessage()
{
// Arrange
var session = new ChatSession { MaxHistoryLength = 3 };
// Add messages to exceed max history
for (int i = 0; i < 5; i++)
{
session.AddMessage(new ChatMessage { Role = ChatRole.User, Content = $"Message {i}" });
}
// Act & Assert
session.GetMessageCount().Should().BeLessThanOrEqualTo(3);
}
[Fact]
public void SetCompressionService_ShouldSetService()
{
// Arrange
var session = new ChatSession();
var compressionServiceMock =
new Moq.Mock<ChatBot.Services.Interfaces.IHistoryCompressionService>();
// Act
session.SetCompressionService(compressionServiceMock.Object);
// Assert
// The service should be set (no exception)
session.Should().NotBeNull();
}
[Fact]
public async Task AddMessageWithCompressionAsync_WithoutCompressionService_ShouldUseTrimming()
{
// Arrange
var session = new ChatSession { MaxHistoryLength = 3 };
// Act
for (int i = 0; i < 5; i++)
{
await session.AddMessageWithCompressionAsync(
new ChatMessage { Role = ChatRole.User, Content = $"Message {i}" },
10,
5
);
}
// Assert
session.GetMessageCount().Should().BeLessThanOrEqualTo(3);
}
[Fact]
public async Task AddUserMessageWithCompressionAsync_ShouldAddMessage()
{
// Arrange
var session = new ChatSession { ChatType = "private" };
// Act
await session.AddUserMessageWithCompressionAsync("Test message", "user", 10, 5);
// Assert
session.GetMessageCount().Should().Be(1);
session.GetAllMessages()[0].Content.Should().Be("Test message");
}
[Fact]
public async Task AddUserMessageWithCompressionAsync_InGroupChat_ShouldIncludeUsername()
{
// Arrange
var session = new ChatSession { ChatType = "group" };
// Act
await session.AddUserMessageWithCompressionAsync("Test message", "user", 10, 5);
// Assert
session.GetMessageCount().Should().Be(1);
session.GetAllMessages()[0].Content.Should().Be("user: Test message");
}
[Fact]
public async Task AddAssistantMessageWithCompressionAsync_ShouldAddMessage()
{
// Arrange
var session = new ChatSession();
// Act
await session.AddAssistantMessageWithCompressionAsync("Test response", 10, 5);
// Assert
session.GetMessageCount().Should().Be(1);
session.GetAllMessages()[0].Role.Should().Be(ChatRole.Assistant);
session.GetAllMessages()[0].Content.Should().Be("Test response");
}
[Fact]
public async Task AddMessageWithCompressionAsync_ShouldTriggerTrimming_WhenNoCompressionService()
{
// Arrange
var session = new ChatSession { MaxHistoryLength = 2 };
// Act
for (int i = 0; i < 4; i++)
{
await session.AddMessageWithCompressionAsync(
new ChatMessage { Role = ChatRole.User, Content = $"Message {i}" },
2,
1
);
}
// Assert
session.GetMessageCount().Should().BeLessThanOrEqualTo(2);
}
[Fact]
public async Task ClearHistory_ShouldUpdateLastUpdatedAt()
{
// Arrange
var session = new ChatSession();
session.AddUserMessage("Test", "user");
var lastUpdated = session.LastUpdatedAt;
await Task.Delay(10); // Small delay
// Act
session.ClearHistory();
// Assert
session.LastUpdatedAt.Should().BeAfter(lastUpdated);
}
[Fact]
public void SetCreatedAtForTesting_ShouldUpdateCreatedAt()
{
// Arrange
var session = new ChatSession();
var targetDate = DateTime.UtcNow.AddDays(-5);
// Act
session.SetCreatedAtForTesting(targetDate);
// Assert
session.CreatedAt.Should().Be(targetDate);
}
[Fact]
public void AddMessage_MultipleTimes_ShouldMaintainOrder()
{
// Arrange
var session = new ChatSession();
// Act
session.AddUserMessage("Message 1", "user1");
session.AddAssistantMessage("Response 1");
session.AddUserMessage("Message 2", "user1");
session.AddAssistantMessage("Response 2");
// Assert
var messages = session.GetAllMessages();
messages.Should().HaveCount(4);
messages[0].Content.Should().Be("Message 1");
messages[1].Content.Should().Be("Response 1");
messages[2].Content.Should().Be("Message 2");
messages[3].Content.Should().Be("Response 2");
}
[Fact]
public void AddMessage_WithSystemMessage_ShouldPreserveSystemMessage()
{
// Arrange
var session = new ChatSession { MaxHistoryLength = 3 };
session.AddMessage(new ChatMessage { Role = ChatRole.System, Content = "System prompt" });
// Act
for (int i = 0; i < 5; i++)
{
session.AddUserMessage($"Message {i}", "user");
}
// Assert
var messages = session.GetAllMessages();
messages[0].Role.Should().Be(ChatRole.System);
messages[0].Content.Should().Be("System prompt");
}
[Fact]
public void GetAllMessages_ShouldReturnCopy()
{
// Arrange
var session = new ChatSession();
session.AddUserMessage("Test", "user");
// Act
var messages1 = session.GetAllMessages();
var messages2 = session.GetAllMessages();
// Assert
messages1.Should().NotBeSameAs(messages2);
messages1.Should().BeEquivalentTo(messages2);
}
[Fact]
public async Task ChatSession_ThreadSafety_MultipleConcurrentAdds()
{
// Arrange
var session = new ChatSession();
var tasks = new List<Task>();
// Act
for (int i = 0; i < 10; i++)
{
int messageNum = i;
tasks.Add(Task.Run(() => session.AddUserMessage($"Message {messageNum}", "user")));
}
await Task.WhenAll(tasks.ToArray());
// Assert
session.GetMessageCount().Should().Be(10);
}
[Fact]
public void MaxHistoryLength_ShouldBeSettable()
{
// Arrange & Act
var session = new ChatSession { MaxHistoryLength = 50 };
// Assert
session.MaxHistoryLength.Should().Be(50);
}
[Fact]
public void Model_ShouldBeSettable()
{
// Arrange & Act
var session = new ChatSession { Model = "llama3" };
// Assert
session.Model.Should().Be("llama3");
}
[Fact]
public void SessionProperties_ShouldBeSettableViaInitializer()
{
// Arrange & Act
var session = new ChatSession
{
ChatId = 12345,
ChatType = "group",
ChatTitle = "Test Group",
Model = "llama3",
MaxHistoryLength = 50,
};
// Assert
session.ChatId.Should().Be(12345);
session.ChatType.Should().Be("group");
session.ChatTitle.Should().Be("Test Group");
session.Model.Should().Be("llama3");
session.MaxHistoryLength.Should().Be(50);
}
}