furniture-service/tests/Furniture.Service.Application.UnitTests/GetFurnitureAvailabilityUseCaseTests.cs
2026-02-24 05:26:54 -06:00

85 lines
3.3 KiB
C#

using BuildingBlock.Catalog.Contracts.Conventions;
using BuildingBlock.Catalog.Contracts.Products;
using BuildingBlock.Catalog.Contracts.Responses;
using BuildingBlock.Inventory.Contracts.Conventions;
using BuildingBlock.Inventory.Contracts.Requests;
using BuildingBlock.Inventory.Contracts.Responses;
using Furniture.Service.Application.Ports;
using Furniture.Service.Application.UseCases;
using Furniture.Service.Contracts.UseCases;
using Furniture.Domain.Contracts;
using Furniture.Domain.Decisions;
namespace Furniture.Service.Application.UnitTests;
public class GetFurnitureAvailabilityUseCaseTests
{
[Fact]
public async Task HandleAsync_WhenCalled_DelegatesToReadPort()
{
var decisionService = new FakeFurnitureAvailabilityDecisionService();
var catalogPort = new FakeCatalogProductReadPort();
var inventoryPort = new FakeFurnitureAvailabilityReadPort();
var useCase = new GetFurnitureAvailabilityUseCase(decisionService, catalogPort, inventoryPort);
var response = await useCase.HandleAsync(new GetFurnitureAvailabilityRequest("FUR-001", "corr-123"));
Assert.Equal("FUR-001", response.FurnitureId);
Assert.Equal("Chair", response.DisplayName);
Assert.Equal(10, response.QuantityAvailable);
}
private sealed class FakeFurnitureAvailabilityDecisionService : IFurnitureAvailabilityDecisionService
{
public ProductContract BuildCatalogRequest(FurnitureAvailabilityDecisionRequest request)
{
return new ProductContract(
new CatalogContractEnvelope("1.0.0", request.CorrelationId),
request.FurnitureId,
string.Empty);
}
public InventoryItemLookupRequest BuildInventoryRequest(FurnitureAvailabilityDecisionRequest request)
{
return new InventoryItemLookupRequest(
new InventoryContractEnvelope("1.0.0", request.CorrelationId),
request.FurnitureId);
}
public FurnitureAvailabilityDecisionResponse ComposeResponse(
FurnitureAvailabilityDecisionRequest request,
ProductContractResponse catalogResponse,
InventoryItemLookupResponse inventoryResponse)
{
return new FurnitureAvailabilityDecisionResponse(
request.FurnitureId,
catalogResponse.DisplayName,
inventoryResponse.QuantityAvailable);
}
}
private sealed class FakeCatalogProductReadPort : ICatalogProductReadPort
{
public Task<ProductContractResponse> ReadProductAsync(ProductContract request)
{
return Task.FromResult(
new ProductContractResponse(
new CatalogContractEnvelope("1.0.0", request.Envelope.CorrelationId),
request.ProductId,
"Chair"));
}
}
private sealed class FakeFurnitureAvailabilityReadPort : IFurnitureAvailabilityReadPort
{
public Task<InventoryItemLookupResponse> ReadAvailabilityAsync(InventoryItemLookupRequest request)
{
return Task.FromResult(
new InventoryItemLookupResponse(
new InventoryContractEnvelope("1.0.0", request.Envelope.CorrelationId),
request.ItemCode,
10));
}
}
}