Browse Source

Initial tests for AI package

pull/23895/head
Enis Necipoglu 4 months ago
parent
commit
3942e1aa33
No known key found for this signature in database GPG Key ID: 1EC55E13241E1680
  1. 5
      framework/Volo.Abp.slnx
  2. 3
      framework/test/Volo.Abp.AI.Tests/Volo.Abp.AI.Tests.abppkg
  3. 18
      framework/test/Volo.Abp.AI.Tests/Volo.Abp.AI.Tests.csproj
  4. 40
      framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/AbpAITestModule.cs
  5. 89
      framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/ChatClient_Tests.cs
  6. 44
      framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/Mocks/MockChatClient.cs
  7. 4
      framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/Mocks/MockDefaultChatClient.cs
  8. 7
      framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/Workspaces/WordCounter.cs

5
framework/Volo.Abp.slnx

@ -1,5 +1,7 @@
<Solution>
<Folder Name="/src/">
<Project Path="src/Volo.Abp.AI.Abstractions/Volo.Abp.AI.Abstractions.csproj" />
<Project Path="src/Volo.Abp.AI/Volo.Abp.AI.csproj" />
<Project Path="src/Volo.Abp.ApiVersioning.Abstractions/Volo.Abp.ApiVersioning.Abstractions.csproj" />
<Project Path="src/Volo.Abp.AspNetCore.Abstractions/Volo.Abp.AspNetCore.Abstractions.csproj" />
<Project Path="src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj" />
@ -164,12 +166,11 @@
<Project Path="src/Volo.Abp.Validation/Volo.Abp.Validation.csproj" />
<Project Path="src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.csproj" />
<Project Path="src/Volo.Abp/Volo.Abp.csproj" />
<Project Path="src/Volo.Abp.AI.Abstractions/Volo.Abp.AI.Abstractions.csproj" />
<Project Path="src/Volo.Abp.AI/Volo.Abp.AI.csproj" />
</Folder>
<Folder Name="/test/">
<Project Path="test/AbpTestBase/AbpTestBase.csproj" />
<Project Path="test/SimpleConsoleDemo/SimpleConsoleDemo.csproj" />
<Project Path="test/Volo.Abp.AI.Tests/Volo.Abp.AI.Tests.csproj" />
<Project Path="test/Volo.Abp.AspNetCore.Authentication.OAuth.Tests/Volo.Abp.AspNetCore.Authentication.OAuth.Tests.csproj" />
<Project Path="test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo.Abp.AspNetCore.MultiTenancy.Tests.csproj" />
<Project Path="test/Volo.Abp.AspNetCore.Mvc.PlugIn/Volo.Abp.AspNetCore.Mvc.PlugIn.csproj" />

3
framework/test/Volo.Abp.AI.Tests/Volo.Abp.AI.Tests.abppkg

@ -0,0 +1,3 @@
{
"role": "lib.test"
}

18
framework/test/Volo.Abp.AI.Tests/Volo.Abp.AI.Tests.csproj

@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.test.props" />
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<AssemblyName>Volo.Abp.AI.Tests</AssemblyName>
<PackageId>Volo.Abp.AI.Tests</PackageId>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.AI\Volo.Abp.AI.csproj" />
<ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" />
<PackageReference Include="Microsoft.NET.Test.Sdk" />
</ItemGroup>
</Project>

40
framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/AbpAITestModule.cs

@ -0,0 +1,40 @@
using Microsoft.Extensions.AI;
using Volo.Abp.AI;
using Volo.Abp.AI.Mocks;
using Volo.Abp.AI.Tests.Workspaces;
using Volo.Abp.Modularity;
namespace Volo.Abp.AutoMapper;
[DependsOn(
typeof(AbpTestBaseModule),
typeof(AbpAIModule)
)]
public class AbpAITestModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
PreConfigure<AbpAIWorkspaceOptions>(options =>
{
options.Workspaces.ConfigureDefault(options =>
{
options.ConfigureChatClient(clientOptions =>
{
clientOptions.Builder = new ChatClientBuilder(new MockDefaultChatClient());
});
});
options.Workspaces.Configure<WordCounter>(workspaceOptions =>
{
workspaceOptions.ConfigureChatClient(clientOptions =>
{
clientOptions.Builder = new ChatClientBuilder(new MockChatClient());
});
});
});
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
}
}

89
framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/ChatClient_Tests.cs

@ -0,0 +1,89 @@
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.Tests;
public class ChatClient_Tests : AbpIntegratedTest<AbpAITestModule>
{
[Fact]
public void Should_Resolve_ChatClient_For_Workspace()
{
// Arrange & Act
var chatClient = GetRequiredService<IChatClient<WordCounter>>();
// Assert
chatClient.ShouldNotBeNull();
chatClient.ShouldNotBeOfType<MockDefaultChatClient>();
}
[Fact]
public void Should_Resolve_Keyed_ChatClient_For_Workspace()
{
// Arrange
var workspaceName = WorkspaceNameAttribute.GetWorkspaceName<WordCounter>();
var serviceName = AbpAIWorkspaceOptions.GetChatClientServiceKeyName(workspaceName);
// Act
var chatClient = GetRequiredKeyedService<IChatClient>(
serviceName
);
// Assert
chatClient.ShouldNotBeNull();
}
[Fact]
public void Should_Resolve_Default_ChatClient()
{
// Arrange & Act
var chatClient = GetRequiredService<IChatClient>();
// Assert
chatClient.ShouldNotBeNull();
chatClient.ShouldBeOfType<MockDefaultChatClient>();
}
[Fact]
public async Task Should_Get_Response_For_Workspace()
{
// Arrange
var chatClient = GetRequiredService<IChatClient<WordCounter>>();
// Act
var response = await chatClient.GetResponseAsync(new[]
{
new ChatMessage(ChatRole.User, "Hello, how are you?")
});
// Assert
response.ShouldNotBeNull();
response.Messages.ShouldNotBeEmpty();
}
[Fact]
public async Task Should_Get_Streaming_Response_For_Workspace()
{
// Arrange
var chatClient = GetRequiredService<IChatClient<WordCounter>>();
var messagesInput = new[]
{
new ChatMessage(ChatRole.User, "Hello, how are you?")
};
// Act
var responseParts = 0;
await foreach (var response in chatClient.GetStreamingResponseAsync(messagesInput))
{
responseParts++;
}
// Assert
responseParts.ShouldBe(MockChatClient.StreamingResponseParts);
}
}

44
framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/Mocks/MockChatClient.cs

@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.AI;
namespace Volo.Abp.AI.Mocks;
public class MockChatClient : IChatClient
{
public const int StreamingResponseParts = 12;
public void Dispose()
{
}
public Task<ChatResponse> GetResponseAsync(IEnumerable<ChatMessage> messages, ChatOptions options = null, CancellationToken cancellationToken = default)
{
var responseMessages = messages.ToList();
responseMessages.Add(new ChatMessage(ChatRole.Assistant, "This is a mock response."));
return Task.FromResult(new ChatResponse
{
Messages = responseMessages,
});
}
public object GetService(Type serviceType, object serviceKey = null)
{
return null;
}
public async IAsyncEnumerable<ChatResponseUpdate> GetStreamingResponseAsync(IEnumerable<ChatMessage> messages, ChatOptions options = null, CancellationToken cancellationToken = default)
{
for (var i = 0; i < StreamingResponseParts; i++)
{
await Task.Delay(25, cancellationToken);
yield return new ChatResponseUpdate
{
RawRepresentation = "This is a mock streaming response part " + (i + 1)
};
}
}
}

4
framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/Mocks/MockDefaultChatClient.cs

@ -0,0 +1,4 @@
namespace Volo.Abp.AI.Mocks;
public class MockDefaultChatClient : MockChatClient
{
}

7
framework/test/Volo.Abp.AI.Tests/Volo/Abp/AI/Workspaces/WordCounter.cs

@ -0,0 +1,7 @@
namespace Volo.Abp.AI.Tests.Workspaces;
[WorkspaceName("WordCounter")]
public class WordCounter
{
}
Loading…
Cancel
Save