Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -552,7 +552,7 @@ public async Task<int> GetMessageCountAsync(CancellationToken cancellationToken
#pragma warning restore CA1513

// Efficient count query
var query = new QueryDefinition("SELECT VALUE COUNT(1) FROM c WHERE c.conversationId = @conversationId AND c.Type = @type")
var query = new QueryDefinition("SELECT VALUE COUNT(1) FROM c WHERE c.conversationId = @conversationId AND c.type = @type")
.WithParameter("@conversationId", this.ConversationId)
.WithParameter("@type", "ChatMessage");

Expand Down Expand Up @@ -582,7 +582,7 @@ public async Task<int> ClearMessagesAsync(CancellationToken cancellationToken =
#pragma warning restore CA1513

// Batch delete for efficiency
var query = new QueryDefinition("SELECT VALUE c.id FROM c WHERE c.conversationId = @conversationId AND c.Type = @type")
var query = new QueryDefinition("SELECT VALUE c.id FROM c WHERE c.conversationId = @conversationId AND c.type = @type")
.WithParameter("@conversationId", this.ConversationId)
.WithParameter("@type", "ChatMessage");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -815,5 +815,115 @@ public async Task MaxMessagesToRetrieve_Null_ShouldReturnAllMessagesAsync()
Assert.Equal("Message 10", messageList[9].Text);
}

[SkippableFact]
[Trait("Category", "CosmosDB")]
public async Task GetMessageCountAsync_WithMessages_ShouldReturnCorrectCountAsync()
{
// Arrange
this.SkipIfEmulatorNotAvailable();
const string ConversationId = "count-test-conversation";

using var provider = new CosmosChatHistoryProvider(this._connectionString, s_testDatabaseId, TestContainerId, ConversationId);

// Add 5 messages
var messages = new List<ChatMessage>();
for (int i = 1; i <= 5; i++)
{
messages.Add(new ChatMessage(ChatRole.User, $"Message {i}"));
}

var context = new ChatHistoryProvider.InvokedContext(messages, []);
await provider.InvokedAsync(context);

// Wait for eventual consistency
await Task.Delay(100);

// Act
var count = await provider.GetMessageCountAsync();

// Assert
Assert.Equal(5, count);
}

[SkippableFact]
[Trait("Category", "CosmosDB")]
public async Task GetMessageCountAsync_WithNoMessages_ShouldReturnZeroAsync()
{
// Arrange
this.SkipIfEmulatorNotAvailable();
const string ConversationId = "empty-count-test-conversation";

using var provider = new CosmosChatHistoryProvider(this._connectionString, s_testDatabaseId, TestContainerId, ConversationId);

// Act
var count = await provider.GetMessageCountAsync();

// Assert
Assert.Equal(0, count);
}

[SkippableFact]
[Trait("Category", "CosmosDB")]
public async Task ClearMessagesAsync_WithMessages_ShouldDeleteAndReturnCountAsync()
{
// Arrange
this.SkipIfEmulatorNotAvailable();
const string ConversationId = "clear-test-conversation";

using var provider = new CosmosChatHistoryProvider(this._connectionString, s_testDatabaseId, TestContainerId, ConversationId);

// Add 3 messages
var messages = new List<ChatMessage>
{
new ChatMessage(ChatRole.User, "Message 1"),
new ChatMessage(ChatRole.Assistant, "Message 2"),
new ChatMessage(ChatRole.User, "Message 3")
};

var context = new ChatHistoryProvider.InvokedContext(messages, []);
await provider.InvokedAsync(context);

// Wait for eventual consistency
await Task.Delay(100);

// Verify messages exist
var countBefore = await provider.GetMessageCountAsync();
Assert.Equal(3, countBefore);

// Act
var deletedCount = await provider.ClearMessagesAsync();

// Wait for eventual consistency
await Task.Delay(100);

// Assert
Assert.Equal(3, deletedCount);

// Verify messages are deleted
var countAfter = await provider.GetMessageCountAsync();
Assert.Equal(0, countAfter);

var invokingContext = new ChatHistoryProvider.InvokingContext([]);
var retrievedMessages = await provider.InvokingAsync(invokingContext);
Assert.Empty(retrievedMessages);
}

[SkippableFact]
[Trait("Category", "CosmosDB")]
public async Task ClearMessagesAsync_WithNoMessages_ShouldReturnZeroAsync()
{
// Arrange
this.SkipIfEmulatorNotAvailable();
const string ConversationId = "empty-clear-test-conversation";

using var provider = new CosmosChatHistoryProvider(this._connectionString, s_testDatabaseId, TestContainerId, ConversationId);

// Act
var deletedCount = await provider.ClearMessagesAsync();

// Assert
Assert.Equal(0, deletedCount);
}

#endregion
}