From 39b3ab17c264838afed205bdab646069236aa092 Mon Sep 17 00:00:00 2001 From: Enis Necipoglu Date: Tue, 7 Oct 2025 11:29:24 +0300 Subject: [PATCH] Add more tests for KernelAccessor --- .../Volo/Abp/AI/DefaultKernelAccessor.cs | 4 +- .../Volo/Abp/AI/KernelAccessor_Tests.cs | 62 +++++++++++++++++++ .../Volo/Abp/AI/Mocks/MockChatClient.cs | 27 ++++++-- 3 files changed, 87 insertions(+), 6 deletions(-) create mode 100644 framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/KernelAccessor_Tests.cs diff --git a/framework/src/Volo.Abp.AI/Volo/Abp/AI/DefaultKernelAccessor.cs b/framework/src/Volo.Abp.AI/Volo/Abp/AI/DefaultKernelAccessor.cs index 5370a41dd1..11e8587045 100644 --- a/framework/src/Volo.Abp.AI/Volo/Abp/AI/DefaultKernelAccessor.cs +++ b/framework/src/Volo.Abp.AI/Volo/Abp/AI/DefaultKernelAccessor.cs @@ -13,6 +13,8 @@ public class DefaultKernelAccessor : IKernelAccessor, ITransientDependency public DefaultKernelAccessor(IServiceProvider serviceProvider) { Kernel = serviceProvider.GetKeyedService( - AbpAIModule.DefaultWorkspaceName); + AbpAIWorkspaceOptions.GetKernelServiceKeyName( + AbpAIModule.DefaultWorkspaceName + )); } } diff --git a/framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/KernelAccessor_Tests.cs b/framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/KernelAccessor_Tests.cs new file mode 100644 index 0000000000..b5c54e056a --- /dev/null +++ b/framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/KernelAccessor_Tests.cs @@ -0,0 +1,62 @@ +using System.Threading.Tasks; +using Microsoft.Extensions.AI; +using Shouldly; +using Volo.Abp.AI.Mocks; +using Volo.Abp.AI.Tests.Workspaces; +using Volo.Abp.AutoMapper; +using Volo.Abp.Testing; +using Xunit; + +namespace Volo.Abp.AI; +public class KernelAccessor_Tests : AbpIntegratedTest +{ + [Fact] + public void Should_Resolve_DefaultKernelAccessor() + { + // Arrange & Act + var kernelAccessor = GetRequiredService(); + // Assert + kernelAccessor.ShouldNotBeNull(); + kernelAccessor.Kernel.ShouldNotBeNull(); + } + + [Fact] + public async Task Should_Get_Response_From_DefaultKernel() + { + // Arrange + var kernelAccessor = GetRequiredService(); + var kernel = kernelAccessor.Kernel; + // Act + var result = await kernel.GetRequiredService() + .GetResponseAsync("Hello, World!"); + // Assert + result.ShouldNotBeNull(); + result.RawRepresentation.ShouldBe(MockChatClient.MockResponse); + } + + [Fact] + public void Should_Resolve_KernelAccessor_For_Workspace() + { + // Arrange & Act + var kernelAccessor = GetRequiredService>(); + // Assert + kernelAccessor.ShouldNotBeNull(); + kernelAccessor.Kernel.ShouldNotBeNull(); + } + + [Fact] + public async Task Should_Get_Response_From_Kernel_For_Workspace() + { + // Arrange + var kernelAccessor = GetRequiredService>(); + var kernel = kernelAccessor.Kernel; + + // Act + var result = await kernel.GetRequiredService() + .GetResponseAsync("Hello, World!"); + + // Assert + result.ShouldNotBeNull(); + result.RawRepresentation.ShouldBe(MockChatClient.MockResponse); + } +} diff --git a/framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/Mocks/MockChatClient.cs b/framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/Mocks/MockChatClient.cs index 6e3b00f1a9..8ad355c7a2 100644 --- a/framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/Mocks/MockChatClient.cs +++ b/framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/Mocks/MockChatClient.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using System.Runtime.CompilerServices; using Microsoft.Extensions.AI; namespace Volo.Abp.AI.Mocks; @@ -10,18 +11,24 @@ namespace Volo.Abp.AI.Mocks; public class MockChatClient : IChatClient { public const int StreamingResponseParts = 12; + + public const string MockResponse = "This is a mock response."; public void Dispose() { } - public Task GetResponseAsync(IEnumerable messages, ChatOptions options = null, CancellationToken cancellationToken = default) + public Task GetResponseAsync( + IEnumerable messages, + ChatOptions options = null, + CancellationToken cancellationToken = default) { var responseMessages = messages.ToList(); - responseMessages.Add(new ChatMessage(ChatRole.Assistant, "This is a mock response.")); + responseMessages.Add(new ChatMessage(ChatRole.Assistant, MockResponse)); return Task.FromResult(new ChatResponse { - Messages = responseMessages, + Messages = responseMessages, + RawRepresentation = MockResponse }); } @@ -30,14 +37,24 @@ public class MockChatClient : IChatClient return null; } - public async IAsyncEnumerable GetStreamingResponseAsync(IEnumerable messages, ChatOptions options = null, CancellationToken cancellationToken = default) + public async IAsyncEnumerable GetStreamingResponseAsync( + IEnumerable messages, + ChatOptions options = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) { for (var i = 0; i < StreamingResponseParts; i++) { await Task.Delay(25, cancellationToken); + + if (cancellationToken.IsCancellationRequested) + { + break; + } + yield return new ChatResponseUpdate { - RawRepresentation = "This is a mock streaming response part " + (i + 1) + Role = ChatRole.Assistant, + RawRepresentation = MockResponse + " " + (i + 1), }; } }