using System.Security.Claims; using Api.SeaHavenIndustries.Controllers; using FluentAssertions; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Moq; using SeaHaven.Services.DTOs; using SeaHaven.Services.Interfaces; using Xunit; namespace Api.SeaHavenIndustries.Tests; public class DashboardControllerTests { private static object Prop(object source, string name) => source.GetType().GetProperty(name)!.GetValue(source)!; private static DashboardController NewController(Mock service) => new(service.Object) { ControllerContext = new ControllerContext { HttpContext = new DefaultHttpContext() } }; // Guards the Stats wire object, not the service DTO. GetKpiCountsAsync and // DashboardStatsDTO already carried these three counts; the regression this // pins is the controller's anonymous response silently dropping them, which // is what left the tiles with nothing to read. [Fact] public async Task GetStats_SerialisesKpiCountsOnWireObject() { var service = new Mock(); service.Setup(s => s.GetStatsAsync( It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(new DashboardStatsDTO { ScheduledTomorrow = 3, PendingUplifts = 5, AvetaPending = 7, Unassigned = 11 }); var result = await NewController(service).GetStats( new DashboardStatsQueryDTO(), CancellationToken.None); var body = result.Should().BeOfType().Subject.Value!; ((int)Prop(body, "scheduledTomorrow")).Should().Be(3); ((int)Prop(body, "pendingUplifts")).Should().Be(5); ((int)Prop(body, "avetaPending")).Should().Be(7); ((int)Prop(body, "unassigned")).Should().Be(11); } }