UI/logic updates, tests added, backend updated

This commit is contained in:
2026-03-18 06:46:45 +00:00
parent b80d2a7379
commit 251e3c5821
27 changed files with 2113 additions and 1142 deletions

View File

@@ -0,0 +1,70 @@
using Moq;
using Xunit;
using FluentAssertions;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Http;
using Seasoned.Backend.Services;
using Seasoned.Backend.DTOs;
using System.Text;
namespace Seasoned.Tests;
public class RecipeServiceTests
{
private readonly Mock<IConfiguration> _mockConfig;
private readonly RecipeService _service;
public RecipeServiceTests()
{
_mockConfig = new Mock<IConfiguration>();
// Mock the API Key retrieval
_mockConfig.Setup(c => c["GEMINI_API_KEY"]).Returns("fake-api-key-123");
_service = new RecipeService(_mockConfig.Object);
}
[Fact]
public void Constructor_ThrowsException_WhenApiKeyIsMissing()
{
// Arrange
var emptyConfig = new Mock<IConfiguration>();
emptyConfig.Setup(c => c["GEMINI_API_KEY"]).Returns((string?)null);
// Act
Action act = () => new RecipeService(emptyConfig.Object);
// Assert
act.Should().Throw<ArgumentNullException>().WithMessage("*API Key missing*");
}
[Fact]
public async Task ParseRecipeImageAsync_ReturnsError_WhenImageIsEmpty()
{
// Arrange: Create an empty file
var fileMock = new Mock<IFormFile>();
fileMock.Setup(f => f.Length).Returns(0);
// Act & Assert
var result = await _service.ParseRecipeImageAsync(fileMock.Object);
result.Should().NotBeNull();
}
[Fact]
public void ParseRecipeImageAsync_AttachesCorrectBase64Header()
{
// Arrange
var content = "fake-image-data";
var fileName = "test.png";
var ms = new MemoryStream(Encoding.UTF8.GetBytes(content));
var mockFile = new FormFile(ms, 0, ms.Length, "image", fileName)
{
Headers = new HeaderDictionary(),
ContentType = "image/png"
};
var resultImageUrl = $"data:{mockFile.ContentType};base64,{Convert.ToBase64String(ms.ToArray())}";
resultImageUrl.Should().StartWith("data:image/png;base64,");
}
}