You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

249 lines
7.9 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using OllamaStudy.Core;
namespace OllamaStudy.CoreTest;
public class OllamaServerConfigTest
{
private readonly ITestOutputHelper _testOutput;
private readonly string _configName = "OllamaServerConfig.json";
private string _defaultConfigText = string.Empty;
private readonly OllamaServerOption expectedOption = new OllamaServerOption();
public OllamaServerConfigTest(ITestOutputHelper testOutput)
{
_testOutput = testOutput;
}
[Fact]
public void Config_Test()
{
//Arrange准备阶段
var configBuilder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(_configName, false, true);
var config = configBuilder.Build();
//Act执行阶段
var serverUrl = config.GetValue<string>("OllamaServer:OllamaServerUrl");
var modelId = config.GetValue<string>("OllamaServer:Model");
//Assert断言阶段
Assert.NotNull(serverUrl);
Assert.NotNull(modelId);
Assert.Equal("http://localhost:11434", serverUrl);
Assert.Equal("qwen3:0.6b",modelId);
}
[Fact]
public void Config_Bind_Test()
{
var configBuild = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(_configName, false, true);
var config = configBuild.Build();
//邦定
var option = new OllamaServerOption() { OllamaServerUrl="",Model=""};
//config.Bind(option);
config.GetSection("OllamaServer").Bind(option);
//断言
Assert.Equal("http://localhost:11434",option.OllamaServerUrl);
Assert.Equal("qwen3:0.6b",option.Model);
}
[Fact]
public void Get_ServerOptions_Test()
{
//Arrange准备阶段
var configBuilder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(_configName, false, true);
var config = configBuilder.Build();
//Act执行阶段
var serverUrl = config.GetValue<string>("OllamaServer:OllamaServerUrl");
var modelId = config.GetValue<string>("OllamaServer:Model");
var option = new OllamaServerOption()
{
OllamaServerUrl = serverUrl!,
Model = modelId!
};
//Assert断言阶段
Assert.NotNull(serverUrl);
Assert.NotNull(modelId);
Assert.Equal("http://localhost:11434", serverUrl);
Assert.Equal("qwen3:0.6b", modelId);
}
[Fact]
public void Get_IOption_Test()
{
//Arrange准备阶段
var configBuilder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(_configName, false, true);
var config = configBuilder.Build();
var services = new ServiceCollection();
services
.AddOptions()
.Configure<OllamaServerOption>(config.GetRequiredSection("OllamaServer"));
//Act执行阶段
var o = services.BuildServiceProvider().GetRequiredService<IOptions<OllamaServerOption>>();
var ollamaServerOption = o.Value;
//Assert断言阶段
Assert.NotNull(ollamaServerOption);
Assert.Equal("http://localhost:11434", ollamaServerOption.OllamaServerUrl);
Assert.Equal("qwen3:0.6b", ollamaServerOption.Model);
}
[Fact]
public void Get_IOptionsSnapshot_Test()
{
//Arrange准备阶段
var configBuilder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(_configName, false, true);
var config = configBuilder.Build();
var services = new ServiceCollection();
services
.AddOptions()
.Configure<OllamaServerOption>(config.GetRequiredSection("OllamaServer"));
//Act执行阶段
var o = services.BuildServiceProvider().GetRequiredService<IOptionsSnapshot<OllamaServerOption>>();
var ollamaServerOption = o.Value;
//Assert断言阶段
Assert.NotNull(ollamaServerOption);
Assert.Equal("http://localhost:11434", ollamaServerOption.OllamaServerUrl);
Assert.Equal("qwen3:0.6b", ollamaServerOption.Model);
}
[Fact]
public void Get_IOptionsMonitor_Test()
{
//Arrange准备阶段
var configBuilder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(_configName,false,true);
var config = configBuilder.Build();
var services = new ServiceCollection();
services
.AddOptions()
.Configure<OllamaServerOption>(config.GetRequiredSection("OllamaServer"));
//Act执行阶段
var provider = services.BuildServiceProvider();
var optionMonitor = provider.GetRequiredService<IOptionsMonitor<OllamaServerOption>>();
var ollamaServerOption = optionMonitor.CurrentValue;
//Assert断言阶段
Assert.NotNull(ollamaServerOption);
Assert.Equal("http://localhost:11434", ollamaServerOption.OllamaServerUrl);
Assert.Equal("qwen3:0.6b", ollamaServerOption.Model);
//修改配置文件后,再次获取值,否会更新?
ChangeConfig();
ollamaServerOption = optionMonitor.CurrentValue;
//Assert断言阶段
Assert.Equal("http://localhost:11434", ollamaServerOption.OllamaServerUrl);
Assert.NotEqual("qwen3:0.6b", ollamaServerOption.Model);
ResetConfig();
}
[Fact]
public void Get_IOptionsMonitorCache_Test()
{
//Arrange准备阶段
var configBuilder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(_configName, false, true);
var config = configBuilder.Build();
var services = new ServiceCollection();
services
.AddOptions()
.Configure<OllamaServerOption>(config.GetRequiredSection("OllamaServer"));
//Act执行阶段
var o = services.BuildServiceProvider().GetRequiredService<IOptionsMonitorCache<OllamaServerOption>>();
var ollamaServerOption = o.GetOrAdd(Options.DefaultName, ()=>new OllamaServerOption());
//Assert断言阶段
Assert.NotNull(ollamaServerOption);
Assert.Equal("http://localhost:11434", ollamaServerOption.OllamaServerUrl);
Assert.Equal("qwen3:0.6b", ollamaServerOption.Model);
}
//改变配置文件
private void ChangeConfig()
{
ConfigBox? configBox = new ConfigBox();
var filePath = Path.Combine(Directory.GetCurrentDirectory(), _configName);
using (var file = System.IO.File.OpenText(filePath))
{
var configText = file.ReadToEnd();
configBox = System.Text.Json.JsonSerializer.Deserialize<ConfigBox>(configText);
//保存默认配置
this._defaultConfigText = configText;
}
if (configBox == null || configBox.OllamaServer == null)
{
return;
}
//修改内容
configBox.OllamaServer.Model = Guid.NewGuid().ToString() + "_Model";
System.Text.Json.JsonSerializerOptions serializerOptions = new System.Text.Json.JsonSerializerOptions()
{
WriteIndented = true,
};
var newConfigText = System.Text.Json.JsonSerializer.Serialize(configBox, serializerOptions);
File.WriteAllText(filePath, newConfigText);
//暂停几秒,让配置文件生效
Thread.Sleep(3000);
}
/// <summary>
/// 恢复配置文件
/// </summary>
private void ResetConfig()
{
var filePath = Path.Combine(Directory.GetCurrentDirectory(), _configName);
File.WriteAllText(filePath, this._defaultConfigText);
}
private class ConfigBox
{
public OllamaServerOption? OllamaServer{ get; set; }
}
}