85 lines
3.3 KiB
C#
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));
|
|
}
|
|
}
|
|
}
|