This commit is contained in:
@@ -261,4 +261,234 @@ public class ChatSessionRepositoryTests : TestBase
|
||||
var remainingSessions = await _repository.GetActiveSessionsCountAsync();
|
||||
remainingSessions.Should().Be(1);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetMessagesAsync_ShouldReturnMessages_WhenMessagesExist()
|
||||
{
|
||||
// Arrange
|
||||
CleanupDatabase();
|
||||
var session = TestDataBuilder.Mocks.CreateChatSessionEntity(1, 12345);
|
||||
_dbContext.ChatSessions.Add(session);
|
||||
await _dbContext.SaveChangesAsync();
|
||||
|
||||
await _repository.AddMessageAsync(session.Id, "Message 1", "User", 0);
|
||||
await _repository.AddMessageAsync(session.Id, "Message 2", "Assistant", 1);
|
||||
|
||||
// Act
|
||||
var messages = await _repository.GetMessagesAsync(session.Id);
|
||||
|
||||
// Assert
|
||||
messages.Should().HaveCount(2);
|
||||
messages[0].Content.Should().Be("Message 1");
|
||||
messages[0].Role.Should().Be("User");
|
||||
messages[1].Content.Should().Be("Message 2");
|
||||
messages[1].Role.Should().Be("Assistant");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetMessagesAsync_ShouldReturnEmptyList_WhenNoMessages()
|
||||
{
|
||||
// Arrange
|
||||
CleanupDatabase();
|
||||
var session = TestDataBuilder.Mocks.CreateChatSessionEntity(1, 12345);
|
||||
_dbContext.ChatSessions.Add(session);
|
||||
await _dbContext.SaveChangesAsync();
|
||||
|
||||
// Act
|
||||
var messages = await _repository.GetMessagesAsync(session.Id);
|
||||
|
||||
// Assert
|
||||
messages.Should().BeEmpty();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task AddMessageAsync_ShouldAddMessage()
|
||||
{
|
||||
// Arrange
|
||||
CleanupDatabase();
|
||||
var session = TestDataBuilder.Mocks.CreateChatSessionEntity(1, 12345);
|
||||
_dbContext.ChatSessions.Add(session);
|
||||
await _dbContext.SaveChangesAsync();
|
||||
|
||||
// Act
|
||||
var message = await _repository.AddMessageAsync(session.Id, "Test message", "User", 0);
|
||||
|
||||
// Assert
|
||||
message.Should().NotBeNull();
|
||||
message.Content.Should().Be("Test message");
|
||||
message.Role.Should().Be("User");
|
||||
message.MessageOrder.Should().Be(0);
|
||||
message.SessionId.Should().Be(session.Id);
|
||||
|
||||
var messages = await _repository.GetMessagesAsync(session.Id);
|
||||
messages.Should().HaveCount(1);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClearMessagesAsync_ShouldRemoveAllMessages()
|
||||
{
|
||||
// Arrange
|
||||
CleanupDatabase();
|
||||
var session = TestDataBuilder.Mocks.CreateChatSessionEntity(1, 12345);
|
||||
_dbContext.ChatSessions.Add(session);
|
||||
await _dbContext.SaveChangesAsync();
|
||||
|
||||
await _repository.AddMessageAsync(session.Id, "Message 1", "User", 0);
|
||||
await _repository.AddMessageAsync(session.Id, "Message 2", "Assistant", 1);
|
||||
await _repository.AddMessageAsync(session.Id, "Message 3", "User", 2);
|
||||
|
||||
// Act
|
||||
await _repository.ClearMessagesAsync(session.Id);
|
||||
|
||||
// Assert
|
||||
var messages = await _repository.GetMessagesAsync(session.Id);
|
||||
messages.Should().BeEmpty();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetSessionsForCleanupAsync_ShouldReturnOldSessions()
|
||||
{
|
||||
// Arrange
|
||||
CleanupDatabase();
|
||||
|
||||
var oldSession1 = TestDataBuilder.Mocks.CreateChatSessionEntity(1, 12345);
|
||||
oldSession1.LastUpdatedAt = DateTime.UtcNow.AddDays(-2);
|
||||
|
||||
var oldSession2 = TestDataBuilder.Mocks.CreateChatSessionEntity(2, 12346);
|
||||
oldSession2.LastUpdatedAt = DateTime.UtcNow.AddHours(-25);
|
||||
|
||||
var recentSession = TestDataBuilder.Mocks.CreateChatSessionEntity(3, 12347);
|
||||
recentSession.LastUpdatedAt = DateTime.UtcNow.AddMinutes(-30);
|
||||
|
||||
_dbContext.ChatSessions.AddRange(oldSession1, oldSession2, recentSession);
|
||||
await _dbContext.SaveChangesAsync();
|
||||
|
||||
// Act
|
||||
var sessionsForCleanup = await _repository.GetSessionsForCleanupAsync(24);
|
||||
|
||||
// Assert
|
||||
sessionsForCleanup.Should().HaveCount(2);
|
||||
sessionsForCleanup.Should().Contain(s => s.ChatId == 12345);
|
||||
sessionsForCleanup.Should().Contain(s => s.ChatId == 12346);
|
||||
sessionsForCleanup.Should().NotContain(s => s.ChatId == 12347);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetSessionsForCleanupAsync_ShouldReturnEmptyList_WhenNoOldSessions()
|
||||
{
|
||||
// Arrange
|
||||
CleanupDatabase();
|
||||
|
||||
var recentSession = TestDataBuilder.Mocks.CreateChatSessionEntity(1, 12345);
|
||||
recentSession.LastUpdatedAt = DateTime.UtcNow.AddMinutes(-30);
|
||||
|
||||
_dbContext.ChatSessions.Add(recentSession);
|
||||
await _dbContext.SaveChangesAsync();
|
||||
|
||||
// Act
|
||||
var sessionsForCleanup = await _repository.GetSessionsForCleanupAsync(24);
|
||||
|
||||
// Assert
|
||||
sessionsForCleanup.Should().BeEmpty();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task UpdateAsync_ShouldUpdateLastUpdatedAt()
|
||||
{
|
||||
// Arrange
|
||||
CleanupDatabase();
|
||||
var session = TestDataBuilder.Mocks.CreateChatSessionEntity(1, 12345);
|
||||
var originalLastUpdated = DateTime.UtcNow.AddDays(-1);
|
||||
session.LastUpdatedAt = originalLastUpdated;
|
||||
_dbContext.ChatSessions.Add(session);
|
||||
await _dbContext.SaveChangesAsync();
|
||||
|
||||
// Act
|
||||
session.Model = "new-model";
|
||||
var updatedSession = await _repository.UpdateAsync(session);
|
||||
|
||||
// Assert
|
||||
updatedSession.LastUpdatedAt.Should().BeAfter(originalLastUpdated);
|
||||
updatedSession.Model.Should().Be("new-model");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetByChatIdAsync_ShouldIncludeMessages()
|
||||
{
|
||||
// Arrange
|
||||
CleanupDatabase();
|
||||
var session = TestDataBuilder.Mocks.CreateChatSessionEntity(1, 12345);
|
||||
_dbContext.ChatSessions.Add(session);
|
||||
await _dbContext.SaveChangesAsync();
|
||||
|
||||
await _repository.AddMessageAsync(session.Id, "Test message", "User", 0);
|
||||
|
||||
// Act
|
||||
var retrievedSession = await _repository.GetByChatIdAsync(12345);
|
||||
|
||||
// Assert
|
||||
retrievedSession.Should().NotBeNull();
|
||||
retrievedSession!.Messages.Should().HaveCount(1);
|
||||
retrievedSession.Messages.First().Content.Should().Be("Test message");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GetBySessionIdAsync_ShouldIncludeMessages()
|
||||
{
|
||||
// Arrange
|
||||
CleanupDatabase();
|
||||
var sessionId = "test-session-id";
|
||||
var session = TestDataBuilder.Mocks.CreateChatSessionEntity(1, 12345, sessionId);
|
||||
_dbContext.ChatSessions.Add(session);
|
||||
await _dbContext.SaveChangesAsync();
|
||||
|
||||
await _repository.AddMessageAsync(session.Id, "Test message", "User", 0);
|
||||
|
||||
// Act
|
||||
var retrievedSession = await _repository.GetBySessionIdAsync(sessionId);
|
||||
|
||||
// Assert
|
||||
retrievedSession.Should().NotBeNull();
|
||||
retrievedSession!.Messages.Should().HaveCount(1);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task AddMessageAsync_WithMultipleMessages_ShouldMaintainOrder()
|
||||
{
|
||||
// Arrange
|
||||
CleanupDatabase();
|
||||
var session = TestDataBuilder.Mocks.CreateChatSessionEntity(1, 12345);
|
||||
_dbContext.ChatSessions.Add(session);
|
||||
await _dbContext.SaveChangesAsync();
|
||||
|
||||
// Act
|
||||
await _repository.AddMessageAsync(session.Id, "Message 1", "User", 0);
|
||||
await _repository.AddMessageAsync(session.Id, "Message 2", "Assistant", 1);
|
||||
await _repository.AddMessageAsync(session.Id, "Message 3", "User", 2);
|
||||
|
||||
// Assert
|
||||
var messages = await _repository.GetMessagesAsync(session.Id);
|
||||
messages.Should().HaveCount(3);
|
||||
messages[0].MessageOrder.Should().Be(0);
|
||||
messages[1].MessageOrder.Should().Be(1);
|
||||
messages[2].MessageOrder.Should().Be(2);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task CleanupOldSessionsAsync_WithNoOldSessions_ShouldReturnZero()
|
||||
{
|
||||
// Arrange
|
||||
CleanupDatabase();
|
||||
|
||||
var recentSession = TestDataBuilder.Mocks.CreateChatSessionEntity(1, 12345);
|
||||
recentSession.LastUpdatedAt = DateTime.UtcNow.AddMinutes(-10);
|
||||
_dbContext.ChatSessions.Add(recentSession);
|
||||
await _dbContext.SaveChangesAsync();
|
||||
|
||||
// Act
|
||||
var removedCount = await _repository.CleanupOldSessionsAsync(24);
|
||||
|
||||
// Assert
|
||||
removedCount.Should().Be(0);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user