mirror of
https://github.com/Sea-Haven-Industries/shoc-backend.git
synced 2026-10-04 23:02:10 +00:00
test(dashboard): guard Stats wire object for KPI counts (SH-353)
The added service test asserts DashboardStatsDTO, which already carried ScheduledTomorrow, PendingUplifts and AvetaPending, so it does not guard the regression that was actually shipped: the DashboardController Stats anonymous response dropping those keys and leaving the tiles empty. Add DashboardControllerTests.GetStats_SerialisesKpiCountsOnWireObject, which drives the controller and asserts the three keys are present on the serialised wire object, so re-dropping any of them fails a test. Also reword the pending-uplifts comment in DashboardServiceTests: the Pending-only-vs-ChangesRequested exclusion is the behaviour the code ships today, an open product call, not a settled review decision.
This commit is contained in:
parent
104439c239
commit
93ecbbd410
2 changed files with 58 additions and 2 deletions
54
Api.SeaHavenIndustries.Tests/DashboardControllerTests.cs
Normal file
54
Api.SeaHavenIndustries.Tests/DashboardControllerTests.cs
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
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<IDashboardService> 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<IDashboardService>();
|
||||||
|
service.Setup(s => s.GetStatsAsync(
|
||||||
|
It.IsAny<ClaimsPrincipal>(),
|
||||||
|
It.IsAny<DashboardStatsQueryDTO>(),
|
||||||
|
It.IsAny<CancellationToken>()))
|
||||||
|
.ReturnsAsync(new DashboardStatsDTO
|
||||||
|
{
|
||||||
|
ScheduledTomorrow = 3,
|
||||||
|
PendingUplifts = 5,
|
||||||
|
AvetaPending = 7
|
||||||
|
});
|
||||||
|
|
||||||
|
var result = await NewController(service).GetStats(
|
||||||
|
new DashboardStatsQueryDTO(), CancellationToken.None);
|
||||||
|
|
||||||
|
var body = result.Should().BeOfType<OkObjectResult>().Subject.Value!;
|
||||||
|
((int)Prop(body, "scheduledTomorrow")).Should().Be(3);
|
||||||
|
((int)Prop(body, "pendingUplifts")).Should().Be(5);
|
||||||
|
((int)Prop(body, "avetaPending")).Should().Be(7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -131,8 +131,10 @@ public class DashboardServiceTests
|
||||||
ctx.SaveChanges();
|
ctx.SaveChanges();
|
||||||
|
|
||||||
// Pending-uplifts tile: only Status == "Pending" is an outstanding uplift
|
// Pending-uplifts tile: only Status == "Pending" is an outstanding uplift
|
||||||
// awaiting an approval decision. A "ChangesRequested" request has been sent
|
// awaiting an approval decision. This test pins the behaviour the code
|
||||||
// back to the vendor and must NOT be counted (SH-353 review decision).
|
// ships today: a "ChangesRequested" request has been sent back to the
|
||||||
|
// vendor, so it is NOT counted. Whether pendingUplifts should also include
|
||||||
|
// ChangesRequested is an open product call, not a settled review decision.
|
||||||
ctx.Set<DispatchUpliftRequest>().AddRange(
|
ctx.Set<DispatchUpliftRequest>().AddRange(
|
||||||
new DispatchUpliftRequest { DispatchId = dispatch.Id, Status = "Pending", IsDeleted = false },
|
new DispatchUpliftRequest { DispatchId = dispatch.Id, Status = "Pending", IsDeleted = false },
|
||||||
new DispatchUpliftRequest { DispatchId = dispatch.Id, Status = "ChangesRequested", IsDeleted = false });
|
new DispatchUpliftRequest { DispatchId = dispatch.Id, Status = "ChangesRequested", IsDeleted = false });
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue