feat: 初始化NewLife Studio项目,完成基础框架与数据管理模块
何炳宏 authored at 2026-05-26 12:09:09
2.97 KiB
NewLife.Studio
using NewLife.Studio.AI;
using NewLife.Studio.AI.Providers;
using Xunit;

namespace NewLife.Studio.AI.Tests;

public class AIProviderFactoryTests : IDisposable
{
    private const string DefaultEndpoint = "https://api.openai.com/v1";
    private const string DefaultApiKey = "sk-test-key";
    private const string DefaultModel = "gpt-4o";

    private readonly HttpClient _httpClient;

    public AIProviderFactoryTests()
    {
        _httpClient = new HttpClient();
    }

    public void Dispose()
    {
        _httpClient.Dispose();
    }

    [Fact]
    public void Create_WithOpenAI_ReturnsOpenAIProvider()
    {
        var provider = AIProviderFactory.Create(_httpClient, "openai", DefaultEndpoint, DefaultApiKey, DefaultModel);

        Assert.NotNull(provider);
        Assert.IsType<OpenAIProvider>(provider);
        Assert.Equal("OpenAI", provider.ProviderName);
    }

    [Fact]
    public void Create_WithAzure_ReturnsOpenAIProvider()
    {
        var provider = AIProviderFactory.Create(_httpClient, "azure", DefaultEndpoint, DefaultApiKey, DefaultModel);

        Assert.NotNull(provider);
        Assert.IsType<OpenAIProvider>(provider);
    }

    [Fact]
    public void Create_WithOllama_ReturnsOpenAIProvider()
    {
        var provider = AIProviderFactory.Create(_httpClient, "ollama", DefaultEndpoint, DefaultApiKey, DefaultModel);

        Assert.NotNull(provider);
        Assert.IsType<OpenAIProvider>(provider);
    }

    [Fact]
    public void Create_WithUpperCaseProviderType_ReturnsCorrectProvider()
    {
        var provider = AIProviderFactory.Create(_httpClient, "OPENAI", DefaultEndpoint, DefaultApiKey, DefaultModel);

        Assert.NotNull(provider);
        Assert.IsType<OpenAIProvider>(provider);
    }

    [Fact]
    public void Create_WithMixedCaseProviderType_ReturnsCorrectProvider()
    {
        var provider = AIProviderFactory.Create(_httpClient, "OpenAi", DefaultEndpoint, DefaultApiKey, DefaultModel);

        Assert.NotNull(provider);
        Assert.IsType<OpenAIProvider>(provider);
    }

    [Fact]
    public void Create_WithUnknownProviderType_ThrowsArgumentException()
    {
        var exception = Assert.Throws<ArgumentException>(() =>
            AIProviderFactory.Create(_httpClient, "unknown", DefaultEndpoint, DefaultApiKey, DefaultModel));

        Assert.Contains("unknown", exception.Message);
        Assert.Contains("Unknown provider type", exception.Message);
    }

    [Fact]
    public void Create_WithEmptyProviderType_ThrowsArgumentException()
    {
        Assert.Throws<ArgumentException>(() =>
            AIProviderFactory.Create(_httpClient, "", DefaultEndpoint, DefaultApiKey, DefaultModel));
    }

    [Theory]
    [InlineData("openai")]
    [InlineData("azure")]
    [InlineData("ollama")]
    public void Create_WithValidProviderTypes_ReturnsNonNullProvider(string providerType)
    {
        var provider = AIProviderFactory.Create(_httpClient, providerType, DefaultEndpoint, DefaultApiKey, DefaultModel);

        Assert.NotNull(provider);
    }
}