using Api.SeaHavenIndustries.Controllers; using Data.SeaHavenIndustries; using FluentAssertions; using Microsoft.AspNetCore.Mvc; using Moq; using SeaHaven.Services.DTOs; using SeaHaven.Services.Interfaces; using Xunit; namespace Api.SeaHavenIndustries.Tests; public class DispatchControllerTests { private static DispatchController NewController(Mock service) => new(service.Object); private static object Prop(object source, string name) => source.GetType().GetProperty(name)!.GetValue(source)!; [Fact] public async Task List_ReturnsDataResponseWithPaginationShape() { var service = new Mock(); service.Setup(s => s.GetDispatchListAsync("a", null, null, null, null, "dispatchedAt", "desc", 1, 25, It.IsAny())) .ReturnsAsync(new DispatchListResultDTO { Total = 2, Page = 1, PageSize = 25, Items = new List { new() { Id = 1, DispatchNumber = "D1" }, new() { Id = 2, DispatchNumber = "D2" } } }); var result = await NewController(service).List("a", null, null, null, null, "dispatchedAt", "desc", 1, 25, CancellationToken.None); var ok = result.Should().BeOfType().Subject; var response = ok.Value.Should().BeOfType().Subject; response.Status.Should().Be("Success"); object data = response.Data!; Prop(data, "total").Should().Be(2); Prop(data, "page").Should().Be(1); Prop(data, "pageSize").Should().Be(25); ((System.Collections.IEnumerable)Prop(data, "items")).Cast().Count().Should().Be(2); } [Fact] public async Task GetById_WhenMissing_ReturnsNotFound() { var service = new Mock(); service.Setup(s => s.GetDispatchDetailAsync(99, It.IsAny())) .ReturnsAsync((DispatchDetailResultDTO?)null); var result = await NewController(service).GetById(99, CancellationToken.None); var notFound = result.Should().BeOfType().Subject; notFound.Value.Should().BeOfType().Subject.Message.Should().Be("Dispatch not found"); } [Fact] public async Task GetById_WhenFound_ReturnsDetailAsData() { var service = new Mock(); var detail = new DispatchDetailResultDTO { Id = 5, DispatchNumber = "D5", Status = "Pending" }; service.Setup(s => s.GetDispatchDetailAsync(5, It.IsAny())) .ReturnsAsync(detail); var result = await NewController(service).GetById(5, CancellationToken.None); var ok = result.Should().BeOfType().Subject; var response = ok.Value.Should().BeOfType().Subject; response.Status.Should().Be("Success"); ((object?)response.Data).Should().BeSameAs(detail); } }