diff --git a/.gitignore b/.gitignore index cbd84e36..bba0bd1b 100644 --- a/.gitignore +++ b/.gitignore @@ -483,12 +483,16 @@ $RECYCLE.BIN/ # Vim temporary swap files *.swp +# Project-specific *.bak *.org appsettings.Development.json appsettings.Production.json +# Live Unit Testing +*.lutconfig + # azd .azure diff --git a/src/AzureOpenAIProxy.ApiApp/Builders/OpenAISettingsBuilder.cs b/src/AzureOpenAIProxy.ApiApp/Builders/OpenAISettingsBuilder.cs new file mode 100644 index 00000000..42597707 --- /dev/null +++ b/src/AzureOpenAIProxy.ApiApp/Builders/OpenAISettingsBuilder.cs @@ -0,0 +1,43 @@ +using AzureOpenAIProxy.ApiApp.Configurations; + +namespace AzureOpenAIProxy.ApiApp.Builders; + +/// +/// This provides interface to the class. +/// +public interface IOpenAISettingsBuilder +{ + /// + /// Sets the list of instances. + /// + /// List of instances. + void SetOpenAIInstances(IEnumerable? instances); + + /// + /// Builds the instance. + /// + /// Returns the instance. + OpenAISettings Build(); +} + +/// +/// This represents the builder entity for class. +/// +public class OpenAISettingsBuilder : IOpenAISettingsBuilder +{ + private IEnumerable? _instances; + + /// + public void SetOpenAIInstances(IEnumerable? instances) + { + this._instances = instances; + } + + /// + public OpenAISettings Build() + { + var settings = new OpenAISettings() { Instances = (this._instances ?? []).ToList() }; + + return settings; + } +} diff --git a/src/AzureOpenAIProxy.ApiApp/Extensions/ServiceCollectionExtensions.cs b/src/AzureOpenAIProxy.ApiApp/Extensions/ServiceCollectionExtensions.cs index 4afb057e..de22edeb 100644 --- a/src/AzureOpenAIProxy.ApiApp/Extensions/ServiceCollectionExtensions.cs +++ b/src/AzureOpenAIProxy.ApiApp/Extensions/ServiceCollectionExtensions.cs @@ -16,10 +16,15 @@ public static class ServiceCollectionExtensions /// /// instance. /// Returns instance. - public static IServiceCollection AddOpenAISettingsFromAppSettings(this IServiceCollection services) + public static IServiceCollection AddOpenAISettings(this IServiceCollection services) { services.AddSingleton(sp => { + //var settings = new OpenAISettingsBuilder() + // .WithAppSettings(sp) + // .WithKeyVault(sp) + // .Build(); + var configuration = sp.GetService() ?? throw new InvalidOperationException($"{nameof(IConfiguration)} service is not registered."); @@ -39,7 +44,7 @@ public static IServiceCollection AddOpenAISettingsFromAppSettings(this IServiceC /// Returns instance. public static IServiceCollection AddOpenAIService(this IServiceCollection services) { - services.AddOpenAISettingsFromAppSettings(); + services.AddOpenAISettings(); services.AddHttpClient(); return services; diff --git a/test/AzureOpenAIProxy.ApiApp.Tests/Builders/OpenAISettingsBuilderTests.cs b/test/AzureOpenAIProxy.ApiApp.Tests/Builders/OpenAISettingsBuilderTests.cs new file mode 100644 index 00000000..bf5e8785 --- /dev/null +++ b/test/AzureOpenAIProxy.ApiApp.Tests/Builders/OpenAISettingsBuilderTests.cs @@ -0,0 +1,70 @@ +using AzureOpenAIProxy.ApiApp.Builders; +using AzureOpenAIProxy.ApiApp.Configurations; + +using FluentAssertions; + +namespace AzureOpenAIProxy.ApiApp.Tests.Builders; + +public class OpenAISettingsBuilderTests +{ + [Fact] + public void Given_OpenAISettingsBuilder_When_Invoked_Build_Then_It_Should_Return_Instance() + { + // Arrange + var builder = new OpenAISettingsBuilder(); + + // Act + var result = builder.Build(); + + // Assert + result.Should().NotBeNull() + .And.BeOfType(); + } + + [Fact] + public void Given_OpenAISettingsBuilder_When_Invoked_Build_Then_It_Should_Return_Empty() + { + // Arrange + var builder = new OpenAISettingsBuilder(); + + // Act + var result = builder.Build(); + + // Assert + result.Instances.Should().NotBeNull() + .And.BeEmpty(); + } + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(10)] + public void Given_OpenAISettingsBuilder_When_Invoked_SetOpenAIInstances_Then_It_Should_Set_Instances(int count) + { + // Arrange + var builder = new OpenAISettingsBuilder(); + var instances = Enumerable.Range(0, count).Select(p => new OpenAIInstanceSettings()).ToList(); + + // Act + builder.SetOpenAIInstances(instances); + var result = builder.Build(); + + // Assert + result.Instances.Should().HaveCount(count); + } + + [Fact] + public void Given_OpenAISettingsBuilder_When_Invoked_SetOpenAIInstances_Then_It_Should_Return_Empty() + { + // Arrange + var builder = new OpenAISettingsBuilder(); + + // Act + builder.SetOpenAIInstances(null); + var result = builder.Build(); + + // Assert + result.Instances.Should().NotBeNull() + .And.BeEmpty(); + } +} \ No newline at end of file