diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 10b6f03..3075303 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -21,7 +21,8 @@ "ms-dotnettools.csharp", "patcx.vscode-nuget-gallery", "mhutchie.git-graph", - "fernandoescolar.vscode-solution-explorer" + "fernandoescolar.vscode-solution-explorer", + "formulahendry.dotnet-test-explorer" ] } } diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..cf3a569 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "editor.formatOnType": true +} \ No newline at end of file diff --git a/ShoppingAssistantApi.UnitTests/GlobalUsings.cs b/ShoppingAssistantApi.UnitTests/GlobalUsings.cs new file mode 100644 index 0000000..8c927eb --- /dev/null +++ b/ShoppingAssistantApi.UnitTests/GlobalUsings.cs @@ -0,0 +1 @@ +global using Xunit; \ No newline at end of file diff --git a/ShoppingAssistantApi.UnitTests/OpenAiServiceTests.cs b/ShoppingAssistantApi.UnitTests/OpenAiServiceTests.cs new file mode 100644 index 0000000..7ec9de8 --- /dev/null +++ b/ShoppingAssistantApi.UnitTests/OpenAiServiceTests.cs @@ -0,0 +1,86 @@ +using System.Net; +using Moq; +using Moq.Protected; +using ShoppingAssistantApi.Application.IServices; +using ShoppingAssistantApi.Application.Models.OpenAi; +using ShoppingAssistantApi.Domain.Enums; +using ShoppingAssistantApi.Infrastructure.Services; + +namespace ShoppingAssistantApi.UnitTests; + +public class OpenAiServiceTests +{ + private readonly IOpenAiService _openAiService; + + private readonly Mock _mockHttpMessageHandler; + + private readonly HttpClient _httpClient; + + public OpenAiServiceTests() + { + // Mock any dependencies + _mockHttpMessageHandler = new Mock(); + _httpClient = new HttpClient(_mockHttpMessageHandler.Object); + _openAiService = new OpenAiService(_httpClient); + } + + [Fact] + public async Task GetChatCompletion_ValidChat_ReturnsNewMessage() + { + // Arrange + _mockHttpMessageHandler + .Protected() + .Setup>( + "SendAsync", + ItExpr.IsAny(), + ItExpr.IsAny() + ) + .ReturnsAsync(new HttpResponseMessage + { + StatusCode = HttpStatusCode.OK, + Content = new StringContent(@" + { + ""id"": ""chatcmpl-89OMdgTZXOLAXv7bPUJ4SwrPpS5Md"", + ""object"": ""chat.completion"", + ""created"": 1697249299, + ""model"": ""gpt-3.5-turbo-0613"", + ""choices"": [ + { + ""index"": 0, + ""message"": { + ""role"": ""assistant"", + ""content"": ""Hello World!"" + }, + ""finish_reason"": ""stop"" + } + ], + ""usage"": { + ""prompt_tokens"": 10, + ""completion_tokens"": 3, + ""total_tokens"": 13 + } + }"), + }); + + var chat = new ChatCompletionRequest + { + Messages = new List + { + new OpenAiMessage + { + Role = OpenAiRole.User, + Content = "Return Hello World!" + } + } + }; + + // Act + var newMessage = await _openAiService.GetChatCompletion(chat, CancellationToken.None); + + // Assert + Assert.NotNull(newMessage); + Assert.Equal("Hello, World!", newMessage.Content); + } + + // TODO: Add more tests +} \ No newline at end of file diff --git a/ShoppingAssistantApi.UnitTests/ShoppingAssistantApi.UnitTests.csproj b/ShoppingAssistantApi.UnitTests/ShoppingAssistantApi.UnitTests.csproj new file mode 100644 index 0000000..9274a65 --- /dev/null +++ b/ShoppingAssistantApi.UnitTests/ShoppingAssistantApi.UnitTests.csproj @@ -0,0 +1,31 @@ + + + + net7.0 + enable + enable + + false + true + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + diff --git a/ShoppingAssistantApi.sln b/ShoppingAssistantApi.sln index fb54417..f2f2788 100644 --- a/ShoppingAssistantApi.sln +++ b/ShoppingAssistantApi.sln @@ -15,6 +15,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ShoppingAssistantApi.Api", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShoppingAssistantApi.Tests", "ShoppingAssistantApi.Tests\ShoppingAssistantApi.Tests.csproj", "{297B5378-79D7-406C-80A5-151C6B3EA147}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShoppingAssistantApi.UnitTests", "ShoppingAssistantApi.UnitTests\ShoppingAssistantApi.UnitTests.csproj", "{B4EFE8F1-89F5-44E4-BD0A-4F63D09C8E6F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -45,6 +47,10 @@ Global {297B5378-79D7-406C-80A5-151C6B3EA147}.Debug|Any CPU.Build.0 = Debug|Any CPU {297B5378-79D7-406C-80A5-151C6B3EA147}.Release|Any CPU.ActiveCfg = Release|Any CPU {297B5378-79D7-406C-80A5-151C6B3EA147}.Release|Any CPU.Build.0 = Release|Any CPU + {B4EFE8F1-89F5-44E4-BD0A-4F63D09C8E6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B4EFE8F1-89F5-44E4-BD0A-4F63D09C8E6F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B4EFE8F1-89F5-44E4-BD0A-4F63D09C8E6F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B4EFE8F1-89F5-44E4-BD0A-4F63D09C8E6F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE